[PATCH] D67820: [LNT] Python 3 support: get rid of calls to cmp builtin

Thomas Preud'homme via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 20 01:42:32 PDT 2019


thopre created this revision.
thopre added reviewers: cmatthews, hubert.reinterpretcast, kristof.beyls.
Herald added subscribers: dexonsmith, mehdi_amini.
thopre added a parent revision: D67819: [LNT] Python 3 support: adapt to zip returning a view.
thopre added a child revision: D67821: [LNT] Python 3 support: use Python 2's division behavior.

Get rid of calls to cmp builtins since it was removed in Python 3. For
the tests, the assignment to sortTestMethodsUsing is removed altogether
since there is no call to getTestCaseNames or loadTestsFrom* methods and
the default is the built-in ordering for strings.

For the call in the TestsuiteDB.Order class, we define the rich
comparison methods that have replaced cmp.


https://reviews.llvm.org/D67820

Files:
  lnt/server/db/testsuitedb.py
  tests/server/ui/test_api_modify.py
  tests/server/ui/test_api_roundtrip.py


Index: tests/server/ui/test_api_roundtrip.py
===================================================================
--- tests/server/ui/test_api_roundtrip.py
+++ tests/server/ui/test_api_roundtrip.py
@@ -57,5 +57,4 @@
 
 
 if __name__ == '__main__':
-    unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: cmp(x, y)
     unittest.main(argv=[sys.argv[0], ])
Index: tests/server/ui/test_api_modify.py
===================================================================
--- tests/server/ui/test_api_modify.py
+++ tests/server/ui/test_api_modify.py
@@ -226,5 +226,4 @@
 
 
 if __name__ == '__main__':
-    unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: cmp(x, y)
     unittest.main(argv=[sys.argv[0], ])
Index: lnt/server/db/testsuitedb.py
===================================================================
--- lnt/server/db/testsuitedb.py
+++ lnt/server/db/testsuitedb.py
@@ -207,8 +207,8 @@
             __tablename__ = db_key_name + '_Order'
 
             # We guarantee that our fields are stored in the order they are
-            # supposed to be lexicographically compared, the __cmp__ method
-            # relies on this.
+            # supposed to be lexicographically compared, the rich comparison
+            # methods rely on this.
             fields = sorted(self.order_fields,
                             key=lambda of: of.ordinal)
 
@@ -273,17 +273,52 @@
             def name(self):
                 return self.as_ordered_string()
 
-            def __cmp__(self, b):
+            def _prepare_compare(self, b):
+                """Prepare order b for comparison against order self."""
                 # SA occasionally uses comparison to check model instances
                 # verse some sentinels, so we ensure we support comparison
                 # against non-instances.
                 if self.__class__ is not b.__class__:
-                    return -1
-                # Compare every field in lexicographic order.
-                return cmp([convert_revision(self.get_field(item), cache=Order.order_name_cache)
-                            for item in self.fields],
-                           [convert_revision(b.get_field(item),  cache=Order.order_name_cache)
-                            for item in self.fields])
+                    return (0, 1)
+
+                return (
+                    [
+                        convert_revision(
+                            self.get_field(item), cache=Order.order_name_cache
+                        )
+                        for item in self.fields
+                    ],
+                    [
+                        convert_revision(
+                            b.get_field(item), cache=Order.order_name_cache
+                        )
+                        for item in self.fields
+                    ],
+                )
+
+            def __eq__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self == prepared_b
+
+            def __ne__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self != prepared_b
+
+            def __lt__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self < prepared_b
+
+            def __le__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self <= prepared_b
+
+            def __gt__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self > prepared_b
+
+            def __ge__(self, b):
+                prepared_self, prepared_b = self._prepare_compare(b)
+                return prepared_self >= prepared_b
 
             def __json__(self, include_id=True):
                 result = {}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67820.220979.patch
Type: text/x-patch
Size: 3867 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190920/0ba22edd/attachment.bin>


More information about the llvm-commits mailing list