Skip to content

Commit 3e162d1

Browse files
authored
fix: java version comparison fails (#889)
1 parent 8e7ae21 commit 3e162d1

File tree

4 files changed

+58
-6
lines changed

4 files changed

+58
-6
lines changed

api/src/feeds/impl/models/gtfs_dataset_impl.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from functools import reduce
22
from typing import List
33

4-
from packaging.version import Version
5-
64
from database_gen.sqlacodegen_models import Gtfsdataset, Validationreport
75
from feeds.impl.models.bounding_box_impl import BoundingBoxImpl
86
from feeds.impl.models.validation_report_impl import ValidationReportImpl
97
from feeds_gen.models.gtfs_dataset import GtfsDataset
8+
from utils.model_utils import compare_java_versions
109

1110

1211
class GtfsDatasetImpl(GtfsDataset):
@@ -30,7 +29,8 @@ def from_orm_latest_validation_report(
3029
"""
3130
if validation_reports:
3231
latest_report = reduce(
33-
lambda a, b: a if Version(a.validator_version) > Version(b.validator_version) else b, validation_reports
32+
lambda a, b: a if compare_java_versions(a.validator_version, b.validator_version) == 1 else b,
33+
validation_reports,
3434
)
3535
return ValidationReportImpl.from_orm(latest_report)
3636
return None

api/src/feeds/impl/models/latest_dataset_impl.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from functools import reduce
22

3-
from packaging.version import Version
4-
53
from database_gen.sqlacodegen_models import Gtfsdataset
64
from feeds.impl.models.bounding_box_impl import BoundingBoxImpl
75
from feeds.impl.models.validation_report_impl import ValidationReportImpl
86
from feeds_gen.models.latest_dataset import LatestDataset
97
from feeds_gen.models.latest_dataset_validation_report import LatestDatasetValidationReport
8+
from utils.model_utils import compare_java_versions
109

1110

1211
class LatestDatasetImpl(LatestDataset):
@@ -28,7 +27,7 @@ def from_orm(cls, dataset: Gtfsdataset | None) -> LatestDataset | None:
2827
validation_report: LatestDatasetValidationReport | None = None
2928
if dataset.validation_reports:
3029
latest_report = reduce(
31-
lambda a, b: a if Version(a.validator_version) > Version(b.validator_version) else b,
30+
lambda a, b: a if compare_java_versions(a.validator_version, b.validator_version) == 1 else b,
3231
dataset.validation_reports,
3332
)
3433
(

api/src/utils/model_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from packaging.version import Version
2+
3+
4+
def compare_java_versions(v1: str | None, v2: str | None):
5+
"""
6+
Compare two version strings v1 and v2.
7+
Returns 1 if v1 > v2, -1 if v1 < v2,
8+
otherwise 0.
9+
The version strings are expected to be in the format of
10+
major.minor.patch[-SNAPSHOT]
11+
"""
12+
if v1 is None and v2 is None:
13+
return 0
14+
if v1 is None:
15+
return -1
16+
if v2 is None:
17+
return 1
18+
# clean version strings replacing the SNAPSHOT suffix with .dev0
19+
v1 = v1.replace("-SNAPSHOT", ".dev0")
20+
v2 = v2.replace("-SNAPSHOT", ".dev0")
21+
if Version(v1) > Version(v2):
22+
return 1
23+
elif Version(v1) < Version(v2):
24+
return -1
25+
else:
26+
return 0
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import unittest
2+
from utils.model_utils import compare_java_versions
3+
4+
5+
class TestCompareJavaVersions(unittest.TestCase):
6+
def test_compare_versions_equal(self):
7+
self.assertEqual(compare_java_versions("1.0.0", "1.0.0"), 0)
8+
self.assertEqual(compare_java_versions("1.0.0-SNAPSHOT", "1.0.0-SNAPSHOT"), 0)
9+
10+
def test_compare_versions_v1_greater(self):
11+
self.assertEqual(compare_java_versions("1.0.1", "1.0.0"), 1)
12+
self.assertEqual(compare_java_versions("1.0.0", "0.9.9"), 1)
13+
self.assertEqual(compare_java_versions("1.0.0", "1.0.0-SNAPSHOT"), 1)
14+
15+
def test_compare_versions_v2_greater(self):
16+
self.assertEqual(compare_java_versions("1.0.0", "1.0.1"), -1)
17+
self.assertEqual(compare_java_versions("0.9.9", "1.0.0"), -1)
18+
self.assertEqual(compare_java_versions("1.0.0-SNAPSHOT", "1.0.0"), -1)
19+
20+
def test_compare_versions_with_none(self):
21+
self.assertEqual(compare_java_versions(None, None), 0)
22+
self.assertEqual(compare_java_versions(None, "1.0.0"), -1)
23+
self.assertEqual(compare_java_versions("1.0.0", None), 1)
24+
25+
26+
if __name__ == "__main__":
27+
unittest.main()

0 commit comments

Comments
 (0)