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
2 changes: 1 addition & 1 deletion requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ pytest-xdist==2.4.0
toml==0.10.2
typing-extensions==3.10.0.2
zipp==3.6.0
black==21.9b0
black==22.3.0
typed-ast==1.4.3
pathspec==0.9.0
6 changes: 3 additions & 3 deletions src/univers/rpm.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ def compare_rpm_versions(a: Union[RpmVersion, str], b: Union[RpmVersion, str]) -


class Vercmp:
R_NONALNUMTILDE_CARET = re.compile(br"^([^a-zA-Z0-9~\^]*)(.*)$")
R_NUM = re.compile(br"^([\d]+)(.*)$")
R_ALPHA = re.compile(br"^([a-zA-Z]+)(.*)$")
R_NONALNUMTILDE_CARET = re.compile(rb"^([^a-zA-Z0-9~\^]*)(.*)$")
R_NUM = re.compile(rb"^([\d]+)(.*)$")
R_ALPHA = re.compile(rb"^([a-zA-Z]+)(.*)$")

@classmethod
def compare(cls, first, second):
Expand Down
16 changes: 16 additions & 0 deletions src/univers/version_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,22 @@ def from_string(cls, vers, simplify=False, validate=False):

return range_class(parsed_constraints)

@classmethod
def from_versions(cls, sequence):
"""
Return a VersionRange built from a list of version strings,
such as ["3.0.0", "1.0.1b", "3.0.2", "0.9.7a", "1.1.1ka"]
"""
if not cls.scheme or not cls.version_class:
return NotImplementedError

constraints = []
for version in sequence:
version_obj = cls.version_class(version)
constraint = VersionConstraint(comparator="=", version=version_obj)
constraints.append(constraint)
return cls(constraints=constraints)

def __str__(self):
constraints = "|".join(str(c) for c in sorted(self.constraints))
return f"vers:{self.scheme}/{constraints}"
Expand Down
6 changes: 3 additions & 3 deletions tests/test_debian_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,9 @@ def test_compare_versions(self):
assert compare_versions("2.7.4+reloaded2-13+deb9u1", "2.7.4+reloaded2-13") == 1

# unicode
assert compare_versions(u"2:0.0.44-1", u"2:0.0.44-nobin") == -1
assert compare_versions(u"2:0.0.44-nobin", u"2:0.0.44-1") == 1
assert compare_versions(u"2:0.0.44-1", u"2:0.0.44-1") == 0
assert compare_versions("2:0.0.44-1", "2:0.0.44-nobin") == -1
assert compare_versions("2:0.0.44-nobin", "2:0.0.44-1") == 1
assert compare_versions("2:0.0.44-1", "2:0.0.44-1") == 0

@pytest.mark.xfail(reason="Not yet supported")
def test_can_parse_complex_version_is_not_invalid(self):
Expand Down
232 changes: 116 additions & 116 deletions tests/test_maven_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,31 +305,31 @@ def test_version_numbers(self):

unicode_version_numbers = (
# again, but with unicode input
u"2.0",
u"2-1",
u"2.0.a",
u"2.0.0.a",
u"2.0.2",
u"2.0.123",
u"2.1.0",
u"2.1-a",
u"2.1b",
u"2.1-x",
u"2.1-1",
u"2.1.0.1",
u"2.2",
u"2.123",
u"11.a2",
u"11.a11",
u"11.b2",
u"11.b11",
u"11.m2",
u"11.m11",
u"11",
u"11.a",
u"11b",
u"11c",
u"11m",
"2.0",
"2-1",
"2.0.a",
"2.0.0.a",
"2.0.2",
"2.0.123",
"2.1.0",
"2.1-a",
"2.1b",
"2.1-x",
"2.1-1",
"2.1.0.1",
"2.2",
"2.123",
"11.a2",
"11.a11",
"11.b2",
"11.b11",
"11.m2",
"11.m11",
"11",
"11.a",
"11b",
"11c",
"11m",
)
for idx, low in enumerate(unicode_version_numbers[:-1]):
for high in unicode_version_numbers[idx + 1 :]:
Expand Down Expand Up @@ -382,29 +382,29 @@ def test_version_equality(self):
self._assert_version_equal("1m3", "1MILESTONE3")

# unicode
self._assert_version_equal(u"1", "1")
self._assert_version_equal(u"1", "1.0")
self._assert_version_equal(u"1", "1.0.0")
self._assert_version_equal(u"1.0", "1.0.0")
self._assert_version_equal(u"1", "1-0")
self._assert_version_equal(u"1", "1.0-0")
self._assert_version_equal(u"1.0", "1.0-0")

self._assert_version_equal("1", u"1")
self._assert_version_equal("1", u"1.0")
self._assert_version_equal("1", u"1.0.0")
self._assert_version_equal("1.0", u"1.0.0")
self._assert_version_equal("1", u"1-0")
self._assert_version_equal("1", u"1.0-0")
self._assert_version_equal("1.0", u"1.0-0")

self._assert_version_equal(u"1", u"1")
self._assert_version_equal(u"1", u"1.0")
self._assert_version_equal(u"1", u"1.0.0")
self._assert_version_equal(u"1.0", u"1.0.0")
self._assert_version_equal(u"1", u"1-0")
self._assert_version_equal(u"1", u"1.0-0")
self._assert_version_equal(u"1.0", u"1.0-0")
self._assert_version_equal("1", "1")
self._assert_version_equal("1", "1.0")
self._assert_version_equal("1", "1.0.0")
self._assert_version_equal("1.0", "1.0.0")
self._assert_version_equal("1", "1-0")
self._assert_version_equal("1", "1.0-0")
self._assert_version_equal("1.0", "1.0-0")

self._assert_version_equal("1", "1")
self._assert_version_equal("1", "1.0")
self._assert_version_equal("1", "1.0.0")
self._assert_version_equal("1.0", "1.0.0")
self._assert_version_equal("1", "1-0")
self._assert_version_equal("1", "1.0-0")
self._assert_version_equal("1.0", "1.0-0")

self._assert_version_equal("1", "1")
self._assert_version_equal("1", "1.0")
self._assert_version_equal("1", "1.0.0")
self._assert_version_equal("1.0", "1.0.0")
self._assert_version_equal("1", "1-0")
self._assert_version_equal("1", "1.0-0")
self._assert_version_equal("1.0", "1.0-0")

def test_version_compare(self):
self._assert_version_order("1", "2")
Expand All @@ -430,74 +430,74 @@ def test_version_compare(self):
self._assert_version_order("2.0.1", "2.0.1-123")
self._assert_version_order("2.0.1-xyz", "2.0.1-123")
# unicode input
self._assert_version_order(u"1", "2")
self._assert_version_order(u"1.5", "2")
self._assert_version_order(u"1", "2.5")
self._assert_version_order(u"1.0", "1.1")
self._assert_version_order(u"1.1", "1.2")
self._assert_version_order(u"1.0.0", "1.1")
self._assert_version_order(u"1.0.1", "1.1")
self._assert_version_order(u"1.1", "1.2.0")
self._assert_version_order(u"1.0-alpha-1", "1.0")
self._assert_version_order(u"1.0-alpha-1", "1.0-alpha-2")
self._assert_version_order(u"1.0-alpha-1", "1.0-beta-1")
self._assert_version_order(u"1.0-beta-1", "1.0-SNAPSHOT")
self._assert_version_order(u"1.0-SNAPSHOT", "1.0")
self._assert_version_order(u"1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
self._assert_version_order(u"1.0", "1.0-1")
self._assert_version_order(u"1.0-1", "1.0-2")
self._assert_version_order(u"1.0.0", "1.0-1")
self._assert_version_order(u"2.0-1", "2.0.1")
self._assert_version_order(u"2.0.1-klm", "2.0.1-lmn")
self._assert_version_order(u"2.0.1", "2.0.1-xyz")
self._assert_version_order(u"2.0.1", "2.0.1-123")
self._assert_version_order(u"2.0.1-xyz", "2.0.1-123")

self._assert_version_order("1", u"2")
self._assert_version_order("1.5", u"2")
self._assert_version_order("1", u"2.5")
self._assert_version_order("1.0", u"1.1")
self._assert_version_order("1.1", u"1.2")
self._assert_version_order("1.0.0", u"1.1")
self._assert_version_order("1.0.1", u"1.1")
self._assert_version_order("1.1", u"1.2.0")
self._assert_version_order("1.0-alpha-1", u"1.0")
self._assert_version_order("1.0-alpha-1", u"1.0-alpha-2")
self._assert_version_order("1.0-alpha-1", u"1.0-beta-1")
self._assert_version_order("1.0-beta-1", u"1.0-SNAPSHOT")
self._assert_version_order("1.0-SNAPSHOT", u"1.0")
self._assert_version_order("1.0-alpha-1-SNAPSHOT", u"1.0-alpha-1")
self._assert_version_order("1.0", u"1.0-1")
self._assert_version_order("1.0-1", u"1.0-2")
self._assert_version_order("1.0.0", u"1.0-1")
self._assert_version_order("2.0-1", u"2.0.1")
self._assert_version_order("2.0.1-klm", u"2.0.1-lmn")
self._assert_version_order("2.0.1", u"2.0.1-xyz")
self._assert_version_order("2.0.1", u"2.0.1-123")
self._assert_version_order("2.0.1-xyz", u"2.0.1-123")

self._assert_version_order(u"1", u"2")
self._assert_version_order(u"1.5", u"2")
self._assert_version_order(u"1", u"2.5")
self._assert_version_order(u"1.0", u"1.1")
self._assert_version_order(u"1.1", u"1.2")
self._assert_version_order(u"1.0.0", u"1.1")
self._assert_version_order(u"1.0.1", u"1.1")
self._assert_version_order(u"1.1", u"1.2.0")
self._assert_version_order(u"1.0-alpha-1", u"1.0")
self._assert_version_order(u"1.0-alpha-1", u"1.0-alpha-2")
self._assert_version_order(u"1.0-alpha-1", u"1.0-beta-1")
self._assert_version_order(u"1.0-beta-1", u"1.0-SNAPSHOT")
self._assert_version_order(u"1.0-SNAPSHOT", u"1.0")
self._assert_version_order(u"1.0-alpha-1-SNAPSHOT", u"1.0-alpha-1")
self._assert_version_order(u"1.0", u"1.0-1")
self._assert_version_order(u"1.0-1", u"1.0-2")
self._assert_version_order(u"1.0.0", u"1.0-1")
self._assert_version_order(u"2.0-1", u"2.0.1")
self._assert_version_order(u"2.0.1-klm", u"2.0.1-lmn")
self._assert_version_order(u"2.0.1", u"2.0.1-xyz")
self._assert_version_order(u"2.0.1", u"2.0.1-123")
self._assert_version_order(u"2.0.1-xyz", u"2.0.1-123")
self._assert_version_order("1", "2")
self._assert_version_order("1.5", "2")
self._assert_version_order("1", "2.5")
self._assert_version_order("1.0", "1.1")
self._assert_version_order("1.1", "1.2")
self._assert_version_order("1.0.0", "1.1")
self._assert_version_order("1.0.1", "1.1")
self._assert_version_order("1.1", "1.2.0")
self._assert_version_order("1.0-alpha-1", "1.0")
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
self._assert_version_order("1.0-SNAPSHOT", "1.0")
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
self._assert_version_order("1.0", "1.0-1")
self._assert_version_order("1.0-1", "1.0-2")
self._assert_version_order("1.0.0", "1.0-1")
self._assert_version_order("2.0-1", "2.0.1")
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
self._assert_version_order("2.0.1", "2.0.1-xyz")
self._assert_version_order("2.0.1", "2.0.1-123")
self._assert_version_order("2.0.1-xyz", "2.0.1-123")

self._assert_version_order("1", "2")
self._assert_version_order("1.5", "2")
self._assert_version_order("1", "2.5")
self._assert_version_order("1.0", "1.1")
self._assert_version_order("1.1", "1.2")
self._assert_version_order("1.0.0", "1.1")
self._assert_version_order("1.0.1", "1.1")
self._assert_version_order("1.1", "1.2.0")
self._assert_version_order("1.0-alpha-1", "1.0")
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
self._assert_version_order("1.0-SNAPSHOT", "1.0")
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
self._assert_version_order("1.0", "1.0-1")
self._assert_version_order("1.0-1", "1.0-2")
self._assert_version_order("1.0.0", "1.0-1")
self._assert_version_order("2.0-1", "2.0.1")
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
self._assert_version_order("2.0.1", "2.0.1-xyz")
self._assert_version_order("2.0.1", "2.0.1-123")
self._assert_version_order("2.0.1-xyz", "2.0.1-123")

self._assert_version_order("1", "2")
self._assert_version_order("1.5", "2")
self._assert_version_order("1", "2.5")
self._assert_version_order("1.0", "1.1")
self._assert_version_order("1.1", "1.2")
self._assert_version_order("1.0.0", "1.1")
self._assert_version_order("1.0.1", "1.1")
self._assert_version_order("1.1", "1.2.0")
self._assert_version_order("1.0-alpha-1", "1.0")
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
self._assert_version_order("1.0-SNAPSHOT", "1.0")
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
self._assert_version_order("1.0", "1.0-1")
self._assert_version_order("1.0-1", "1.0-2")
self._assert_version_order("1.0.0", "1.0-1")
self._assert_version_order("2.0-1", "2.0.1")
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
self._assert_version_order("2.0.1", "2.0.1-xyz")
self._assert_version_order("2.0.1", "2.0.1-123")
self._assert_version_order("2.0.1-xyz", "2.0.1-123")

def test_compare(self):
assert 1 < Version("1.0")
Expand Down
14 changes: 14 additions & 0 deletions tests/test_version_range.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,20 @@ def test_OpensslVersionRange_from_native_mixed(self):
version_range = OpensslVersionRange.from_native(openssl_range)
assert version_range == expected

def test_OpensslVersionRange_from_versions(self):
sequence = ["3.0.0", "1.0.1b", "3.0.2", "0.9.7a ", "1.1.1ka"]
expected = OpensslVersionRange(
constraints=(
VersionConstraint(comparator="=", version=OpensslVersion(string="0.9.7a")),
VersionConstraint(comparator="=", version=OpensslVersion(string="1.0.1b")),
VersionConstraint(comparator="=", version=OpensslVersion(string="1.1.1ka")),
VersionConstraint(comparator="=", version=OpensslVersion(string="3.0.0")),
VersionConstraint(comparator="=", version=OpensslVersion(string="3.0.2")),
)
)
version_range = OpensslVersionRange.from_versions(sequence)
assert version_range == expected


VERSION_RANGE_TESTS_BY_SCHEME = {
"nginx": ["0.8.40+", "0.7.52-0.8.39", "0.9.10", "1.5.0+, 1.4.1+"],
Expand Down