Skip to content

Commit 87a41b0

Browse files
jsignellkmodali
authored andcommitted
Make sure that VersionRange has VersionIDs rather than strings (stac-utils#1512)
* Make sure that VersionRange has VersionIDs rather than strings * Update changelog
1 parent 87c5385 commit 87a41b0

File tree

4 files changed

+64
-7
lines changed

4 files changed

+64
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [Unreleased]
44

5+
### Fixed
6+
7+
- Make sure that `VersionRange` has `VersionID`s rather than strings ([#1512](https://github.com/stac-utils/pystac/pull/1512))
8+
59
## [v1.12.1]
610

711
### Changed

pystac/serialization/identify.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ def __lt__(self, other: object) -> bool:
8383
class STACVersionRange:
8484
"""Defines a range of STAC versions."""
8585

86-
min_version: STACVersionID
87-
max_version: STACVersionID
86+
_min_version: STACVersionID
87+
_max_version: STACVersionID
8888

8989
def __init__(
9090
self,
@@ -104,21 +104,45 @@ def __init__(
104104
else:
105105
self.max_version = max_version
106106

107-
def set_min(self, v: STACVersionID) -> None:
107+
@property
108+
def min_version(self) -> STACVersionID:
109+
return self._min_version
110+
111+
@min_version.setter
112+
def min_version(self, v: str | STACVersionID) -> None:
113+
if isinstance(v, str):
114+
v = STACVersionID(v)
115+
self._min_version = v
116+
117+
@property
118+
def max_version(self) -> STACVersionID:
119+
return self._max_version
120+
121+
@max_version.setter
122+
def max_version(self, v: str | STACVersionID) -> None:
123+
if isinstance(v, str):
124+
v = STACVersionID(v)
125+
self._max_version = v
126+
127+
def set_min(self, v: str | STACVersionID) -> None:
128+
if isinstance(v, str):
129+
v = STACVersionID(v)
108130
if self.min_version < v:
109131
if v < self.max_version:
110132
self.min_version = v
111133
else:
112134
self.min_version = self.max_version
113135

114-
def set_max(self, v: STACVersionID) -> None:
136+
def set_max(self, v: str | STACVersionID) -> None:
137+
if isinstance(v, str):
138+
v = STACVersionID(v)
115139
if v < self.max_version:
116140
if self.min_version < v:
117141
self.max_version = v
118142
else:
119143
self.max_version = self.min_version
120144

121-
def set_to_single(self, v: STACVersionID) -> None:
145+
def set_to_single(self, v: str | STACVersionID) -> None:
122146
self.set_min(v)
123147
self.set_max(v)
124148

@@ -264,12 +288,12 @@ def identify_stac_object(json_dict: dict[str, Any]) -> STACJSONDescription:
264288
stac_extensions = json_dict.get("stac_extensions", None)
265289

266290
if stac_version is None:
267-
version_range.set_min(STACVersionID("0.8.0"))
291+
version_range.set_min("0.8.0")
268292
else:
269293
version_range.set_to_single(stac_version)
270294

271295
if stac_extensions is not None:
272-
version_range.set_min(STACVersionID("0.8.0"))
296+
version_range.set_min("0.8.0")
273297

274298
if stac_extensions is None:
275299
stac_extensions = []

tests/extensions/test_eo.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,3 +516,18 @@ def test_required_property_missing(ext_item: pystac.Item) -> None:
516516
assert bands is not None
517517
with pytest.raises(RequiredPropertyMissing):
518518
bands[0].name
519+
520+
521+
def test_unnecessary_migrations_not_performed(ext_item: Item) -> None:
522+
item_as_dict = ext_item.to_dict(include_self_link=False, transform_hrefs=False)
523+
item_as_dict["stac_version"] = "1.0.0"
524+
item_as_dict["properties"]["eo:bands"] = [{"name": "B1", "common_name": "coastal"}]
525+
526+
item = Item.from_dict(item_as_dict)
527+
528+
migrated_item = pystac.Item.from_dict(item_as_dict, migrate=True)
529+
530+
assert item.properties == migrated_item.properties
531+
assert len(item.assets) == len(migrated_item.assets)
532+
for key, value in item.assets.items():
533+
assert value.to_dict() == migrated_item.assets[key].to_dict()

tests/serialization/test_identify.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,17 @@ def test_version_range_ordering(self) -> None:
118118

119119
version_range = STACVersionRange(min_version="0.6.0-rc1", max_version="0.9.0")
120120
self.assertTrue(version_range.contains("0.9.0"))
121+
122+
def test_version_range_set_to_single(self) -> None:
123+
version_range = STACVersionRange()
124+
version_range.set_min("1.0.0-beta.1")
125+
version_range.set_to_single("1.0.0")
126+
127+
self.assertTrue(version_range.contains("1.0.0"))
128+
129+
def test_version_range_set_min_and_max_directly(self) -> None:
130+
version_range = STACVersionRange()
131+
version_range.min_version = "1.0.0-beta.1" # type:ignore
132+
version_range.max_version = "1.1.0" # type:ignore
133+
134+
self.assertTrue(version_range.contains("1.0.0"))

0 commit comments

Comments
 (0)