Commit c1ca28bd authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki Committed by Jérome Perrin

py2/py3: define OrderableKey that uses legacy cmp for ordering.

parent eb3fa326
......@@ -144,6 +144,19 @@ else:
# Generic sort method
#####################################################
if six.PY2:
OrderableKey = lambda x: x
else:
class OrderableKey(object):
def __init__(self, value):
self.value = value
def __lt__(self, other):
return cmp(self.value, other.value) != 1
def __repr__(self):
return 'OrderableKey(%r)' % self.value
sort_kw_cache = {}
def sortValueList(value_list, sort_on=None, sort_order=None, **kw):
......@@ -201,7 +214,10 @@ def sortValueList(value_list, sort_on=None, sort_order=None, **kw):
except TypeError:
pass
value_list.append(x)
if six.PY2:
return value_list
else:
return [OrderableKey(e) for e in value_list]
sort_kw = {'key':sortValue, 'reverse':reverse}
sort_kw_cache[(sort_on, sort_order)] = sort_kw
else:
......
......@@ -38,7 +38,7 @@ from Acquisition import aq_base
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from AccessControl.ZopeGuards import guarded_import
from Products.ERP5Type.tests.utils import LogInterceptor, createZODBPythonScript
from Products.ERP5Type.Utils import cmp
from Products.ERP5Type.Utils import OrderableKey, cmp
class TestERP5Type(ERP5TypeTestCase, LogInterceptor):
"""
......@@ -296,6 +296,16 @@ class TestERP5Type(ERP5TypeTestCase, LogInterceptor):
self.assertEqual(cmp(None, ''), -1)
self.assertEqual(cmp(0, ''), -1)
def test_OrderableKey(self):
self.assertEqual(
sorted([1, '', None], key=lambda x: OrderableKey(x)),
[None, 1, '']
)
o1 = [OrderableKey(e) for e in (None, 1)]
o2 = [OrderableKey(e) for e in (0, 0)]
self.assertEqual(sorted([o1, o2]), [o1, o2])
self.assertEqual(sorted([o2, o1]), [o1, o2])
def test_suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestERP5Type))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment