v3.16.0.dev74 (10 Jul 2026) [unreleased]#
This document explains the changes made to Iris for this release (View all changes.)
v3.16.0.dev74 Release Highlights
The highlights for this major/minor release of Iris include:
N/A
And finally, get in touch with us on GitHub if you have any issues or feature requests for improving Iris. Enjoy!
✨ Features#
#6799: @stephenworsley introduced the function
guess_2D_bounds()for guessing the bounds of pairs of 2D coordinates. ( #6097)#7146: @bjlittle extended the
cell()andcells()methods to allow users to specify that they wantdatetimecompatible objects returned within each generatedCellfrom a temporal coordinate. This is achieved by passing the keyword argumentpydate=True. ( #7112)#7185: @pt331 and @trexfeathers and @pp-mo improved
iris.mesh.components.MeshXY.coords()andcoord()to better detect theAXESof constituent coordinates. It previously depended onguess_coord_axis().#7185: @pt331 and @trexfeathers and @pp-mo allowed Iris’ Mesh Support, including saving, to handle coordinates without
standard_name. ( #4863)
🐛 Bugs Fixed#
#7119: @gaoflow fixed
iris.analysis.cartography.wrap_lons()so that it preserves the floating-point dtype of its input (e.g.float32) instead of always promoting the result tofloat64. Integer inputs are still returned asfloat64. ( #4119)#7120: @gaoflow fixed
iris.coords.Coord.cell()so that a masked bound is preserved as masked, instead of revealing the value stored underneath the mask. This also corrects the cube/coordinate printout for such bounds. ( #5158)#7121: @gaoflow made
iris.Constraintraise aTypeErrorwhen used in a boolean context (e.g. with theand/or/notkeywords) instead of silently discarding one of the constraints. Use the&operator to combine constraints. ( #4337)#7122: @gaoflow fixed coordinate summaries so that length-0 string and date-like coordinates print as empty arrays instead of raising
ValueError. ( #6531)#7124: @gaoflow fixed regridding so that horizontal coordinates of the result cube are copies of, rather than references to, the target grid’s coordinates. Previously, modifying a result coordinate also modified the target cube’s coordinate, and vice versa. ( #6844)
#7125: @gaoflow fixed
iris.cube.CubeList.concatenate()so that cubes with string coordinates of differing width, such as dtypes<U1and<U5, can be concatenated. The result coordinate is promoted to the wider dtype. ( #6676)#7126: @gaoflow fixed an error when computing (e.g. saving) a scalar lazy cube whose units had been converted with
convert_units(). The unit conversion could yield a plain Python scalar for the 0-dimensional block, which Dask was then unable to store. ( #6965)#7197: @trexfeathers and @kwilliams-mo fixed the saving of PP fields to now always write
lbftin hours in the no-bounds forecast period case, including whenforecast_perioduses non-hour units such as seconds.
🚀 Performance Enhancements#
#7089: @trexfeathers improved the speed of field iteration when reading PP files. Up to 3x speed up has been seen, dependending on the circumstances.
🔥 Deprecations#
#7102: @bjlittle deprecated the
iris.analysis.calculusmodule containing the following public functions:spatial_vectors_with_phenom_name()
Native
Cubecalculus functionality will not be replaced and is scheduled for removal inIris4.0.0. ( #6262)
🔗 Dependencies#
#7053: @trexfeathers and @tkknight removed the maximum pin for the PyData Sphinx Theme (used in the docs). ( #6885)
#7060: @tkknight added a minimum pin for the PyData Sphinx Theme as we use the collapse sidebar feature introduced in 0.17.0.
#7084: @tkknight updated a dependency in the Read The Docs configuration file to use the latest python.
#7100: @tkknight added a dependency named sphinx-sitemap to generate sitemap.xml for the documentation.
#7105: @tkknight added a dependency named sphinx-llm to generate summaries that LLMs can understand,
llms.txtandllms-full.txt.
📚 Documentation#
#7053: @trexfeathers and @tkknight made the docs compatible with the latest versions of PyData Sphinx Theme (>=0.16). ( #6885)
#7060: @tkknight enabled the theme option to collapse the sidebar. Note, it only appears once you click on a link away from the landing page. Also moved the search box to the top navigation bar.
#7072: @trexfeathers switched to using the official URL of the cf-checker, after our previous URL of choice was taken down.
#7079: @tkknight updated the voted table that uses datatables to not highlight the sorted column or row as is uses the incorrect theme color (light). Also updated the datatables version from 2.3.2 to 2.3.8.
#7096: @trexfeathers simplified the pull request checklist and moved it directly into the GitHub pull request template (read more here: Pull Request Checklist). Also updated several associated pages of more detailed guidance.
#7100: @tkknight updated the documentation to generate a sitemap.xml files for the stable version.
#7105: @tkknight updated the documentation to generate summaries that LLMs can understand,
llms.txtandllms-full.txt.#7118: @trexfeathers and @hdyson clarified that
iris.analysis.cartography.area_weights()requires 1-dimensional lat and lon coordinates on the inputCube.#7131: @bjlittle Added an explanation section for Temporal Coordinates.
#7150, #7157: @bjlittle and @trexfeathers Added the custom
sphinxreadingtimedirective to automatically estimate the audiance reading time of a page and render a branded banner in-situ.#7159: @bjlittle Updated the Temporal Coordinates section.
#7166: @bjlittle migrated to towncrier for changelog management.
#7175: @tkknight Added
AGENTS.mdfor AI-assisted development guidelines across the project root,docs/,changelog/andtests/directories.
💼 Internal#
#6976: @ESadek-MO and @pp-mo removed unit test reliance on all optional dependencies except for mo_pack. ( #6832)
#7036: @trexfeathers altered the messaging for ‘stale’ issues and pull requests, to reduce the negative connotations. We now use
needs-checkinfor the initial prompt, andnot-resourcedif the issue/PR ends up closed. ( #6993)#7046: @trexfeathers fixed the benchmarking
asv_delegated.pyto work with Nox release2026.04.10(which adds more files to the environment parent directory, breaking previous assumptions).#7087: @SgtVarmint migrated codebase from
os.pathtopathlib.Pathwhere possible. ( #4523)#7134: @HGWright changed the default of the private switch
_LAZY_DERIVED_LOADING(formerly.CONCRETE_DERIVED_LOADING) for controlling laziness of coordinates from pp loading, now the switch must be set to True for lazy loading to be enabled. Note: this object is temporary and is likely to be replaced by a permanent solution or else be renamed. ( #7094)#7138: @bjlittle and @trexfeathers added the Zizmor pre-commit hook to monitor for security vulnerabilities in Iris’ GitHub Actions workflows, and then actioned Zizmor’s recommendations to harden the workflows.
#7148, #7165: @trexfeathers set the link checking workflow to accept redirect HTTP codes, as the reports were getting too noisy.
#7185: @pt331 and @trexfeathers and @pp-mo improved type hints Type Hinting in
iris.common.metadataandiris.mesh.components#7187: @2319bli has removed assignments to class level variables used in
test_cell.py. ( #6625)#7188: @GitRylee moved duplicated code in
iris.tests.unit.analysis.trajectory.test__nearest_neighbour_indices_ndcoordsto a setup fixture. ( #6625)#7189: @king56180468-droid removed redundant commented codes from
test_CFReader. ( #6625)#7190: @2319bli has partially improved the names of various test classes. ( #6625)