]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
orderinglist slice fixes
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 30 May 2009 18:52:26 +0000 (18:52 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 30 May 2009 18:52:26 +0000 (18:52 +0000)
lib/sqlalchemy/ext/orderinglist.py
lib/sqlalchemy/orm/collections.py
test/orm/collection.py

index a5d60bf82e2bedcd7ecaa7d8148e05ec7777a21e..8e63ed1c29c383ce3c5b538b0024c60d8b9eca07 100644 (file)
@@ -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)):
index 2f376f1a88f7fe3b53e3b301aee4346a9d578794..6a770184681fe90520305164012b680ca94d8c7b 100644 (file)
@@ -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)
index f34b3130471e1049df1141e7e828fd140cabfc9a..a50236e4cdb46af6e24cc622a7ae656fe9359ba2 100644 (file)
@@ -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