Commit e84cc35f authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

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

parent ff0eafe3
...@@ -144,6 +144,19 @@ else: ...@@ -144,6 +144,19 @@ else:
# Generic sort method # 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 = {} sort_kw_cache = {}
def sortValueList(value_list, sort_on=None, sort_order=None, **kw): 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): ...@@ -201,7 +214,10 @@ def sortValueList(value_list, sort_on=None, sort_order=None, **kw):
except TypeError: except TypeError:
pass pass
value_list.append(x) value_list.append(x)
if six.PY2:
return value_list return value_list
else:
return [OrderableKey(e) for e in value_list]
sort_kw = {'key':sortValue, 'reverse':reverse} sort_kw = {'key':sortValue, 'reverse':reverse}
sort_kw_cache[(sort_on, sort_order)] = sort_kw sort_kw_cache[(sort_on, sort_order)] = sort_kw
else: else:
......
...@@ -38,7 +38,7 @@ from Acquisition import aq_base ...@@ -38,7 +38,7 @@ from Acquisition import aq_base
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
from AccessControl.ZopeGuards import guarded_import from AccessControl.ZopeGuards import guarded_import
from Products.ERP5Type.tests.utils import LogInterceptor, createZODBPythonScript 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): class TestERP5Type(ERP5TypeTestCase, LogInterceptor):
""" """
...@@ -296,6 +296,16 @@ class TestERP5Type(ERP5TypeTestCase, LogInterceptor): ...@@ -296,6 +296,16 @@ class TestERP5Type(ERP5TypeTestCase, LogInterceptor):
self.assertEqual(cmp(None, ''), -1) self.assertEqual(cmp(None, ''), -1)
self.assertEqual(cmp(0, ''), -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(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestERP5Type)) 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