From: Mike Bayer Date: Sat, 30 May 2009 18:52:26 +0000 (+0000) Subject: orderinglist slice fixes X-Git-Tag: rel_0_6_6~195 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c22048b96df9f087f9e691f12015db0ad9a38b1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git orderinglist slice fixes --- diff --git a/lib/sqlalchemy/ext/orderinglist.py b/lib/sqlalchemy/ext/orderinglist.py index a5d60bf82e..8e63ed1c29 100644 --- a/lib/sqlalchemy/ext/orderinglist.py +++ b/lib/sqlalchemy/ext/orderinglist.py @@ -240,7 +240,8 @@ class OrderingList(list): _raw_append = collection.adds(1)(_raw_append) def insert(self, index, entity): - self[index:index] = [entity] + super(OrderingList, self).insert(index, entity) + self._reorder() def remove(self, entity): super(OrderingList, self).remove(entity) @@ -253,7 +254,15 @@ class OrderingList(list): def __setitem__(self, index, entity): if isinstance(index, slice): - for i in range(index.start or 0, index.stop or 0, index.step or 1): + step = index.step or 1 + start = index.start or 0 + if start < 0: + start += len(self) + stop = index.stop or len(self) + if stop < 0: + stop += len(self) + + for i in xrange(start, stop, step): self.__setitem__(i, entity[i]) else: self._order_entity(index, entity, True) @@ -263,6 +272,7 @@ class OrderingList(list): super(OrderingList, self).__delitem__(index) self._reorder() + # Py2K def __setslice__(self, start, end, values): super(OrderingList, self).__setslice__(start, end, values) self._reorder() @@ -270,7 +280,8 @@ class OrderingList(list): def __delslice__(self, start, end): super(OrderingList, self).__delslice__(start, end) self._reorder() - + # end Py2K + for func_name, func in locals().items(): if (util.callable(func) and func.func_name == func_name and not func.__doc__ and hasattr(list, func_name)): diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py index 2f376f1a88..6a77018468 100644 --- a/lib/sqlalchemy/orm/collections.py +++ b/lib/sqlalchemy/orm/collections.py @@ -954,7 +954,8 @@ def _list_decorators(): if step == 1: for i in xrange(start, stop, step): - del self[index.start or 0] + if len(self) > start: + del self[start] for i, item in enumerate(value): self.insert(i + start, item) diff --git a/test/orm/collection.py b/test/orm/collection.py index f34b313047..a50236e4cd 100644 --- a/test/orm/collection.py +++ b/test/orm/collection.py @@ -207,6 +207,19 @@ class CollectionsTest(_base.ORMTest): assert_eq() if hasattr(direct, '__setitem__') or hasattr(direct, '__setslice__'): + + values = [creator(), creator()] + direct[:] = values + control[:] = values + assert_eq() + + # test slice assignment where + # slice size goes over the number of items + values = [creator(), creator()] + direct[1:3] = values + control[1:3] = values + assert_eq() + values = [creator(), creator()] direct[0:1] = values control[0:1] = values