Skip to content

Commit

Permalink
Merge pull request #138 from azavea/fix/rde/version-ordering
Browse files Browse the repository at this point in the history
Ensure proper version ordering during identification and migration.
  • Loading branch information
lossyrob authored Aug 9, 2020
2 parents 5b8da75 + 426c6b0 commit faa4174
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 4 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
# Changelog

## Unreleased
## [v0.5.0]

### Added

- Added support for the Projection extension([#125](https://github.com/azavea/pystac/pull/125))
- Add support for Item Asset properties ([#127](https://github.com/azavea/pystac/pull/127))
- Added support for dynamically changing the STAC version via `pystac.set_stac_version` and `pystac.get_stac_version` ([#130](https://github.com/azavea/pystac/pull/130))
- Added support for prerelease versions in version comparisions for the `pystac.serialization.identify` package ([#138](https://github.com/azavea/pystac/pull/138))

### Changed

Expand Down
3 changes: 2 additions & 1 deletion pystac/serialization/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from pystac import (Catalog, Collection, Item, Extensions)

from pystac.serialization.identify import (STACObjectType, STACJSONDescription, STACVersionRange,
identify_stac_object, identify_stac_object_type)
STACVersionID, identify_stac_object,
identify_stac_object_type)

from pystac.serialization.common_properties import merge_common_properties
from pystac.serialization.migrate import migrate_to_latest
Expand Down
3 changes: 2 additions & 1 deletion pystac/serialization/common_properties.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pystac import Collection
from pystac.utils import make_absolute_href
from pystac.stac_io import STAC_IO
from pystac.serialization.identify import STACVersionID


def merge_common_properties(item_dict, collection_cache=None, json_href=None):
Expand All @@ -27,7 +28,7 @@ def merge_common_properties(item_dict, collection_cache=None, json_href=None):

# The commons extension was removed in 1.0.0-beta.1, so if this is an earlier STAC
# item we don't have to bother with merging.
if stac_version is not None and not stac_version.startswith('0.'):
if stac_version is not None and STACVersionID(stac_version) > '0.9.0':
return False

# Check to see if this is a 0.9.0 item that
Expand Down
49 changes: 48 additions & 1 deletion pystac/serialization/identify.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from functools import total_ordering

from pystac.version import STACVersion
from pystac.extensions import Extensions

Expand Down Expand Up @@ -33,11 +35,56 @@ def __repr__(self):
','.join(self.custom_extensions))


@total_ordering
class STACVersionID:
def __init__(self, version_string):
self.version_string = version_string

# Account for RC or beta releases in version
version_parts = version_string.split('-')
self.version_core = version_parts[0]
if len(version_parts) == 1:
self.version_prerelease = None
else:
self.version_prerelease = '-'.join(version_parts[1:])

def __str__(self):
return self.version_string

def __eq__(self, other):
if type(other) is str:
other = STACVersionID(other)
self.version_string == other.version_string

def __lt__(self, other):
if type(other) is str:
other = STACVersionID(other)
if self.version_core < other.version_core:
return True
elif self.version_core > other.version_core:
return False
else:
if self.version_prerelease is None:
return other.version_prerelease is not None
else:
return other.version_prerelease is None or \
other.version_prerelease > self.version_prerelease


class STACVersionRange:
def __init__(self, min_version='0.4.0', max_version=None):
self.min_version = min_version
if type(min_version) is str:
self.min_version = STACVersionID(min_version)
else:
self.min_version = min_version

if max_version is None:
self.max_version = STACVersion.DEFAULT_STAC_VERSION
else:
if type(max_version) is str:
self.max_version = STACVersionID(max_version)
else:
self.max_version = max_version

def set_min(self, v):
if self.min_version < v:
Expand Down
15 changes: 15 additions & 0 deletions tests/serialization/test_identify.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from pystac.cache import CollectionCache
from pystac.serialization import (identify_stac_object, identify_stac_object_type,
merge_common_properties, STACObjectType)
from pystac.serialization.identify import (STACVersionRange, STACVersionID)

from tests.utils import TestCases

Expand Down Expand Up @@ -37,3 +38,17 @@ def test_identify(self):
self.assertEqual(set(actual.custom_extensions),
set(example['custom_extensions']),
msg=msg)


class VersionTest(unittest.TestCase):
def test_version_ordering(self):
version_id = STACVersionID('1.0.0-beta.2')
self.assertTrue(version_id < '1.0.0')

def test_version_range_ordering(self):
version_range = STACVersionRange('0.9.0', '1.0.0-beta.2')
self.assertTrue(version_range.contains('1.0.0-beta.1'))
self.assertFalse(version_range.contains('1.0.0'))

version_range = STACVersionRange('0.9.0', '1.0.0-beta.1')
self.assertFalse(version_range.contains('1.0.0-beta.2'))

0 comments on commit faa4174

Please sign in to comment.