Skip to content

Commit ca517a1

Browse files
committed
Add version range support for maven
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 269d8c0 commit ca517a1

2 files changed

Lines changed: 132 additions & 0 deletions

File tree

src/univers/version_range.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from semantic_version.base import AnyOf
1313

1414
from univers import gem
15+
from univers import maven
1516
from univers import versions
1617
from univers.utils import remove_spaces
1718
from univers.version_constraint import VersionConstraint
@@ -590,6 +591,62 @@ class MavenVersionRange(VersionRange):
590591
scheme = "maven"
591592
version_class = versions.MavenVersion
592593

594+
@classmethod
595+
def from_native(cls, string):
596+
"""
597+
Return a VersionRange built from a Maven version specifier ``string``.
598+
"""
599+
600+
string = "".join(string.split(" "))
601+
602+
restrictions = maven.VersionRange(string).restrictions
603+
constraints = []
604+
605+
for restriction in restrictions:
606+
lower_bound = restriction.lower_bound
607+
upper_bound = restriction.upper_bound
608+
lower_inclusive = restriction.lower_bound_inclusive
609+
upper_inclusive = restriction.upper_bound_inclusive
610+
611+
if lower_bound == upper_bound:
612+
constraints.append(
613+
VersionConstraint(comparator="=", version=cls.version_class(str(lower_bound)))
614+
)
615+
continue
616+
617+
if lower_bound:
618+
if lower_inclusive:
619+
comparator = ">="
620+
else:
621+
comparator = ">"
622+
constraints.append(
623+
VersionConstraint(
624+
comparator=comparator, version=cls.version_class(str(lower_bound))
625+
)
626+
)
627+
628+
if upper_bound:
629+
if upper_inclusive:
630+
comparator = "<="
631+
else:
632+
comparator = "<"
633+
constraints.append(
634+
VersionConstraint(
635+
comparator=comparator, version=cls.version_class(str(upper_bound))
636+
)
637+
)
638+
639+
return cls(constraints=constraints)
640+
641+
@classmethod
642+
def from_natives(cls, strings):
643+
if isinstance(strings, str):
644+
return cls.from_native(strings)
645+
constraints = []
646+
for rel in strings:
647+
constraints.extend(cls.from_native(rel).constraints)
648+
return cls(constraints=constraints)
649+
593650

594651
class NugetVersionRange(VersionRange):
595652
"""

tests/test_maven_version_range.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#
2+
# Copyright (c) nexB Inc. and others.
3+
# SPDX-License-Identifier: Apache-2.0
4+
#
5+
# Visit https://aboutcode.org and https://github.com/nexB/univers for support and download.
6+
7+
from univers.version_range import MavenVersionRange
8+
from univers.version_constraint import VersionConstraint
9+
from univers.versions import MavenVersion
10+
11+
12+
def test_maven_version_range_from_native_with_lower_inclusive():
13+
version_range = MavenVersionRange.from_native("[1.0.0,2.0.0)")
14+
assert version_range == MavenVersionRange(
15+
constraints=(
16+
VersionConstraint(comparator=">=", version=MavenVersion(string="1.0.0")),
17+
VersionConstraint(comparator="<", version=MavenVersion(string="2.0.0")),
18+
)
19+
)
20+
21+
22+
def test_maven_version_range_from_native_with_nothing_inclusive():
23+
version_range = MavenVersionRange.from_native(" ( 1.0.0 , 2.1.4 ) ")
24+
assert version_range == MavenVersionRange(
25+
constraints=(
26+
VersionConstraint(comparator=">", version=MavenVersion(string="1.0.0")),
27+
VersionConstraint(comparator="<", version=MavenVersion(string="2.1.4")),
28+
)
29+
)
30+
31+
32+
def test_maven_version_range_from_native_for_pinned_version():
33+
version_range = MavenVersionRange.from_native("[1.0.0]")
34+
assert version_range == MavenVersionRange(
35+
constraints=(VersionConstraint(comparator="=", version=MavenVersion(string="1.0.0")),)
36+
)
37+
38+
39+
def test_maven_version_range_from_native_for_illformed_version():
40+
try:
41+
MavenVersionRange.from_native("(1.0.0]")
42+
assert False, "should have raised an exception"
43+
except ValueError:
44+
assert True
45+
46+
47+
def test_maven_version_range_from_native_str_representation():
48+
version_range = MavenVersionRange.from_native("[1.0.0,5.1)")
49+
assert str(version_range) == "vers:maven/>=1.0.0|<5.1"
50+
51+
52+
def test_maven_version_range_from_native_for_multiple_version_ranges():
53+
version_range = MavenVersionRange.from_native("[2.0,2.3.1] , [2.4.0,2.12.2) , [2.13.0,2.15.0)")
54+
assert version_range == MavenVersionRange(
55+
constraints=(
56+
VersionConstraint(comparator=">=", version=MavenVersion(string="2.0")),
57+
VersionConstraint(comparator="<=", version=MavenVersion(string="2.3.1")),
58+
VersionConstraint(comparator=">=", version=MavenVersion(string="2.4.0")),
59+
VersionConstraint(comparator="<", version=MavenVersion(string="2.12.2")),
60+
VersionConstraint(comparator=">=", version=MavenVersion(string="2.13.0")),
61+
VersionConstraint(comparator="<", version=MavenVersion(string="2.15.0")),
62+
)
63+
)
64+
65+
66+
def test_maven_version_range_from_native_for_multiple_pinned_versions_and_a_range():
67+
version_range = MavenVersionRange.from_native("[2.0] , [2.4.0] , [2.13.0,2.15.0)")
68+
assert version_range == MavenVersionRange(
69+
constraints=(
70+
VersionConstraint(comparator="=", version=MavenVersion(string="2.0")),
71+
VersionConstraint(comparator="=", version=MavenVersion(string="2.4.0")),
72+
VersionConstraint(comparator=">=", version=MavenVersion(string="2.13.0")),
73+
VersionConstraint(comparator="<", version=MavenVersion(string="2.15.0")),
74+
)
75+
)

0 commit comments

Comments
 (0)