Skip to content

Commit

Permalink
Fix #2 setting slices
Browse files Browse the repository at this point in the history
  • Loading branch information
apieum committed Nov 27, 2014
1 parent c3f2f0f commit a6b8939
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
23 changes: 20 additions & 3 deletions weakreflist/testweakreflist.py
Expand Up @@ -15,19 +15,22 @@ class objectFake(object):
def setUp(self):
self.wrList = WeakList()

def ref_item(self, index):
return list.__getitem__(self.wrList, index)

def test_it_is_instance_of_list(self):
self.assertIsInstance(self.wrList, list)

def test_it_store_a_weakref_ref(self):
myFake = self.objectFake()
self.wrList.append(myFake)
self.assertIsInstance(list.__getitem__(self.wrList, 0), weakref.ReferenceType)
self.assertIsInstance(self.ref_item(0), weakref.ReferenceType)

def test_if_a_weakref_already_stored_it_reuse_it(self):
myFake = self.objectFake()
self.wrList.append(myFake)
self.wrList.append(myFake)
self.assertEqual(list.__getitem__(self.wrList, 0), list.__getitem__(self.wrList, 1))
self.assertEqual(self.ref_item(0), self.ref_item(1))
self.assertIs(self.wrList[0], self.wrList[1])

def test_it_knows_if_it_contains_an_object(self):
Expand Down Expand Up @@ -114,7 +117,21 @@ def test_it_supports_slice_on_objects(self):
myFake3 = self.objectFake()
myFake4 = self.objectFake()
wrList = WeakList([myFake1, myFake2, myFake3, myFake4])
self.assertEqual([myFake2, myFake3], list(wrList[1:3]))
self.assertEqual(WeakList([myFake2, myFake3]), wrList[1:3])

def test_it_can_set_slice_on_int(self):
self.wrList[0:] = range(3)
self.assertEqual(self.wrList[1:], [1, 2])
self.assertEqual(3, len(self.wrList))

def test_it_can_set_slice_on_objets(self):
myFake0 = self.objectFake()
myFake1 = self.objectFake()
self.wrList.append(myFake0)
self.wrList[1:2] = [myFake0, myFake1]
self.assertEqual(self.ref_item(1)(), myFake0)
self.assertEqual(self.ref_item(2)(), myFake1)
self.assertEqual(3, len(self.wrList))



Expand Down
6 changes: 5 additions & 1 deletion weakreflist/weakreflist.py
Expand Up @@ -31,7 +31,11 @@ def __getslice__(self, from_index, to_index):
return self.__getitem__(slice(from_index, to_index))

def __setitem__(self, index, item):
return list.__setitem__(self, index, self.make_ref(item))
items = isinstance(index, slice) and map(self.make_ref, item) or self.make_ref(item)
return list.__setitem__(self, index, items)

def __setslice__(self, from_index, to_index, items):
return self.__setitem__(slice(from_index, to_index), items)

def __iter__(self):
return iter(self[index] for index in range(len(self)))
Expand Down

0 comments on commit a6b8939

Please sign in to comment.