Skip to content

Commit a11ee11

Browse files
committed
Updates based on Copilot code review
1 parent 21c19ac commit a11ee11

2 files changed

Lines changed: 34 additions & 29 deletions

File tree

cassandra/util.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,17 +1692,21 @@ def __repr__(self):
16921692
self.lower_bound, self.upper_bound, self.value
16931693
)
16941694

1695-
VERSION_REGEX = re.compile("(\\d+)\\.(\\d+)(\\.\\d+)?(\\.\\d+)?([~\\-]\\w[.\\w]*(?:-\\w[.\\w]*)*)?(\\+[.\\w]+)?")
1695+
VERSION_REGEX = re.compile("^(\\d+)\\.(\\d+)(\\.\\d+)?(\\.\\d+)?([~\\-]\\w[.\\w]*(?:-\\w[.\\w]*)*)?(\\+[.\\w]+)?$")
16961696

16971697
@total_ordering
16981698
class Version(object):
1699+
"""
1700+
Representation of a Cassandra version. Mostly follows the implementation of the same logic in the Java driver;
1701+
see https://github.com/apache/cassandra-java-driver/blob/4.19.2/core/src/main/java/com/datastax/oss/driver/api/core/Version.java
1702+
"""
16991703

17001704
def __init__(self, version):
17011705
self._version = version
17021706

17031707
match = VERSION_REGEX.match(version)
17041708
if not match:
1705-
raise ValueError("Version string did not match expected format")
1709+
raise ValueError("Version string {0} did not match expected format".format(version))
17061710

17071711
self.major = int(match[1])
17081712
self.minor = int(match[2])
@@ -1723,15 +1727,15 @@ def __init__(self, version):
17231727
self.prerelease = 0
17241728

17251729
# Trim off the leading '.' characters and convert the discovered value to an integer
1726-
def _cleanup_int(self, s):
1727-
return int(s[1:]) if s else 0
1730+
def _cleanup_int(self, instr):
1731+
return int(instr[1:]) if instr else 0
17281732

17291733
# Trim off the leading '.' or '~' characters and just return the string directly
1730-
def _cleanup_str(self, str):
1731-
return str[1:] if str else 0
1734+
def _cleanup_str(self, instr):
1735+
return instr[1:] if instr else 0
17321736

17331737
def __hash__(self):
1734-
return self._version
1738+
return hash((self.major, self.minor, self.patch, self.build, self.prerelease))
17351739

17361740
def __repr__(self):
17371741
version_string = "Version({0}, {1}, {2}".format(self.major, self.minor, self.patch)

tests/unit/test_util_types.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -216,18 +216,9 @@ def test_version_parsing(self):
216216
('1.2-beta1-SNAPSHOT', (1, 2, 0, 0, 'beta1-SNAPSHOT')),
217217
('1.2~beta1-SNAPSHOT', (1, 2, 0, 0, 'beta1-SNAPSHOT')),
218218
('1.2.19.2-SNAPSHOT', (1, 2, 19, 2, 'SNAPSHOT')),
219-
220-
# We also include a few test cases from the former impl of this class, mainly to note differences in behaviours
221-
222-
# Note that prerelease tags are expected to start with a hyphen or tilde so the expected tag is
223-
# lost in all cases below
224-
('3.55.1.build12', (3, 55, 1, 0, 0)),
225-
('1.0.5.4.3', (1, 0, 5, 4, 0)),
226-
('2.1.hello', (2, 1, 0, 0, 0))
227219
]
228220

229221
for str_version, expected_result in versions:
230-
print(str_version)
231222
v = Version(str_version)
232223
self.assertEqual(str_version, str(v))
233224
self.assertEqual(v.major, expected_result[0])
@@ -245,7 +236,6 @@ def test_version_parsing(self):
245236
]
246237

247238
for v in unsupported_versions:
248-
print(v)
249239
with self.assertRaises(ValueError):
250240
Version(v)
251241

@@ -286,18 +276,29 @@ def test_version_compare(self):
286276
self.assertTrue(Version('4.0') == Version('4.0.0.0'))
287277
self.assertTrue(Version('4.0') > Version('3.9.3'))
288278

289-
self.assertTrue(Version('4.0') > Version('4.0-SNAPSHOT'))
290-
self.assertTrue(Version('4.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
291-
self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
292-
self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0.0-SNAPSHOT'))
293-
self.assertTrue(Version('4.0.0.5-SNAPSHOT') == Version('4.0.0.5-SNAPSHOT'))
294-
self.assertTrue(Version('4.1-SNAPSHOT') > Version('4.0-SNAPSHOT'))
295-
self.assertTrue(Version('4.0.1-SNAPSHOT') > Version('4.0.0-SNAPSHOT'))
296-
self.assertTrue(Version('4.0.0.6-SNAPSHOT') > Version('4.0.0.5-SNAPSHOT'))
297-
self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0-SNAPSHOT1'))
298-
self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0.0-SNAPSHOT1'))
299-
300-
self.assertTrue(Version('4.0.0-alpha1-SNAPSHOT') > Version('4.0.0-SNAPSHOT'))
279+
280+
equalTuples = [
281+
(Version('4.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
282+
(Version('4.0.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
283+
(Version('4.0.0-SNAPSHOT'), Version('4.0.0-SNAPSHOT')),
284+
(Version('4.0.0.5-SNAPSHOT'), Version('4.0.0.5-SNAPSHOT'))
285+
]
286+
for (a,b) in equalTuples:
287+
self.assertEqual(a, b)
288+
self.assertEqual(hash(a), hash(b))
289+
290+
leftgreaterTuples = [
291+
(Version('4.0'), Version('4.0-SNAPSHOT')),
292+
(Version('4.1-SNAPSHOT'), Version('4.0-SNAPSHOT')),
293+
(Version('4.0.1-SNAPSHOT'), Version('4.0.0-SNAPSHOT')),
294+
(Version('4.0.0.6-SNAPSHOT'), Version('4.0.0.5-SNAPSHOT')),
295+
(Version('4.0-SNAPSHOT2'), Version('4.0-SNAPSHOT1')),
296+
(Version('4.0-SNAPSHOT2'), Version('4.0.0-SNAPSHOT1')),
297+
(Version('4.0.0-alpha1-SNAPSHOT'), Version('4.0.0-SNAPSHOT'))
298+
]
299+
for (a,b) in leftgreaterTuples:
300+
self.assertGreater(a, b)
301+
self.assertNotEqual(hash(a), hash(b))
301302

302303
# Test the version limit for v4 schema parsing in cassandra.metadata to make sure
303304
# all 4.0.x Cassandra servers are covered

0 commit comments

Comments
 (0)