diff --git a/src/univers/version_range.py b/src/univers/version_range.py index 4c2a0baf..861f1e98 100644 --- a/src/univers/version_range.py +++ b/src/univers/version_range.py @@ -968,6 +968,11 @@ class GolangVersionRange(VersionRange): } +class LexicographicVersionRange(VersionRange): + scheme = "lexicographic" + version_class = versions.LexicographicVersion + + class GenericVersionRange(VersionRange): scheme = "generic" version_class = versions.SemverVersion @@ -1426,6 +1431,7 @@ def build_range_from_snyk_advisory_string(scheme: str, string: Union[str, List]) "gem": GemVersionRange, "rpm": RpmVersionRange, "golang": GolangVersionRange, + "lexicographic": LexicographicVersionRange, "generic": GenericVersionRange, "apache": ApacheVersionRange, "hex": HexVersionRange, diff --git a/src/univers/versions.py b/src/univers/versions.py index c06f4ff0..a7975777 100644 --- a/src/univers/versions.py +++ b/src/univers/versions.py @@ -143,6 +143,29 @@ class NoneVersion(Version): @classmethod def is_valid(cls, string): return string == "vers:none/*" + + +class LexicographicVersion(Version): + @classmethod + def build_value(cls, string): + return str(string) + + """ + Create a string, even if, e.g., an integer is given + """ + + @classmethod + def normalize(cls, string): + return remove_spaces(str(string)) + + def __lt__(self, other): + return self.value.encode('utf-8') < other.value.encode('utf-8') + + def __gt__(self, other): + return self.value.encode('utf-8') > other.value.encode('utf-8') + + def __eq__(self, other): + return self.value.encode('utf-8') == other.value.encode('utf-8') class GenericVersion(Version): @@ -702,6 +725,7 @@ def bump(self, index): SemverVersion, GolangVersion, PypiVersion, + LexicographicVersion, GenericVersion, ComposerVersion, NginxVersion, diff --git a/tests/test_version_range.py b/tests/test_version_range.py index 104646f8..7c87186b 100644 --- a/tests/test_version_range.py +++ b/tests/test_version_range.py @@ -23,6 +23,7 @@ from univers.version_range import build_range_from_snyk_advisory_string from univers.version_range import from_gitlab_native from univers.versions import InvalidVersion +from univers.versions import LexicographicVersion from univers.versions import NugetVersion from univers.versions import OpensslVersion from univers.versions import PypiVersion @@ -569,3 +570,12 @@ def test_version_range_none(): VersionRange.from_string("vers:none/!1.2.3") with pytest.raises(Exception): VersionRange.from_string("vers:none/*|>1.2.3") + + +def test_version_range_lexicographic(): + assert LexicographicVersion("1.2.3") in VersionRange.from_string( + "vers:lexicographic/<1.2.4|>0.9" + ) + assert LexicographicVersion(-123) in VersionRange.from_string("vers:lexicographic/<~") + assert LexicographicVersion(None) in VersionRange.from_string("vers:lexicographic/*") + assert LexicographicVersion("ABC") in VersionRange.from_string("vers:lexicographic/>abc|<=None") diff --git a/tests/test_versions.py b/tests/test_versions.py index 57ded4c0..ecbfdaf9 100644 --- a/tests/test_versions.py +++ b/tests/test_versions.py @@ -12,6 +12,7 @@ from univers.versions import EnhancedSemanticVersion from univers.versions import GentooVersion from univers.versions import GolangVersion +from univers.versions import LexicographicVersion from univers.versions import MavenVersion from univers.versions import NginxVersion from univers.versions import NugetVersion @@ -218,3 +219,13 @@ def test_golang_version(): assert GolangVersion("v0.1.1") >= GolangVersion("v0.1.1") assert GolangVersion("v0.1.1") <= GolangVersion("v0.1.1") assert GolangVersion("v0.1.1") <= GolangVersion("v0.1.2") + + +def test_lexicographic_version(): + assert LexicographicVersion("abc") == LexicographicVersion("abc") + assert LexicographicVersion(" abc") == LexicographicVersion("abc") + assert LexicographicVersion("123") == LexicographicVersion(123) + assert LexicographicVersion("abc") > LexicographicVersion(None) + assert LexicographicVersion("Abc") < LexicographicVersion(None) + assert LexicographicVersion("123") < LexicographicVersion("bbc") + assert LexicographicVersion("2.3.4") > LexicographicVersion("1.2.3")