Skip to content

Commit 5beab04

Browse files
authored
Merge pull request #55 from keshav-space/main
add `from_versions` in VersionRange
2 parents bc8e33f + 03421e3 commit 5beab04

6 files changed

Lines changed: 153 additions & 123 deletions

File tree

requirements-dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ pytest-xdist==2.4.0
99
toml==0.10.2
1010
typing-extensions==3.10.0.2
1111
zipp==3.6.0
12-
black==21.9b0
12+
black==22.3.0
1313
typed-ast==1.4.3
1414
pathspec==0.9.0

src/univers/rpm.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ def compare_rpm_versions(a: Union[RpmVersion, str], b: Union[RpmVersion, str]) -
131131

132132

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

138138
@classmethod
139139
def compare(cls, first, second):

src/univers/version_range.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,22 @@ def from_string(cls, vers, simplify=False, validate=False):
147147

148148
return range_class(parsed_constraints)
149149

150+
@classmethod
151+
def from_versions(cls, sequence):
152+
"""
153+
Return a VersionRange built from a list of version strings,
154+
such as ["3.0.0", "1.0.1b", "3.0.2", "0.9.7a", "1.1.1ka"]
155+
"""
156+
if not cls.scheme or not cls.version_class:
157+
return NotImplementedError
158+
159+
constraints = []
160+
for version in sequence:
161+
version_obj = cls.version_class(version)
162+
constraint = VersionConstraint(comparator="=", version=version_obj)
163+
constraints.append(constraint)
164+
return cls(constraints=constraints)
165+
150166
def __str__(self):
151167
constraints = "|".join(str(c) for c in sorted(self.constraints))
152168
return f"vers:{self.scheme}/{constraints}"

tests/test_debian_version.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,9 @@ def test_compare_versions(self):
167167
assert compare_versions("2.7.4+reloaded2-13+deb9u1", "2.7.4+reloaded2-13") == 1
168168

169169
# unicode
170-
assert compare_versions(u"2:0.0.44-1", u"2:0.0.44-nobin") == -1
171-
assert compare_versions(u"2:0.0.44-nobin", u"2:0.0.44-1") == 1
172-
assert compare_versions(u"2:0.0.44-1", u"2:0.0.44-1") == 0
170+
assert compare_versions("2:0.0.44-1", "2:0.0.44-nobin") == -1
171+
assert compare_versions("2:0.0.44-nobin", "2:0.0.44-1") == 1
172+
assert compare_versions("2:0.0.44-1", "2:0.0.44-1") == 0
173173

174174
@pytest.mark.xfail(reason="Not yet supported")
175175
def test_can_parse_complex_version_is_not_invalid(self):

tests/test_maven_version.py

Lines changed: 116 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -305,31 +305,31 @@ def test_version_numbers(self):
305305

306306
unicode_version_numbers = (
307307
# again, but with unicode input
308-
u"2.0",
309-
u"2-1",
310-
u"2.0.a",
311-
u"2.0.0.a",
312-
u"2.0.2",
313-
u"2.0.123",
314-
u"2.1.0",
315-
u"2.1-a",
316-
u"2.1b",
317-
u"2.1-x",
318-
u"2.1-1",
319-
u"2.1.0.1",
320-
u"2.2",
321-
u"2.123",
322-
u"11.a2",
323-
u"11.a11",
324-
u"11.b2",
325-
u"11.b11",
326-
u"11.m2",
327-
u"11.m11",
328-
u"11",
329-
u"11.a",
330-
u"11b",
331-
u"11c",
332-
u"11m",
308+
"2.0",
309+
"2-1",
310+
"2.0.a",
311+
"2.0.0.a",
312+
"2.0.2",
313+
"2.0.123",
314+
"2.1.0",
315+
"2.1-a",
316+
"2.1b",
317+
"2.1-x",
318+
"2.1-1",
319+
"2.1.0.1",
320+
"2.2",
321+
"2.123",
322+
"11.a2",
323+
"11.a11",
324+
"11.b2",
325+
"11.b11",
326+
"11.m2",
327+
"11.m11",
328+
"11",
329+
"11.a",
330+
"11b",
331+
"11c",
332+
"11m",
333333
)
334334
for idx, low in enumerate(unicode_version_numbers[:-1]):
335335
for high in unicode_version_numbers[idx + 1 :]:
@@ -382,29 +382,29 @@ def test_version_equality(self):
382382
self._assert_version_equal("1m3", "1MILESTONE3")
383383

384384
# unicode
385-
self._assert_version_equal(u"1", "1")
386-
self._assert_version_equal(u"1", "1.0")
387-
self._assert_version_equal(u"1", "1.0.0")
388-
self._assert_version_equal(u"1.0", "1.0.0")
389-
self._assert_version_equal(u"1", "1-0")
390-
self._assert_version_equal(u"1", "1.0-0")
391-
self._assert_version_equal(u"1.0", "1.0-0")
392-
393-
self._assert_version_equal("1", u"1")
394-
self._assert_version_equal("1", u"1.0")
395-
self._assert_version_equal("1", u"1.0.0")
396-
self._assert_version_equal("1.0", u"1.0.0")
397-
self._assert_version_equal("1", u"1-0")
398-
self._assert_version_equal("1", u"1.0-0")
399-
self._assert_version_equal("1.0", u"1.0-0")
400-
401-
self._assert_version_equal(u"1", u"1")
402-
self._assert_version_equal(u"1", u"1.0")
403-
self._assert_version_equal(u"1", u"1.0.0")
404-
self._assert_version_equal(u"1.0", u"1.0.0")
405-
self._assert_version_equal(u"1", u"1-0")
406-
self._assert_version_equal(u"1", u"1.0-0")
407-
self._assert_version_equal(u"1.0", u"1.0-0")
385+
self._assert_version_equal("1", "1")
386+
self._assert_version_equal("1", "1.0")
387+
self._assert_version_equal("1", "1.0.0")
388+
self._assert_version_equal("1.0", "1.0.0")
389+
self._assert_version_equal("1", "1-0")
390+
self._assert_version_equal("1", "1.0-0")
391+
self._assert_version_equal("1.0", "1.0-0")
392+
393+
self._assert_version_equal("1", "1")
394+
self._assert_version_equal("1", "1.0")
395+
self._assert_version_equal("1", "1.0.0")
396+
self._assert_version_equal("1.0", "1.0.0")
397+
self._assert_version_equal("1", "1-0")
398+
self._assert_version_equal("1", "1.0-0")
399+
self._assert_version_equal("1.0", "1.0-0")
400+
401+
self._assert_version_equal("1", "1")
402+
self._assert_version_equal("1", "1.0")
403+
self._assert_version_equal("1", "1.0.0")
404+
self._assert_version_equal("1.0", "1.0.0")
405+
self._assert_version_equal("1", "1-0")
406+
self._assert_version_equal("1", "1.0-0")
407+
self._assert_version_equal("1.0", "1.0-0")
408408

409409
def test_version_compare(self):
410410
self._assert_version_order("1", "2")
@@ -430,74 +430,74 @@ def test_version_compare(self):
430430
self._assert_version_order("2.0.1", "2.0.1-123")
431431
self._assert_version_order("2.0.1-xyz", "2.0.1-123")
432432
# unicode input
433-
self._assert_version_order(u"1", "2")
434-
self._assert_version_order(u"1.5", "2")
435-
self._assert_version_order(u"1", "2.5")
436-
self._assert_version_order(u"1.0", "1.1")
437-
self._assert_version_order(u"1.1", "1.2")
438-
self._assert_version_order(u"1.0.0", "1.1")
439-
self._assert_version_order(u"1.0.1", "1.1")
440-
self._assert_version_order(u"1.1", "1.2.0")
441-
self._assert_version_order(u"1.0-alpha-1", "1.0")
442-
self._assert_version_order(u"1.0-alpha-1", "1.0-alpha-2")
443-
self._assert_version_order(u"1.0-alpha-1", "1.0-beta-1")
444-
self._assert_version_order(u"1.0-beta-1", "1.0-SNAPSHOT")
445-
self._assert_version_order(u"1.0-SNAPSHOT", "1.0")
446-
self._assert_version_order(u"1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
447-
self._assert_version_order(u"1.0", "1.0-1")
448-
self._assert_version_order(u"1.0-1", "1.0-2")
449-
self._assert_version_order(u"1.0.0", "1.0-1")
450-
self._assert_version_order(u"2.0-1", "2.0.1")
451-
self._assert_version_order(u"2.0.1-klm", "2.0.1-lmn")
452-
self._assert_version_order(u"2.0.1", "2.0.1-xyz")
453-
self._assert_version_order(u"2.0.1", "2.0.1-123")
454-
self._assert_version_order(u"2.0.1-xyz", "2.0.1-123")
455-
456-
self._assert_version_order("1", u"2")
457-
self._assert_version_order("1.5", u"2")
458-
self._assert_version_order("1", u"2.5")
459-
self._assert_version_order("1.0", u"1.1")
460-
self._assert_version_order("1.1", u"1.2")
461-
self._assert_version_order("1.0.0", u"1.1")
462-
self._assert_version_order("1.0.1", u"1.1")
463-
self._assert_version_order("1.1", u"1.2.0")
464-
self._assert_version_order("1.0-alpha-1", u"1.0")
465-
self._assert_version_order("1.0-alpha-1", u"1.0-alpha-2")
466-
self._assert_version_order("1.0-alpha-1", u"1.0-beta-1")
467-
self._assert_version_order("1.0-beta-1", u"1.0-SNAPSHOT")
468-
self._assert_version_order("1.0-SNAPSHOT", u"1.0")
469-
self._assert_version_order("1.0-alpha-1-SNAPSHOT", u"1.0-alpha-1")
470-
self._assert_version_order("1.0", u"1.0-1")
471-
self._assert_version_order("1.0-1", u"1.0-2")
472-
self._assert_version_order("1.0.0", u"1.0-1")
473-
self._assert_version_order("2.0-1", u"2.0.1")
474-
self._assert_version_order("2.0.1-klm", u"2.0.1-lmn")
475-
self._assert_version_order("2.0.1", u"2.0.1-xyz")
476-
self._assert_version_order("2.0.1", u"2.0.1-123")
477-
self._assert_version_order("2.0.1-xyz", u"2.0.1-123")
478-
479-
self._assert_version_order(u"1", u"2")
480-
self._assert_version_order(u"1.5", u"2")
481-
self._assert_version_order(u"1", u"2.5")
482-
self._assert_version_order(u"1.0", u"1.1")
483-
self._assert_version_order(u"1.1", u"1.2")
484-
self._assert_version_order(u"1.0.0", u"1.1")
485-
self._assert_version_order(u"1.0.1", u"1.1")
486-
self._assert_version_order(u"1.1", u"1.2.0")
487-
self._assert_version_order(u"1.0-alpha-1", u"1.0")
488-
self._assert_version_order(u"1.0-alpha-1", u"1.0-alpha-2")
489-
self._assert_version_order(u"1.0-alpha-1", u"1.0-beta-1")
490-
self._assert_version_order(u"1.0-beta-1", u"1.0-SNAPSHOT")
491-
self._assert_version_order(u"1.0-SNAPSHOT", u"1.0")
492-
self._assert_version_order(u"1.0-alpha-1-SNAPSHOT", u"1.0-alpha-1")
493-
self._assert_version_order(u"1.0", u"1.0-1")
494-
self._assert_version_order(u"1.0-1", u"1.0-2")
495-
self._assert_version_order(u"1.0.0", u"1.0-1")
496-
self._assert_version_order(u"2.0-1", u"2.0.1")
497-
self._assert_version_order(u"2.0.1-klm", u"2.0.1-lmn")
498-
self._assert_version_order(u"2.0.1", u"2.0.1-xyz")
499-
self._assert_version_order(u"2.0.1", u"2.0.1-123")
500-
self._assert_version_order(u"2.0.1-xyz", u"2.0.1-123")
433+
self._assert_version_order("1", "2")
434+
self._assert_version_order("1.5", "2")
435+
self._assert_version_order("1", "2.5")
436+
self._assert_version_order("1.0", "1.1")
437+
self._assert_version_order("1.1", "1.2")
438+
self._assert_version_order("1.0.0", "1.1")
439+
self._assert_version_order("1.0.1", "1.1")
440+
self._assert_version_order("1.1", "1.2.0")
441+
self._assert_version_order("1.0-alpha-1", "1.0")
442+
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
443+
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
444+
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
445+
self._assert_version_order("1.0-SNAPSHOT", "1.0")
446+
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
447+
self._assert_version_order("1.0", "1.0-1")
448+
self._assert_version_order("1.0-1", "1.0-2")
449+
self._assert_version_order("1.0.0", "1.0-1")
450+
self._assert_version_order("2.0-1", "2.0.1")
451+
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
452+
self._assert_version_order("2.0.1", "2.0.1-xyz")
453+
self._assert_version_order("2.0.1", "2.0.1-123")
454+
self._assert_version_order("2.0.1-xyz", "2.0.1-123")
455+
456+
self._assert_version_order("1", "2")
457+
self._assert_version_order("1.5", "2")
458+
self._assert_version_order("1", "2.5")
459+
self._assert_version_order("1.0", "1.1")
460+
self._assert_version_order("1.1", "1.2")
461+
self._assert_version_order("1.0.0", "1.1")
462+
self._assert_version_order("1.0.1", "1.1")
463+
self._assert_version_order("1.1", "1.2.0")
464+
self._assert_version_order("1.0-alpha-1", "1.0")
465+
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
466+
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
467+
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
468+
self._assert_version_order("1.0-SNAPSHOT", "1.0")
469+
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
470+
self._assert_version_order("1.0", "1.0-1")
471+
self._assert_version_order("1.0-1", "1.0-2")
472+
self._assert_version_order("1.0.0", "1.0-1")
473+
self._assert_version_order("2.0-1", "2.0.1")
474+
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
475+
self._assert_version_order("2.0.1", "2.0.1-xyz")
476+
self._assert_version_order("2.0.1", "2.0.1-123")
477+
self._assert_version_order("2.0.1-xyz", "2.0.1-123")
478+
479+
self._assert_version_order("1", "2")
480+
self._assert_version_order("1.5", "2")
481+
self._assert_version_order("1", "2.5")
482+
self._assert_version_order("1.0", "1.1")
483+
self._assert_version_order("1.1", "1.2")
484+
self._assert_version_order("1.0.0", "1.1")
485+
self._assert_version_order("1.0.1", "1.1")
486+
self._assert_version_order("1.1", "1.2.0")
487+
self._assert_version_order("1.0-alpha-1", "1.0")
488+
self._assert_version_order("1.0-alpha-1", "1.0-alpha-2")
489+
self._assert_version_order("1.0-alpha-1", "1.0-beta-1")
490+
self._assert_version_order("1.0-beta-1", "1.0-SNAPSHOT")
491+
self._assert_version_order("1.0-SNAPSHOT", "1.0")
492+
self._assert_version_order("1.0-alpha-1-SNAPSHOT", "1.0-alpha-1")
493+
self._assert_version_order("1.0", "1.0-1")
494+
self._assert_version_order("1.0-1", "1.0-2")
495+
self._assert_version_order("1.0.0", "1.0-1")
496+
self._assert_version_order("2.0-1", "2.0.1")
497+
self._assert_version_order("2.0.1-klm", "2.0.1-lmn")
498+
self._assert_version_order("2.0.1", "2.0.1-xyz")
499+
self._assert_version_order("2.0.1", "2.0.1-123")
500+
self._assert_version_order("2.0.1-xyz", "2.0.1-123")
501501

502502
def test_compare(self):
503503
assert 1 < Version("1.0")

tests/test_version_range.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,20 @@ def test_OpensslVersionRange_from_native_mixed(self):
264264
version_range = OpensslVersionRange.from_native(openssl_range)
265265
assert version_range == expected
266266

267+
def test_OpensslVersionRange_from_versions(self):
268+
sequence = ["3.0.0", "1.0.1b", "3.0.2", "0.9.7a ", "1.1.1ka"]
269+
expected = OpensslVersionRange(
270+
constraints=(
271+
VersionConstraint(comparator="=", version=OpensslVersion(string="0.9.7a")),
272+
VersionConstraint(comparator="=", version=OpensslVersion(string="1.0.1b")),
273+
VersionConstraint(comparator="=", version=OpensslVersion(string="1.1.1ka")),
274+
VersionConstraint(comparator="=", version=OpensslVersion(string="3.0.0")),
275+
VersionConstraint(comparator="=", version=OpensslVersion(string="3.0.2")),
276+
)
277+
)
278+
version_range = OpensslVersionRange.from_versions(sequence)
279+
assert version_range == expected
280+
267281

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

0 commit comments

Comments
 (0)