Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
ea536e6
Initial dataset wrappers.
pp-mo Oct 31, 2025
fe1e22d
Various notes, choices + changes: Beginnings of encoded-dataset testing.
pp-mo Dec 3, 2025
7baee94
Replace use of encoding functions with test-specific function: Test f…
pp-mo Dec 5, 2025
6d6c6fa
Radically simplify 'make_bytesarray', by using a known specified byte…
pp-mo Dec 5, 2025
4b17638
Add read tests.
pp-mo Dec 5, 2025
046183b
Remove iris width control (not in this layer).
pp-mo Dec 5, 2025
2002c2a
more notes
pp-mo Dec 5, 2025
959ac79
Initial tests.
pp-mo Oct 24, 2025
814932e
Get 'create_cf_data_variable' to call 'create_generic_cf_array_var': …
pp-mo Oct 25, 2025
24c299f
Reinstate decode on load, now in-Iris coded.
pp-mo Oct 28, 2025
29142dc
Revert and amend.
pp-mo Dec 7, 2025
1e10dc8
Hack to preserve the existing order of attributes on saved Coords and…
pp-mo Oct 29, 2025
d853a80
Fix for dataless; avoid FUTURE global state change from temporary tests.
pp-mo Oct 29, 2025
1bcfb19
Further fix to attribute ordering.
pp-mo Oct 29, 2025
ad4960e
Fixes for data packing.
pp-mo Oct 29, 2025
ca5872a
Latest test-chararrays.
pp-mo Dec 7, 2025
a8d022e
Fix search+replace error.
pp-mo Dec 7, 2025
13733c5
Tiny fix in crucial place! (merge error?).
pp-mo Jan 14, 2026
a41e84d
Extra mock property prevents weird test crashes.
pp-mo Jan 14, 2026
5bf4d18
Fix another mock problem.
pp-mo Jan 14, 2026
7023407
Use bytecoded_datasets in nc load+save, begin fixes.
pp-mo Jan 17, 2026
bbd9eee
Merge branch 'encoded_datasets' into chardata_plus_encodedarrays
pp-mo Jan 17, 2026
b3bbde2
Debug tests as run.
pp-mo Jan 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions lib/iris/fileformats/_nc_load_rules/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -708,13 +708,13 @@ def build_and_add_global_attributes(engine: Engine):
),
)
if problem is not None:
stack_notes = problem.stack_trace.__notes__
stack_notes = problem.stack_trace.__notes__ # type: ignore[attr-defined]
if stack_notes is None:
stack_notes = []
stack_notes.append(
f"Skipping disallowed global attribute '{attr_name}' (see above error)"
)
problem.stack_trace.__notes__ = stack_notes
problem.stack_trace.__notes__ = stack_notes # type: ignore[attr-defined]


################################################################################
Expand Down Expand Up @@ -1536,14 +1536,14 @@ def build_and_add_dimension_coordinate(
)
if problem is not None:
coord_var_name = str(cf_coord_var.cf_name)
stack_notes = problem.stack_trace.__notes__
stack_notes = problem.stack_trace.__notes__ # type: ignore[attr-defined]
if stack_notes is None:
stack_notes = []
stack_notes.append(
f"Failed to create {coord_var_name} dimension coordinate:\n"
f"Gracefully creating {coord_var_name!r} auxiliary coordinate instead."
)
problem.stack_trace.__notes__ = stack_notes
problem.stack_trace.__notes__ = stack_notes # type: ignore[attr-defined]
problem.handled = True

_ = _add_or_capture(
Expand Down Expand Up @@ -1643,9 +1643,13 @@ def _add_auxiliary_coordinate(

# Determine the name of the dimension/s shared between the CF-netCDF data variable
# and the coordinate being built.
common_dims = [
dim for dim in cf_coord_var.dimensions if dim in engine.cf_var.dimensions
]
coord_dims = cf_coord_var.dimensions
if cf._is_str_dtype(cf_coord_var):
coord_dims = coord_dims[:-1]
datavar_dims = engine.cf_var.dimensions
if cf._is_str_dtype(engine.cf_var):
datavar_dims = datavar_dims[:-1]
common_dims = [dim for dim in coord_dims if dim in datavar_dims]
data_dims = None
if common_dims:
# Calculate the offset of each common dimension.
Expand Down
26 changes: 20 additions & 6 deletions lib/iris/fileformats/cf.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

import iris.exceptions
import iris.fileformats._nc_load_rules.helpers as hh
from iris.fileformats.netcdf import _thread_safe_nc
from iris.fileformats.netcdf import _bytecoding_datasets
from iris.mesh.components import Connectivity
import iris.util
import iris.warnings
Expand Down Expand Up @@ -790,19 +790,31 @@ def cf_label_data(self, cf_data_var):

# Determine the name of the label string (or length) dimension by
# finding the dimension name that doesn't exist within the data dimensions.
str_dim_name = list(set(self.dimensions) - set(cf_data_var.dimensions))
str_dim_names = list(set(self.dimensions) - set(cf_data_var.dimensions))
n_nondata_dims = len(str_dim_names)

if n_nondata_dims == 0:
# *All* dims are shared with the data-variable.
# This is only ok if the data-var is *also* a string type.
dim_ok = _is_str_dtype(cf_data_var)
# In this case, we must just *assume* that the last dimension is "the"
# string dimension
str_dim_name = self.dimensions[-1]
else:
# If there is exactly one non-data dim, that is the one we want
dim_ok = len(str_dim_names) == 1
(str_dim_name,) = str_dim_names

if len(str_dim_name) != 1:
if not dim_ok:
raise ValueError(
"Invalid string dimensions for CF-netCDF label variable %r"
% self.cf_name
)

str_dim_name = str_dim_name[0]
label_data = self[:]

if ma.isMaskedArray(label_data):
label_data = label_data.filled()
label_data = label_data.filled(b"\0")

# Determine whether we have a string-valued scalar label
# i.e. a character variable that only has one dimension (the length of the string).
Expand Down Expand Up @@ -1361,7 +1373,9 @@ def __init__(self, file_source, warn=False, monotonic=False):
if isinstance(file_source, str):
# Create from filepath : open it + own it (=close when we die).
self._filename = os.path.expanduser(file_source)
self._dataset = _thread_safe_nc.DatasetWrapper(self._filename, mode="r")
self._dataset = _bytecoding_datasets.EncodedDataset(
self._filename, mode="r"
)
self._own_file = True
else:
# We have been passed an open dataset.
Expand Down
Loading
Loading