Skip to content

Commit 2cf2ca6

Browse files
committed
add lexicographic versioning scheme
Signed-off-by: Kunz, Immanuel <[email protected]>
1 parent a5ed602 commit 2cf2ca6

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

src/univers/version_range.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,11 @@ class NoneVersionRange(VersionRange):
12011201
version_class = versions.NoneVersion
12021202

12031203

1204+
class LexicographicVersionRange(VersionRange):
1205+
scheme = "lexicographic"
1206+
version_class = versions.LexicographicVersion
1207+
1208+
12041209
def from_gitlab_native(gitlab_scheme, string):
12051210
purl_scheme = gitlab_scheme
12061211
if gitlab_scheme not in PURL_TYPE_BY_GITLAB_SCHEME.values():
@@ -1446,6 +1451,7 @@ def build_range_from_snyk_advisory_string(scheme: str, string: Union[str, List])
14461451
"all": AllVersionRange,
14471452
"none": NoneVersionRange,
14481453
"intdot": IntdotVersionRange,
1454+
"lexicographic": LexicographicVersionRange,
14491455
}
14501456

14511457
PURL_TYPE_BY_GITLAB_SCHEME = {

src/univers/versions.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,28 @@ class NoneVersion(Version):
144144
@classmethod
145145
def is_valid(cls, string):
146146
return string == "vers:none/*"
147+
148+
149+
class LexicographicVersion(Version):
150+
@classmethod
151+
def build_value(cls, string):
152+
return str(string)
153+
154+
"""
155+
Create a string, even if, e.g., an integer is given
156+
"""
157+
@classmethod
158+
def normalize(cls, string):
159+
return remove_spaces(str(string))
160+
161+
def __lt__(self, other):
162+
return self.value.encode('utf-8') < other.value.encode('utf-8')
163+
164+
def __gt__(self, other):
165+
return self.value.encode('utf-8') > other.value.encode('utf-8')
166+
167+
def __eq__(self, other):
168+
return self.value.encode('utf-8') == other.value.encode('utf-8')
147169

148170

149171
class IntdotVersion(Version):
@@ -726,4 +748,5 @@ def bump(self, index):
726748
LegacyOpensslVersion,
727749
AlpineLinuxVersion,
728750
IntdotVersion,
751+
LexicographicVersion,
729752
]

tests/test_version_range.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from univers.version_range import build_range_from_snyk_advisory_string
2323
from univers.version_range import from_gitlab_native
2424
from univers.versions import IntdotVersion
25+
from univers.versions import LexicographicVersion
2526
from univers.versions import OpensslVersion
2627
from univers.versions import PypiVersion
2728
from univers.versions import SemverVersion
@@ -366,3 +367,12 @@ def test_version_range_intdot():
366367
assert IntdotVersion("1.3.3alpha") in intdot_range
367368
assert IntdotVersion("1.2.2.pre") not in intdot_range
368369
assert IntdotVersion("1010.23.234203.0") in IntdotVersionRange.from_string("vers:intdot/*")
370+
371+
372+
def test_version_range_lexicographic():
373+
assert LexicographicVersion("1.2.3") in VersionRange.from_string(
374+
"vers:lexicographic/<1.2.4|>0.9"
375+
)
376+
assert LexicographicVersion(-123) in VersionRange.from_string("vers:lexicographic/<~")
377+
assert LexicographicVersion(None) in VersionRange.from_string("vers:lexicographic/*")
378+
assert LexicographicVersion("ABC") in VersionRange.from_string("vers:lexicographic/>abc|<=None")

tests/test_versions.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from univers.versions import RubygemsVersion
2222
from univers.versions import SemverVersion
2323
from univers.versions import Version
24+
from univers.versions import LexicographicVersion
2425

2526

2627
def test_version():
@@ -230,3 +231,13 @@ def test_intdot_version():
230231
assert IntdotVersion("1.2.3.4.6-pre") <= IntdotVersion("2.2.3.4.5.pre")
231232
assert IntdotVersion("1.2.3.4.6-pre") <= IntdotVersion("2.2.3.4.5-10")
232233
assert IntdotVersion("1.2.3.4.6-pre") <= IntdotVersion("2.2.3.4.5-10")
234+
235+
236+
def test_lexicographic_version():
237+
assert LexicographicVersion("abc") == LexicographicVersion("abc")
238+
assert LexicographicVersion(" abc") == LexicographicVersion("abc")
239+
assert LexicographicVersion("123") == LexicographicVersion(123)
240+
assert LexicographicVersion("abc") > LexicographicVersion(None)
241+
assert LexicographicVersion("Abc") < LexicographicVersion(None)
242+
assert LexicographicVersion("123") < LexicographicVersion("bbc")
243+
assert LexicographicVersion("2.3.4") > LexicographicVersion("1.2.3")

0 commit comments

Comments
 (0)