v3.12 (24 Mar 2025)#

This document explains the changes made to Iris for this release (View all changes.)

v3.12 Release Highlights

The highlights for this minor release of Iris include:

Checkout the performance enhancements section for an array of improvements to the performance of Iris. Special thanks to the ESMValTool devs for these contributions.

And finally, get in touch with us on GitHub if you have any issues or feature requests for improving Iris. Enjoy!

v3.12.1 (30 Apr 2025)#

v3.12.1 Patches

The patches in this release of Iris include:

  1. Iris no longer supports the setup.py develop command, due to an incompatibility with the latest version of Setuptools. setup.py commands of this sort are deprecated, and the recommended replacement for develop has been pip install -e for several years now. See Running setuptools commands for more.

v3.12.2 (09 May 2025)#

v3.12.2 Patches

The patches in this release of Iris include:

  1. Iris is now compatible with Dask versions 2025.4.0 and above. We are aware that previous incompatibilities had been affecting load and save operations for many users.

📢 Announcements#

  1. N/A

✨ Features#

  1. @pp-mo renamed the iris.LoadPolicy as iris.CombineOptions and iris.LOAD_POLICY as iris.COMBINE_POLICY, though the original names remain functional (and refer to the same things) for now. (Issue #6203, PR #6334)

  2. @pp-mo added new combine() and combine_cube() methods of a CubeList as an alternative way of accessing the combine_cubes() mechanism. (Issue #6203, PR #6334)

  3. @pp-mo added a new utility function combine_cubes(), to give general public access to the combine merge/concatenate mechanism introduced for generalised loading support via iris.LoadPolicy in the Iris 3.11 release. (Issue #6203, PR #6334)

  4. @pp-mo overhauled the iris.LoadPolicy facility by adding a new equalise_cubes_kwarg keyword, enabling it to call the equalise_cubes() utility function as one of its processing stages. (Issue #6203, PR #6334)

  5. @pp-mo added a new utility function equalise_cubes(), to help with aligning cubes so they can merge / concatenate. (Issue #6248, PR #6257)

  6. @fnattino added the lazy median aggregator iris.analysis.MEDIAN based on the implementation discussed by @rcomer and @stefsmeets in Issue #4039 (PR #6167).

  7. @ESadek-MO made data optional in a Cube, when shape is provided. A dataless cube may be used as a target in regridding, or as a template cube to add data to at a later time.

    This is the first step in providing dataless cube support. Currently, most cube methods won’t work with a dataless cube and will raise an exception. However, transpose() will work, as will copy(). Note that, cube.copy(data=iris.DATALESS) will provide a dataless copy of a cube. (Issue #4447, PR #6253)

  8. @ESadek-MO added the iris.quickplot footer kwarg to render text in the bottom right of the plot figure. (Issue #6247, PR #6332)

  9. @trexfeathers and @pp-mo added iris.loading.LOAD_PROBLEMS to capture objects that could not be loaded correctly, increasing transparency and helping users to fix loading problems via the Iris API. As a first pass, this is currently limited to standard_name and dimension coordinates from NetCDF files. (Issue #6317, PR #6338)

🐛 Bugs Fixed#

  1. @rcomer added handling for string stash codes when saving pp files. (Issue #6239, PR #6289)

  2. @trexfeathers and @jrackham-mo added a check for dtype castability when saving NetCDF valid_range, valid_min and valid_max attributes - older NetCDF formats e.g. NETCDF4_CLASSIC support a maximum precision of 32-bit. (Issue #6178, PR #6343)

  3. @ukmo-ccbunney added support for loading NetCDF variable-length string types and size hinting for better lazy loading (Issue #6149, PR #6340)

  4. @bouweandela fixed handling of masked Dask arrays in array_equal().

  5. @trexfeathers removed the custom setup.py develop command, since Setuptools are deprecating develop; developers should instead use pip install -e .. See Running setuptools commands for more. (PR #6424)

💣 Incompatible Changes#

  1. iris.tests.IrisTest is being replaced by iris.tests._shared_utils. Once conversion from unittest to pytest is completed, iris.tests.IrisTest class will be deprecated.

  2. @trexfeathers and @pp-mo significantly changed Iris’ NetCDF loading warnings as part of the LOAD_PROBLEMS work. Several loading operations no longer raise their own warnings; instead their loading problems are captured in LOAD_PROBLEMS. When LOAD_PROBLEMS is populated, a single IrisLoadWarning is raised; see below. As a first pass, this changed behaviour is currently limited to standard_name and dimension coordinates from NetCDF files. (PR #6338)

    IrisLoadWarning: Not all file objects were parsed correctly. See iris.loading.LOAD_PROBLEMS for details.
    

🚀 Performance Enhancements#

  1. @bouweandela made loading Cubes from NetCDF files faster. (PR #6229 and PR #6252)

  2. @fnattino enabled lazy cube interpolation using the linear and nearest-neighbour interpolators (iris.analysis.Linear and iris.analysis.Nearest). Note that this implementation removes performance benefits linked to caching an interpolator object. While this does not break previously suggested code (instantiating and re-using an interpolator object remains possible), this is no longer an advertised feature. (PR #6084)

  3. @bouweandela made coordinate dimension lookups faster for derived coordinates. (PR #6337)

🔥 Deprecations#

  1. N/A

🔗 Dependencies#

  1. @stephenworsley dropped support for py310 and adopted support for py313 as per the SPEC 0 schedule. (PR #6195)

  2. @stephenworsley and @valeriupredoi removed the pin from dask since newer versions of dask fix the bug casuing the pin. Introduced a minimum pin (2025.1.0) to avoid this bug. (PR #6342)

  3. @trexfeathers refactored Iris loading and saving to make it compatible with Dask version 2025.4.0 and above. (PR #6451)

📚 Documentation#

  1. @ESadek-MO and @trexfeathers created Converting From unittest to pytest as a guide for converting from unittest to pytest. (PR #5785)

  2. @ESadek-MO and @trexfeathers created a style guide for pytest tests, and consolidated Test Categories and Testing Tools into Writing Tests. (Issue #5574, PR #5785)

  3. @jfrost-mo corrected unit to units in the docstring for iris.coords.AuxCoord. (Issue #6347, PR #6348)

💼 Internal#

  1. @ESadek-MO @pp-mo @bjlittle @trexfeathers and @HGWright have converted around a third of Iris’ unittest style tests to pytest. This is part of an ongoing effort to move from unittest to pytest. (PR #6207, part of Issue #6212)

  2. @trexfeathers, @ESadek-MO and @HGWright heavily re-worked Release Do-Nothing Script to be more thorough and apply lessons learned from recent releases. (PR #6062)

  3. @schlunma made lazy smart weights used for cube aggregations have the same chunks as their parent cube if broadcasting is necessary. (Issue #6285, PR #6288)

  4. @trexfeathers improved the handling of benchmark environments, especially when working across Python versions. (PR #6329)

  5. @trexfeathers temporarily pinned Sphinx to < 8.2. (PR #6344, Issue #6345)

  6. @bouweandela fixed a bug in the benchmarking code that caused all benchmarks to be run with lazy data. (PR #6339)