Skip to content

Commit

Permalink
Make sure that VersionRange has VersionIDs rather than strings (#1512)
Browse files Browse the repository at this point in the history
* Make sure that VersionRange has VersionIDs rather than strings

* Update changelog
  • Loading branch information
jsignell authored Jan 28, 2025
1 parent 79cc5af commit fbc98fa
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
38 changes: 31 additions & 7 deletions pystac/serialization/identify.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)

Expand Down Expand Up @@ -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 = []
Expand Down
15 changes: 15 additions & 0 deletions tests/extensions/test_eo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
14 changes: 14 additions & 0 deletions tests/serialization/test_identify.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"))

0 comments on commit fbc98fa

Please sign in to comment.