From bd869dab56f883fadba17e88212a3921dc9987fb Mon Sep 17 00:00:00 2001 From: Julia Signell Date: Mon, 27 Jan 2025 15:19:14 -0500 Subject: [PATCH 1/2] Make sure that VersionRange has VersionIDs rather than strings --- pystac/serialization/identify.py | 38 +++++++++++++++++++++++----- tests/extensions/test_eo.py | 15 +++++++++++ tests/serialization/test_identify.py | 14 ++++++++++ 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/pystac/serialization/identify.py b/pystac/serialization/identify.py index 0381e2459..719b08bc0 100644 --- a/pystac/serialization/identify.py +++ b/pystac/serialization/identify.py @@ -82,8 +82,8 @@ def __lt__(self, other: object) -> bool: class STACVersionRange: """Defines a range of STAC versions.""" - min_version: STACVersionID - max_version: STACVersionID + _min_version: STACVersionID + _max_version: STACVersionID def __init__( self, @@ -103,21 +103,45 @@ def __init__( else: self.max_version = max_version - def set_min(self, v: STACVersionID) -> None: + @property + def min_version(self) -> STACVersionID: + return self._min_version + + @min_version.setter + def min_version(self, v: str | STACVersionID) -> None: + if isinstance(v, str): + v = STACVersionID(v) + self._min_version = v + + @property + def max_version(self) -> STACVersionID: + return self._max_version + + @max_version.setter + def max_version(self, v: str | STACVersionID) -> None: + if isinstance(v, str): + v = STACVersionID(v) + self._max_version = v + + def set_min(self, v: str | STACVersionID) -> None: + if isinstance(v, str): + v = STACVersionID(v) if self.min_version < v: if v < self.max_version: self.min_version = v else: self.min_version = self.max_version - def set_max(self, v: STACVersionID) -> None: + def set_max(self, v: str | STACVersionID) -> None: + if isinstance(v, str): + v = STACVersionID(v) if v < self.max_version: if self.min_version < v: self.max_version = v else: self.max_version = self.min_version - def set_to_single(self, v: STACVersionID) -> None: + def set_to_single(self, v: str | STACVersionID) -> None: self.set_min(v) self.set_max(v) @@ -263,12 +287,12 @@ def identify_stac_object(json_dict: dict[str, Any]) -> STACJSONDescription: stac_extensions = json_dict.get("stac_extensions", None) if stac_version is None: - version_range.set_min(STACVersionID("0.8.0")) + version_range.set_min("0.8.0") else: version_range.set_to_single(stac_version) if stac_extensions is not None: - version_range.set_min(STACVersionID("0.8.0")) + version_range.set_min("0.8.0") if stac_extensions is None: stac_extensions = [] diff --git a/tests/extensions/test_eo.py b/tests/extensions/test_eo.py index fca2224b7..6b17fa118 100644 --- a/tests/extensions/test_eo.py +++ b/tests/extensions/test_eo.py @@ -516,3 +516,18 @@ def test_required_property_missing(ext_item: pystac.Item) -> None: assert bands is not None with pytest.raises(RequiredPropertyMissing): bands[0].name + + +def test_unnecessary_migrations_not_performed(ext_item: Item) -> None: + item_as_dict = ext_item.to_dict(include_self_link=False, transform_hrefs=False) + item_as_dict["stac_version"] = "1.0.0" + item_as_dict["properties"]["eo:bands"] = [{"name": "B1", "common_name": "coastal"}] + + item = Item.from_dict(item_as_dict) + + migrated_item = pystac.Item.from_dict(item_as_dict, migrate=True) + + assert item.properties == migrated_item.properties + assert len(item.assets) == len(migrated_item.assets) + for key, value in item.assets.items(): + assert value.to_dict() == migrated_item.assets[key].to_dict() diff --git a/tests/serialization/test_identify.py b/tests/serialization/test_identify.py index 980c26aad..9882bebaf 100644 --- a/tests/serialization/test_identify.py +++ b/tests/serialization/test_identify.py @@ -118,3 +118,17 @@ def test_version_range_ordering(self) -> None: version_range = STACVersionRange(min_version="0.6.0-rc1", max_version="0.9.0") self.assertTrue(version_range.contains("0.9.0")) + + def test_version_range_set_to_single(self) -> None: + version_range = STACVersionRange() + version_range.set_min("1.0.0-beta.1") + version_range.set_to_single("1.0.0") + + self.assertTrue(version_range.contains("1.0.0")) + + def test_version_range_set_min_and_max_directly(self) -> None: + version_range = STACVersionRange() + version_range.min_version = "1.0.0-beta.1" # type:ignore + version_range.max_version = "1.1.0" # type:ignore + + self.assertTrue(version_range.contains("1.0.0")) From 2a762d8031c1c406382abb55a56c8d0dddc39fd9 Mon Sep 17 00:00:00 2001 From: Julia Signell Date: Mon, 27 Jan 2025 15:22:37 -0500 Subject: [PATCH 2/2] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a99976e45..8c6b825a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Make sure that `VersionRange` has `VersionID`s rather than strings ([#1512](https://github.com/stac-utils/pystac/pull/1512)) + ## [v1.12.1] ### Changed