Skip to content

Commit 2290ed2

Browse files
committed
Adjust conan code according to univers #101
Signed-off-by: John M. Horan <johnmhoran@gmail.com>
1 parent ce76f0e commit 2290ed2

6 files changed

Lines changed: 122 additions & 27 deletions

File tree

src/univers/conan/version.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def __lt__(self, other):
4747

4848

4949
@total_ordering
50-
class Version:
50+
class ConanVersion:
5151
"""
5252
This is NOT an implementation of semver, as users may use any pattern in their versions.
5353
It is just a helper to parse "." or "-" and compare taking into account integers when possible
@@ -60,15 +60,15 @@ def __init__(self, value):
6060
items = value.rsplit("+", 1) # split for build
6161
if len(items) == 2:
6262
value, build = items
63-
self._build = Version(build) # This is a nested version by itself
63+
self._build = ConanVersion(build) # This is a nested version by itself
6464
else:
6565
value = items[0]
6666
self._build = None
6767

6868
items = value.rsplit("-", 1) # split for pre-release
6969
if len(items) == 2:
7070
value, pre = items
71-
self._pre = Version(pre) # This is a nested version by itself
71+
self._pre = ConanVersion(pre) # This is a nested version by itself
7272
else:
7373
value = items[0]
7474
self._pre = None
@@ -101,7 +101,7 @@ def bump(self, index):
101101
items.extend([0] * (len(items) - index - 1))
102102
v = ".".join(str(i) for i in items)
103103
# prerelease and build are dropped while bumping digits
104-
result = Version(v)
104+
result = ConanVersion(v)
105105
return result
106106

107107
def upper_bound(self, index):
@@ -113,7 +113,7 @@ def upper_bound(self, index):
113113
items.extend([0] * (len(items) - index - 1))
114114
v = ".".join(str(i) for i in items)
115115
v += "-" # Exclude prereleases
116-
result = Version(v)
116+
result = ConanVersion(v)
117117
return result
118118

119119
@property
@@ -165,8 +165,8 @@ def __repr__(self):
165165
def __eq__(self, other):
166166
if other is None:
167167
return False
168-
if not isinstance(other, Version):
169-
other = Version(other)
168+
if not isinstance(other, ConanVersion):
169+
other = ConanVersion(other)
170170

171171
return (self._nonzero_items, self._pre, self._build) == (
172172
other._nonzero_items,
@@ -180,8 +180,8 @@ def __hash__(self):
180180
def __lt__(self, other):
181181
if other is None:
182182
return False
183-
if not isinstance(other, Version):
184-
other = Version(other)
183+
if not isinstance(other, ConanVersion):
184+
other = ConanVersion(other)
185185

186186
if self._pre:
187187
if other._pre: # both are pre-releases

src/univers/conan/version_range.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import namedtuple
22

33
from univers.conan.errors import ConanException
4-
from univers.conan.version import Version
4+
from univers.conan.version import ConanVersion
55

66
_Condition = namedtuple("_Condition", ["operator", "version"])
77

@@ -21,7 +21,7 @@ def __init__(self, expression, prerelease):
2121
@staticmethod
2222
def _parse_expression(expression):
2323
if expression == "" or expression == "*":
24-
return [_Condition(">=", Version("0.0.0"))]
24+
return [_Condition(">=", ConanVersion("0.0.0"))]
2525

2626
operator = expression[0]
2727
if operator not in (">", "<", "^", "~", "="):
@@ -37,11 +37,11 @@ def _parse_expression(expression):
3737
if version == "":
3838
raise ConanException(f"Error parsing version range {expression}")
3939
if operator == "~": # tilde minor
40-
v = Version(version)
40+
v = ConanVersion(version)
4141
index = 1 if len(v.main) > 1 else 0
4242
return [_Condition(">=", v), _Condition("<", v.upper_bound(index))]
4343
elif operator == "^": # caret major
44-
v = Version(version)
44+
v = ConanVersion(version)
4545

4646
def first_non_zero(main):
4747
for i, m in enumerate(main):
@@ -52,7 +52,7 @@ def first_non_zero(main):
5252
initial_index = first_non_zero(v.main)
5353
return [_Condition(">=", v), _Condition("<", v.upper_bound(initial_index))]
5454
else:
55-
return [_Condition(operator, Version(version))]
55+
return [_Condition(operator, ConanVersion(version))]
5656

5757
def valid(self, version):
5858
if version.pre:
@@ -95,7 +95,7 @@ def __str__(self):
9595
return self._expression
9696

9797
def __contains__(self, version):
98-
assert isinstance(version, Version), type(version)
98+
assert isinstance(version, ConanVersion), type(version)
9999
for condition_set in self.condition_sets:
100100
if condition_set.valid(version):
101101
return True

src/univers/versions.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from univers import maven
1919
from univers import nuget
2020
from univers import rpm
21+
from univers.conan.version import ConanVersion as conan_version
2122
from univers.utils import remove_spaces
2223

2324
"""
@@ -139,6 +140,7 @@ def __eq__(self, other):
139140

140141
def __lt__(self, other):
141142
if not isinstance(other, self.__class__):
143+
print('Hello!')
142144
return NotImplemented
143145
return self.value.__lt__(other.value)
144146

@@ -650,3 +652,96 @@ def __ge__(self, other):
650652
return self.value.__ge__(other.value)
651653
# version value are of diff type, then semver one is always ahead of legacy
652654
return isinstance(self.value, SemverVersion)
655+
656+
class ConanVersion(Version):
657+
@classmethod
658+
def build_value(cls, string):
659+
return conan_version(string)
660+
661+
# def __eq__(self, other):
662+
# if not isinstance(other, self.__class__):
663+
# return NotImplemented
664+
# return conan_version.vercmp(self.value, other.value) == 0
665+
666+
def __eq__(self, other):
667+
if other is None:
668+
return False
669+
if not isinstance(other, conan_version):
670+
other = conan_version(other)
671+
672+
@classmethod
673+
def is_valid(cls, string):
674+
try:
675+
cls.build_value(string)
676+
return True
677+
except ValueError:
678+
return False
679+
680+
@property
681+
def major(self):
682+
return self.value and self.value.major
683+
684+
@property
685+
def minor(self):
686+
return self.value and self.value.minor
687+
688+
@property
689+
def patch(self):
690+
return self.value and self.value.patch
691+
692+
@property
693+
def prerelease(self):
694+
return self.value and self.value.prerelease
695+
696+
@property
697+
def build(self):
698+
return self.value and self.value.build
699+
700+
def next_major(self):
701+
return self.value and self.value.next_major()
702+
703+
def next_minor(self):
704+
return self.value and self.value.next_minor()
705+
706+
def next_patch(self):
707+
return self.value and self.value.next_patch()
708+
709+
@property
710+
def micro(self):
711+
# self.value()
712+
return self.value and self.value.micro
713+
714+
@property
715+
def pre(self):
716+
return self.value and self.value._pre
717+
718+
def __lt__(self, other):
719+
if other is None:
720+
return False
721+
if not isinstance(other, conan_version):
722+
other = conan_version(other)
723+
724+
if self.value._pre:
725+
if other._pre: # both are pre-releases
726+
return (self.value._nonzero_items, self.value._pre, self.value._build) < (
727+
other._nonzero_items,
728+
other._pre,
729+
other._build,
730+
)
731+
else: # Left hand is pre-release, right side is regular
732+
if (
733+
self.value._nonzero_items == other._nonzero_items
734+
): # Problem only happens if both equal
735+
return True
736+
else:
737+
return self.value._nonzero_items < other._nonzero_items
738+
else:
739+
if other._pre: # Left hand is regular, right side is pre-release
740+
if (
741+
self.value._nonzero_items == other._nonzero_items
742+
): # Problem only happens if both equal
743+
return False
744+
else:
745+
return self.value._nonzero_items < other._nonzero_items
746+
else: # None of them is pre-release
747+
return (self.value._nonzero_items, self.value._build) < (other._nonzero_items, other._build)

tests/test_conan_version_bump.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from univers.conan.version import Version
3+
from univers.conan.version import ConanVersion
44

55
values = [
66
["1.0.0", 0, "2.0.0"],
@@ -13,6 +13,6 @@
1313

1414
@pytest.mark.parametrize("version, index, result", values)
1515
def test_version_bump(version, index, result):
16-
r = Version(version)
16+
r = ConanVersion(version)
1717
bumped = r.bump(index)
1818
assert bumped == result

tests/test_conan_version_comparison.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from univers.conan.version import Version
3+
from univers.versions import ConanVersion
44

55
v = [
66
("1", "2"),
@@ -45,8 +45,8 @@
4545

4646
@pytest.mark.parametrize("v1, v2", v)
4747
def test_comparison(v1, v2):
48-
v1 = Version(v1)
49-
v2 = Version(v2)
48+
v1 = ConanVersion(v1)
49+
v2 = ConanVersion(v2)
5050
assert v1 < v2
5151
assert v2 > v1
5252
assert v1 != v2
@@ -55,7 +55,7 @@ def test_comparison(v1, v2):
5555

5656

5757
def test_comparison_with_integer():
58-
v1 = Version("13.0")
58+
v1 = ConanVersion("13.0")
5959
# Issue: https://github.com/conan-io/conan/issues/12907
6060
assert v1 > 5
6161
assert v1 >= 5
@@ -86,14 +86,14 @@ def test_comparison_with_integer():
8686

8787
@pytest.mark.parametrize("v1, v2", e)
8888
def test_equality(v1, v2):
89-
v1 = Version(v1)
90-
v2 = Version(v2)
89+
v1 = ConanVersion(v1)
90+
v2 = ConanVersion(v2)
9191
assert v1 == v2
9292
assert not v1 != v2
9393

9494

9595
def test_elem_comparison():
96-
v1 = Version("1.2.3b.4-pre.1.2b+build.1.1b")
96+
v1 = ConanVersion("1.2.3b.4-pre.1.2b+build.1.1b")
9797
major = v1.major
9898
assert major < 2
9999
assert major < "2"

tests/test_conan_version_range.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from univers.conan.errors import ConanException
4-
from univers.conan.version import Version
4+
from univers.conan.version import ConanVersion
55
from univers.conan.version_range import VersionRange
66

77
values = [
@@ -55,10 +55,10 @@ def test_range(version_range, conditions, versions_in, versions_out):
5555
assert condition.version == expected_condition[1]
5656

5757
for v in versions_in:
58-
assert Version(v) in r
58+
assert ConanVersion(v) in r
5959

6060
for v in versions_out:
61-
assert Version(v) not in r
61+
assert ConanVersion(v) not in r
6262

6363

6464
def test_wrong_range_syntax():

0 commit comments

Comments
 (0)