Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions src/univers/version_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from semantic_version.base import AnyOf

from univers import gem
from univers import maven
from univers import versions
from univers.utils import remove_spaces
from univers.version_constraint import VersionConstraint
Expand Down Expand Up @@ -590,6 +591,62 @@ class MavenVersionRange(VersionRange):
scheme = "maven"
version_class = versions.MavenVersion

@classmethod
def from_native(cls, string):
"""
Return a VersionRange built from a Maven version specifier ``string``.
"""

string = "".join(string.split(" "))

restrictions = maven.VersionRange(string).restrictions
constraints = []

for restriction in restrictions:
lower_bound = restriction.lower_bound
upper_bound = restriction.upper_bound
lower_inclusive = restriction.lower_bound_inclusive
upper_inclusive = restriction.upper_bound_inclusive

if lower_bound == upper_bound:
constraints.append(
VersionConstraint(comparator="=", version=cls.version_class(str(lower_bound)))
)
continue

if lower_bound:
if lower_inclusive:
comparator = ">="
else:
comparator = ">"
constraints.append(
VersionConstraint(
comparator=comparator, version=cls.version_class(str(lower_bound))
)
)

if upper_bound:
if upper_inclusive:
comparator = "<="
else:
comparator = "<"
constraints.append(
VersionConstraint(
comparator=comparator, version=cls.version_class(str(upper_bound))
)
)

return cls(constraints=constraints)

@classmethod
def from_natives(cls, strings):
if isinstance(strings, str):
return cls.from_native(strings)
constraints = []
for rel in strings:
constraints.extend(cls.from_native(rel).constraints)
return cls(constraints=constraints)


class NugetVersionRange(VersionRange):
"""
Expand Down
75 changes: 75 additions & 0 deletions tests/test_maven_version_range.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#
# Copyright (c) nexB Inc. and others.
# SPDX-License-Identifier: Apache-2.0
#
# Visit https://aboutcode.org and https://github.com/nexB/univers for support and download.

from univers.version_range import MavenVersionRange
from univers.version_constraint import VersionConstraint
from univers.versions import MavenVersion


def test_maven_version_range_from_native_with_lower_inclusive():
version_range = MavenVersionRange.from_native("[1.0.0,2.0.0)")
assert version_range == MavenVersionRange(
constraints=(
VersionConstraint(comparator=">=", version=MavenVersion(string="1.0.0")),
VersionConstraint(comparator="<", version=MavenVersion(string="2.0.0")),
)
)


def test_maven_version_range_from_native_with_nothing_inclusive():
version_range = MavenVersionRange.from_native(" ( 1.0.0 , 2.1.4 ) ")
assert version_range == MavenVersionRange(
constraints=(
VersionConstraint(comparator=">", version=MavenVersion(string="1.0.0")),
VersionConstraint(comparator="<", version=MavenVersion(string="2.1.4")),
)
)


def test_maven_version_range_from_native_for_pinned_version():
version_range = MavenVersionRange.from_native("[1.0.0]")
assert version_range == MavenVersionRange(
constraints=(VersionConstraint(comparator="=", version=MavenVersion(string="1.0.0")),)
)


def test_maven_version_range_from_native_for_illformed_version():
try:
MavenVersionRange.from_native("(1.0.0]")
assert False, "should have raised an exception"
except ValueError:
assert True


def test_maven_version_range_from_native_str_representation():
version_range = MavenVersionRange.from_native("[1.0.0,5.1)")
assert str(version_range) == "vers:maven/>=1.0.0|<5.1"


def test_maven_version_range_from_native_for_multiple_version_ranges():
version_range = MavenVersionRange.from_native("[2.0,2.3.1] , [2.4.0,2.12.2) , [2.13.0,2.15.0)")
assert version_range == MavenVersionRange(
constraints=(
VersionConstraint(comparator=">=", version=MavenVersion(string="2.0")),
VersionConstraint(comparator="<=", version=MavenVersion(string="2.3.1")),
VersionConstraint(comparator=">=", version=MavenVersion(string="2.4.0")),
VersionConstraint(comparator="<", version=MavenVersion(string="2.12.2")),
VersionConstraint(comparator=">=", version=MavenVersion(string="2.13.0")),
VersionConstraint(comparator="<", version=MavenVersion(string="2.15.0")),
)
)


def test_maven_version_range_from_native_for_multiple_pinned_versions_and_a_range():
version_range = MavenVersionRange.from_native("[2.0] , [2.4.0] , [2.13.0,2.15.0)")
assert version_range == MavenVersionRange(
constraints=(
VersionConstraint(comparator="=", version=MavenVersion(string="2.0")),
VersionConstraint(comparator="=", version=MavenVersion(string="2.4.0")),
VersionConstraint(comparator=">=", version=MavenVersion(string="2.13.0")),
VersionConstraint(comparator="<", version=MavenVersion(string="2.15.0")),
)
)