Copilot commented on code in PR #1273:
URL: 
https://github.com/apache/cassandra-python-driver/pull/1273#discussion_r2908129731


##########
tests/unit/test_util_types.py:
##########
@@ -251,41 +254,54 @@ def test_version_compare(self):
 
         # patch wins
         self.assertTrue(Version('2.3.1') > Version('2.3.0'))
-        self.assertTrue(Version('2.3.1') > Version('2.3.0.4post0'))
+        self.assertTrue(Version('2.3.1') > Version('2.3.0-4post0'))
         self.assertTrue(Version('2.3.1') > Version('2.3.0.44'))
 
         # various
         self.assertTrue(Version('2.3.0.1') > Version('2.3.0.0'))
         self.assertTrue(Version('2.3.0.680') > Version('2.3.0.670'))
         self.assertTrue(Version('2.3.0.681') > Version('2.3.0.680'))
-        self.assertTrue(Version('2.3.0.1build0') > Version('2.3.0.1'))  # 4th 
part fallback to str cmp
-        self.assertTrue(Version('2.3.0.build0') > Version('2.3.0.1'))  # 4th 
part fallback to str cmp
-        self.assertTrue(Version('2.3.0') < Version('2.3.0.build'))
-
-        self.assertTrue(Version('4-a') <= Version('4.0.0'))
-        self.assertTrue(Version('4-a') <= Version('4.0-alpha1'))
-        self.assertTrue(Version('4-a') <= Version('4.0-beta1'))
-        self.assertTrue(Version('4.0.0') >= Version('4.0.0'))
-        self.assertTrue(Version('4.0.0.421') >= Version('4.0.0'))
-        self.assertTrue(Version('4.0.1') >= Version('4.0.0'))
+
+        # If builds are equal then a prerelease always comes before
+        self.assertTrue(Version('2.3.0.1-SNAPSHOT') < Version('2.3.0.1'))
+
+        # If both have prereleases we fall back to a string compare
+        self.assertTrue(Version('2.3.0.1-SNAPSHOT') < 
Version('2.3.0.1-ZNAPSHOT'))
+
         self.assertTrue(Version('2.3.0') == Version('2.3.0'))
         self.assertTrue(Version('2.3.32') == Version('2.3.32'))
         self.assertTrue(Version('2.3.32') == Version('2.3.32.0'))
-        self.assertTrue(Version('2.3.0.build') == Version('2.3.0.build'))
+        self.assertTrue(Version('2.3.0-SNAPSHOT') == Version('2.3.0-SNAPSHOT'))
 
-        self.assertTrue(Version('4') == Version('4.0.0'))
         self.assertTrue(Version('4.0') == Version('4.0.0.0'))
         self.assertTrue(Version('4.0') > Version('3.9.3'))
 
-        self.assertTrue(Version('4.0') > Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0.build5-SNAPSHOT') == 
Version('4.0.0.build5-SNAPSHOT'))
-        self.assertTrue(Version('4.1-SNAPSHOT') > Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.1-SNAPSHOT') > Version('4.0.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0.build6-SNAPSHOT') > 
Version('4.0.0.build5-SNAPSHOT'))
-        self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0-SNAPSHOT1'))
-        self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0.0-SNAPSHOT1'))
-
-        self.assertTrue(Version('4.0.0-alpha1-SNAPSHOT') > 
Version('4.0.0-SNAPSHOT'))
+
+        equalTuples = [
+            (Version('4.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
+            (Version('4.0.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
+            (Version('4.0.0-SNAPSHOT'), Version('4.0.0-SNAPSHOT')),
+            (Version('4.0.0.5-SNAPSHOT'), Version('4.0.0.5-SNAPSHOT'))
+        ]

Review Comment:
   These new local variables use mixedCase (`equalTuples`, 
`leftgreaterTuples`), which is inconsistent with the prevailing snake_case 
style in this test module. Renaming them to snake_case will improve readability 
and align with project conventions.



##########
cassandra/util.py:
##########
@@ -1692,57 +1692,53 @@ def __repr__(self):
             self.lower_bound, self.upper_bound, self.value
         )
 
+VERSION_REGEX = 
re.compile("^(\\d+)\\.(\\d+)(\\.\\d+)?(\\.\\d+)?([~\\-]\\w[.\\w]*(?:-\\w[.\\w]*)*)?(\\+[.\\w]+)?$")
 
 @total_ordering
 class Version(object):
     """
-    Internal minimalist class to compare versions.
-    A valid version is: <int>.<int>.<int>.<int or str>.
-
-    TODO: when python2 support is removed, use packaging.version.
+    Representation of a Cassandra version.  Mostly follows the implementation 
of the same logic in the Java driver;
+    see 
https://github.com/apache/cassandra-java-driver/blob/4.19.2/core/src/main/java/com/datastax/oss/driver/api/core/Version.java
     """

Review Comment:
   The `Version` docstring still doesn’t describe the supported Cassandra 
version formats or the comparison semantics (e.g., major/minor required, 
optional patch/build, `-`/`~` prerelease ordering, and whether `+...` build 
metadata is ignored). Since parsing/ordering behavior changed significantly, 
please document the accepted grammar and how prerelease/build metadata affect 
equality and ordering so callers don’t have to infer it from the 
regex/implementation.



##########
tests/unit/test_util_types.py:
##########
@@ -251,41 +254,54 @@ def test_version_compare(self):
 
         # patch wins
         self.assertTrue(Version('2.3.1') > Version('2.3.0'))
-        self.assertTrue(Version('2.3.1') > Version('2.3.0.4post0'))
+        self.assertTrue(Version('2.3.1') > Version('2.3.0-4post0'))
         self.assertTrue(Version('2.3.1') > Version('2.3.0.44'))
 
         # various
         self.assertTrue(Version('2.3.0.1') > Version('2.3.0.0'))
         self.assertTrue(Version('2.3.0.680') > Version('2.3.0.670'))
         self.assertTrue(Version('2.3.0.681') > Version('2.3.0.680'))
-        self.assertTrue(Version('2.3.0.1build0') > Version('2.3.0.1'))  # 4th 
part fallback to str cmp
-        self.assertTrue(Version('2.3.0.build0') > Version('2.3.0.1'))  # 4th 
part fallback to str cmp
-        self.assertTrue(Version('2.3.0') < Version('2.3.0.build'))
-
-        self.assertTrue(Version('4-a') <= Version('4.0.0'))
-        self.assertTrue(Version('4-a') <= Version('4.0-alpha1'))
-        self.assertTrue(Version('4-a') <= Version('4.0-beta1'))
-        self.assertTrue(Version('4.0.0') >= Version('4.0.0'))
-        self.assertTrue(Version('4.0.0.421') >= Version('4.0.0'))
-        self.assertTrue(Version('4.0.1') >= Version('4.0.0'))
+
+        # If builds are equal then a prerelease always comes before
+        self.assertTrue(Version('2.3.0.1-SNAPSHOT') < Version('2.3.0.1'))
+
+        # If both have prereleases we fall back to a string compare
+        self.assertTrue(Version('2.3.0.1-SNAPSHOT') < 
Version('2.3.0.1-ZNAPSHOT'))
+
         self.assertTrue(Version('2.3.0') == Version('2.3.0'))
         self.assertTrue(Version('2.3.32') == Version('2.3.32'))
         self.assertTrue(Version('2.3.32') == Version('2.3.32.0'))
-        self.assertTrue(Version('2.3.0.build') == Version('2.3.0.build'))
+        self.assertTrue(Version('2.3.0-SNAPSHOT') == Version('2.3.0-SNAPSHOT'))
 
-        self.assertTrue(Version('4') == Version('4.0.0'))
         self.assertTrue(Version('4.0') == Version('4.0.0.0'))
         self.assertTrue(Version('4.0') > Version('3.9.3'))
 
-        self.assertTrue(Version('4.0') > Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0-SNAPSHOT') == Version('4.0.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0.build5-SNAPSHOT') == 
Version('4.0.0.build5-SNAPSHOT'))
-        self.assertTrue(Version('4.1-SNAPSHOT') > Version('4.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.1-SNAPSHOT') > Version('4.0.0-SNAPSHOT'))
-        self.assertTrue(Version('4.0.0.build6-SNAPSHOT') > 
Version('4.0.0.build5-SNAPSHOT'))
-        self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0-SNAPSHOT1'))
-        self.assertTrue(Version('4.0-SNAPSHOT2') > Version('4.0.0-SNAPSHOT1'))
-
-        self.assertTrue(Version('4.0.0-alpha1-SNAPSHOT') > 
Version('4.0.0-SNAPSHOT'))
+
+        equalTuples = [
+            (Version('4.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
+            (Version('4.0.0-SNAPSHOT'), Version('4.0-SNAPSHOT')),
+            (Version('4.0.0-SNAPSHOT'), Version('4.0.0-SNAPSHOT')),
+            (Version('4.0.0.5-SNAPSHOT'), Version('4.0.0.5-SNAPSHOT'))
+        ]
+        for (a,b) in equalTuples:
+            self.assertEqual(a, b)
+            self.assertEqual(hash(a), hash(b))
+
+        leftgreaterTuples = [
+            (Version('4.0'), Version('4.0-SNAPSHOT')),
+            (Version('4.1-SNAPSHOT'), Version('4.0-SNAPSHOT')),
+            (Version('4.0.1-SNAPSHOT'), Version('4.0.0-SNAPSHOT')),
+            (Version('4.0.0.6-SNAPSHOT'), Version('4.0.0.5-SNAPSHOT')),
+            (Version('4.0-SNAPSHOT2'), Version('4.0-SNAPSHOT1')),
+            (Version('4.0-SNAPSHOT2'), Version('4.0.0-SNAPSHOT1')),
+            (Version('4.0.0-alpha1-SNAPSHOT'), Version('4.0.0-SNAPSHOT'))
+        ]
+        for (a,b) in leftgreaterTuples:
+            self.assertGreater(a, b)
+            self.assertNotEqual(hash(a), hash(b))
+

Review Comment:
   The assertions that `hash(a) != hash(b)` are not valid: Python only requires 
equal objects to have equal hashes; unequal objects may legally collide. This 
can make the test flaky and also over-constrains the `Version.__hash__` 
implementation. Consider removing these hash-inequality assertions and keep the 
`assertNotEqual(a, b)` / `assertGreater(a, b)` checks instead.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to