Skip to content

Commit fbc98fa

Browse files
authored
Make sure that VersionRange has VersionIDs rather than strings (#1512)
* Make sure that VersionRange has VersionIDs rather than strings * Update changelog
1 parent 79cc5af commit fbc98fa

File tree

4 files changed

+64
-7
lines changed

4 files changed

+64
-7
lines changed

Diff for: CHANGELOG.md

+4
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

Diff for: pystac/serialization/identify.py

+31-7
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ def __lt__(self, other: object) -> bool:
8282
class STACVersionRange:
8383
"""Defines a range of STAC versions."""
8484

85-
min_version: STACVersionID
86-
max_version: STACVersionID
85+
_min_version: STACVersionID
86+
_max_version: STACVersionID
8787

8888
def __init__(
8989
self,
@@ -103,21 +103,45 @@ def __init__(
103103
else:
104104
self.max_version = max_version
105105

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

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

120-
def set_to_single(self, v: STACVersionID) -> None:
144+
def set_to_single(self, v: str | STACVersionID) -> None:
121145
self.set_min(v)
122146
self.set_max(v)
123147

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

265289
if stac_version is None:
266-
version_range.set_min(STACVersionID("0.8.0"))
290+
version_range.set_min("0.8.0")
267291
else:
268292
version_range.set_to_single(stac_version)
269293

270294
if stac_extensions is not None:
271-
version_range.set_min(STACVersionID("0.8.0"))
295+
version_range.set_min("0.8.0")
272296

273297
if stac_extensions is None:
274298
stac_extensions = []

Diff for: tests/extensions/test_eo.py

+15
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()

Diff for: tests/serialization/test_identify.py

+14
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)