Index: src/zope/copypastemove/tests/test_rename.py =================================================================== --- src/zope/copypastemove/tests/test_rename.py (revision 68882) +++ src/zope/copypastemove/tests/test_rename.py (working copy) @@ -28,10 +28,68 @@ eventtesting.setUp() container_setup.setUp() + +def doctest_rename_corner_case(): + """Test for OrderedContainerItemRenamer.renameItem + + This is a regression test for + http://www.zope.org/Collectors/Zope3-dev/658 + + >>> from zope.component import adapts, provideAdapter + >>> from zope.copypastemove import ObjectMover + >>> provideAdapter(ObjectMover) + + There's an ordered container + + >>> from zope.app.container.ordered import OrderedContainer + >>> container = OrderedContainer() + + >>> from zope.app.container.contained import Contained + >>> class Obj(Contained): + ... def __init__(self, title): + ... self.title = title + ... def __repr__(self): + ... return self.title + >>> container['foo'] = Obj('Foo') + >>> container['bar'] = Obj('Bar') + >>> container['baz'] = Obj('Baz') + + with a custom name chooser + + >>> from zope.interface import implements, Interface + >>> from zope.app.container.interfaces import INameChooser + >>> class IMyContainer(Interface): pass + >>> class MyNameChooser(object): + ... adapts(IMyContainer) + ... implements(INameChooser) + ... def __init__(self, container): + ... self.container = container + ... def chooseName(self, name, obj): + ... return name.encode('rot-13') + >>> provideAdapter(MyNameChooser) + + >>> from zope.interface import alsoProvides + >>> alsoProvides(container, IMyContainer) + + OrderedContainerItemRenamer renames and preserves the order of items + + >>> from zope.copypastemove import OrderedContainerItemRenamer + >>> renamer = OrderedContainerItemRenamer(container) + >>> renamer.renameItem('bar', 'quux') + + >>> list(container.keys()) + ['foo', 'dhhk', 'baz'] + >>> list(container.values()) + [Foo, Bar, Baz] + + """ + + def test_suite(): return unittest.TestSuite(( DocTestSuite('zope.copypastemove', setUp=setUp, tearDown=testing.tearDown), + DocTestSuite(setUp=setUp, tearDown=testing.tearDown), )) if __name__=='__main__': Index: src/zope/copypastemove/__init__.py =================================================================== --- src/zope/copypastemove/__init__.py (revision 68882) +++ src/zope/copypastemove/__init__.py (working copy) @@ -496,6 +496,9 @@ self.container = container def renameItem(self, oldName, newName): + self._renameItem(oldName, newName) # discard return value + + def _renameItem(self, oldName, newName): object = self.container.get(oldName) if object is None: raise ItemNotFoundError(self.container, oldName) @@ -504,7 +507,7 @@ if newName in self.container: raise DuplicationError("%s is already in use" % newName) - mover.moveTo(self.container, newName) + return mover.moveTo(self.container, newName) class OrderedContainerItemRenamer(ContainerItemRenamer): @@ -571,7 +574,7 @@ def renameItem(self, oldName, newName): order = list(self.container.keys()) - super(OrderedContainerItemRenamer, self).renameItem(oldName, newName) + newName = self._renameItem(oldName, newName) order[order.index(oldName)] = newName self.container.updateOrder(order)