aboutsummaryrefslogtreecommitdiffstats
path: root/src/pyexiv2.py
diff options
context:
space:
mode:
authorOlivier Tilloy <olivier@tilloy.net>2009-05-07 09:29:35 +0200
committerOlivier Tilloy <olivier@tilloy.net>2009-05-07 09:29:35 +0200
commit553c77075a35347ea96c646ef19a9188ae096018 (patch)
treebda8a3a757beb4647834d9dbfac27bbc3c8cc747 /src/pyexiv2.py
parent8189c1ee21be899f090eef7211c12e10a11a9f53 (diff)
downloadpyexiv2-553c77075a35347ea96c646ef19a9188ae096018.tar.gz
Reorganized the notifying list unit tests in separate methods.
Support old-style slicing with __setslice__ and __delslice__.
Diffstat (limited to 'src/pyexiv2.py')
-rw-r--r--src/pyexiv2.py55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/pyexiv2.py b/src/pyexiv2.py
index ca0506f..1a8a2c4 100644
--- a/src/pyexiv2.py
+++ b/src/pyexiv2.py
@@ -281,8 +281,6 @@ class NotifyingList(list):
# file:///usr/share/doc/python2.5/html/lib/typesseq-mutable.html
# http://docs.python.org/reference/datamodel.html#additional-methods-for-emulation-of-sequence-types
- # FIXME: support negatives indexes where relevant
-
def __init__(self, items=[]):
super(NotifyingList, self).__init__(items)
self._listeners = set()
@@ -297,13 +295,23 @@ class NotifyingList(list):
for listener in self._listeners:
getattr(listener, method_name)(*args)
+ def _positive_index(self, index):
+ # Convert a negative index to its positive representation.
+ length = len(self)
+ if index < 0:
+ return length + index
+ elif index > length:
+ return length
+ else:
+ return index
+
def __setitem__(self, index, item):
- # FIXME: support slice arguments
+ # FIXME: support slice arguments for extended slicing
super(NotifyingList, self).__setitem__(index, item)
self._notify_listeners('items_changed', index, [item])
def __delitem__(self, index):
- # FIXME: support slice arguments
+ # FIXME: support slice arguments for extended slicing
super(NotifyingList, self).__delitem__(index)
self._notify_listeners('items_deleted', index, index + 1)
@@ -318,14 +326,18 @@ class NotifyingList(list):
self._notify_listeners('items_inserted', index, items)
def insert(self, index, item):
+ start = self._positive_index(index)
super(NotifyingList, self).insert(index, item)
- self._notify_listeners('items_inserted', index, [item])
+ self._notify_listeners('items_inserted', start, [item])
def pop(self, index=None):
if index is None:
- index = len(self) - 1
- item = super(NotifyingList, self).pop(index)
- self._notify_listeners('items_deleted', index, index + 1)
+ start = len(self) - 1
+ item = super(NotifyingList, self).pop()
+ else:
+ start = self._positive_index(index)
+ item = super(NotifyingList, self).pop(index)
+ self._notify_listeners('items_deleted', start, start + 1)
return item
def remove(self, item):
@@ -353,11 +365,32 @@ class NotifyingList(list):
self._notify_listeners('items_inserted', index, self[index:])
return self
- def __setslice__(self, i, j, sequence):
- raise NotImplementedError()
+ def __setslice__(self, i, j, items):
+ # __setslice__ is deprecated but needs to be overridden for completeness
+ start, end = self._positive_index(i), self._positive_index(j)
+ deleted = self[start:end]
+ super(NotifyingList, self).__setslice__(i, j, items)
+ old_size = end - start
+ new_size = len(items)
+ diff = new_size - old_size
+ if diff == 0:
+ self._notify_listeners('items_changed', start, items)
+ elif diff < 0:
+ if new_size > 0:
+ self._notify_listeners('items_changed', start, items)
+ self._notify_listeners('items_deleted', start + new_size, end)
+ elif diff > 0:
+ if old_size > 0:
+ self._notify_listeners('items_deleted', start, end)
+ self._notify_listeners('items_inserted', start, items)
def __delslice__(self, i, j):
- raise NotImplementedError()
+ # __delslice__ is deprecated but needs to be overridden for completeness
+ start, end = self._positive_index(i), self._positive_index(j)
+ deleted = self[start:end]
+ super(NotifyingList, self).__delslice__(i, j)
+ if deleted:
+ self._notify_listeners('items_deleted', start, end)
class MetadataTag(object):