Skip to content

Commit 4a3dff6

Browse files
committed
CubeMetadata: avoid in-place manipulation patterns
1 parent 2ecd159 commit 4a3dff6

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed

openeo/metadata.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -365,22 +365,20 @@ def rename_labels(self, dimension: str, target: list, source: list = None) -> Cu
365365
:return: Updated metadata
366366
"""
367367
self.assert_valid_dimension(dimension)
368-
loc = self.dimension_names().index(dimension)
369-
new_dimensions = self._dimensions.copy()
370-
new_dimensions[loc] = new_dimensions[loc].rename_labels(target, source)
371-
372-
return self._clone_and_update(dimensions=new_dimensions)
368+
return self._clone_and_update(
369+
dimensions=[
370+
d.rename_labels(target=target, source=source) if d.name == dimension else d for d in self._dimensions
371+
]
372+
)
373373

374374
def rename_dimension(self, source: str, target: str) -> CubeMetadata:
375375
"""
376376
Rename source dimension into target, preserving other properties
377377
"""
378378
self.assert_valid_dimension(source)
379-
loc = self.dimension_names().index(source)
380-
new_dimensions = self._dimensions.copy()
381-
new_dimensions[loc] = new_dimensions[loc].rename(target)
382-
383-
return self._clone_and_update(dimensions=new_dimensions)
379+
return self._clone_and_update(
380+
dimensions=[d.rename(name=target) if d.name == source else d for d in self._dimensions]
381+
)
384382

385383
def reduce_dimension(self, dimension_name: str) -> CubeMetadata:
386384
"""Create new CubeMetadata object by collapsing/reducing a dimension."""

tests/test_metadata.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,55 @@ def test_metadata_bands_dimension(spec):
577577
assert metadata.band_common_names == ["F00", None]
578578

579579

580+
def test_cubemetadata_rename_labels():
581+
metadata = CubeMetadata(
582+
dimensions=[
583+
SpatialDimension(name="x", extent=None),
584+
BandDimension(name="b", bands=[Band("red"), Band("green")]),
585+
]
586+
)
587+
renamed = metadata.rename_labels(dimension="b", target=["raspberry", "lime"])
588+
assert isinstance(renamed, CubeMetadata)
589+
assert renamed.dimension_names() == ["x", "b"]
590+
assert renamed.band_names == ["raspberry", "lime"]
591+
assert renamed.bands == [Band("raspberry"), Band("lime")]
592+
593+
594+
def test_cubemetadata_rename_labels_invalid_dimension():
595+
metadata = CubeMetadata(
596+
dimensions=[
597+
SpatialDimension(name="x", extent=None),
598+
BandDimension(name="b", bands=[Band("red"), Band("green")]),
599+
]
600+
)
601+
with pytest.raises(ValueError, match=re.escape("Invalid dimension 'tempus'. Should be one of ['x', 'b']")):
602+
_ = metadata.rename_labels(dimension="tempus", target=["1999"])
603+
604+
605+
def test_cubemetadata_rename_dimension():
606+
metadata = CubeMetadata(
607+
dimensions=[
608+
SpatialDimension(name="x", extent=None),
609+
BandDimension(name="b", bands=[Band("red"), Band("green")]),
610+
]
611+
)
612+
renamed = metadata.rename_dimension("b", "bands")
613+
assert renamed.dimension_names() == ["x", "bands"]
614+
assert renamed.band_dimension.name == "bands"
615+
assert renamed.band_names == ["red", "green"]
616+
617+
618+
def test_cubemetadata_rename_dimension_invalid_dimension():
619+
metadata = CubeMetadata(
620+
dimensions=[
621+
SpatialDimension(name="x", extent=None),
622+
BandDimension(name="b", bands=[Band("red"), Band("green")]),
623+
]
624+
)
625+
with pytest.raises(ValueError, match=re.escape("Invalid dimension 'bandzz'. Should be one of ['x', 'b']")):
626+
_ = metadata.rename_dimension("bandzz", "bands")
627+
628+
580629
def test_collectionmetadata_reduce_dimension():
581630
metadata = CollectionMetadata(
582631
{"cube:dimensions": {"x": {"type": "spatial"}, "b": {"type": "bands", "values": ["red", "green"]}}}

0 commit comments

Comments
 (0)