Skip to content

Commit

Permalink
Added sort support compatible with python version 2 and 3
Browse files Browse the repository at this point in the history
  • Loading branch information
apieum committed Nov 27, 2014
1 parent 11541df commit f92087c
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
70 changes: 69 additions & 1 deletion weakreflist/testweakreflist.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,19 @@

class WeakrefListTest(unittest.TestCase):
class objectFake(object):
pass
__count__= 0
def __init__(self):
type(self).__count__ +=1
self.index = type(self).__count__

def __gt__(self, other):
return self.index > other.index

def __lt__(self, other):
return self.index < other.index

def __eq__(self, other):
return self.index == other.index

def setUp(self):
self.wr_list = WeakList()
Expand Down Expand Up @@ -178,6 +190,62 @@ def test_it_supports_reverse(self):
self.assertEqual(self.ref_item(0)(), fake_obj1)
self.assertEqual(self.ref_item(1)(), fake_obj0)

def test_it_supports_sort(self):
fake_obj0 = self.objectFake()
fake_obj1 = self.objectFake()
self.wr_list.extend([fake_obj1, fake_obj0])
expected = WeakList(sorted(list(self.wr_list)))
self.wr_list.sort()
self.assertGreater(fake_obj1, fake_obj0)
self.assertEqual(expected, self.wr_list)

def test_it_supports_sort_with_reverse(self):
fake_obj0 = self.objectFake()
fake_obj1 = self.objectFake()
self.wr_list.extend([fake_obj0, fake_obj1])
expected = WeakList(sorted(list(self.wr_list), reverse=True))
not_expected = WeakList(sorted(list(self.wr_list)))
self.wr_list.sort(reverse=True)
self.assertEqual(expected, self.wr_list)
self.assertNotEqual(not_expected, self.wr_list)

def test_it_supports_sort_with_key(self):
def index_plus_2_if_odd(item):
return item.index + 2 if item.index % 2 != 0 else item.index
fake_obj0 = self.objectFake()
fake_obj1 = self.objectFake()
self.wr_list.extend([fake_obj1, fake_obj0])
expected = WeakList(sorted(list(self.wr_list), key=index_plus_2_if_odd))
self.wr_list.sort(key=index_plus_2_if_odd)
self.assertEqual(expected, self.wr_list)

if sys.version_info < (3, ):
def test_it_supports_sort_with_cmp(self):
def compare(item1, item2):
return cmp(item2.index, item1.index)

fake_obj0 = self.objectFake()
fake_obj1 = self.objectFake()
self.wr_list.extend([fake_obj0, fake_obj1])
expected = WeakList(sorted(list(self.wr_list), cmp=compare))
not_expected = WeakList(sorted(list(self.wr_list)))
self.wr_list.sort(cmp=compare)
self.assertEqual(expected, self.wr_list)
self.assertNotEqual(not_expected, self.wr_list)

def test_it_supports_sort_with_key_and_cmp(self):
def index_plus_2_if_odd(item):
return item.index + 2 if item.index % 2 != 0 else item.index
def compare(item1, item2):
return cmp(item2, item1)

fake_obj0 = self.objectFake()
fake_obj1 = self.objectFake()
self.wr_list.extend([fake_obj0, fake_obj1])
expected = WeakList(sorted(list(self.wr_list), cmp=compare, key=index_plus_2_if_odd))
self.wr_list.sort(cmp=compare, key=index_plus_2_if_odd)
self.assertEqual(expected, self.wr_list)



if __name__ == "__main__":
Expand Down
11 changes: 11 additions & 0 deletions weakreflist/weakreflist.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# -*- coding: utf8 -*-
from weakref import ref, ReferenceType
import sys


class WeakList(list):
Expand Down Expand Up @@ -58,3 +59,13 @@ def insert(self, index, item):

def extend(self, items):
return list.extend(self, map(self.make_ref, items))

def _sort_key(self, key=None):
return self.get_value if key == None else lambda item: key(self.get_value(item))

if sys.version_info < (3,):
def sort(self, cmp=None, key=None, reverse=False):
return list.sort(self, cmp=cmp, key=self._sort_key(key), reverse=reverse)
else:
def sort(self, key=None, reverse=False):
return list.sort(self, key=self._sort_key(key), reverse=reverse)

0 comments on commit f92087c

Please sign in to comment.