def test_namechooser_rename_preserve_order(self): # Test for OrderedContainerItemRenamer.renameItem # This is a regression test for # http://www.zope.org/Collectors/Zope3-dev/658 # Also: https://bugs.launchpad.net/zope.copypastemove/+bug/98385 provideAdapter(ObjectMover) # There's an ordered container from zope.container.ordered import OrderedContainer container = OrderedContainer() class Obj(Contained): def __init__(self, title): self.title = title objects = [Obj('Foo'), Obj('Bar'), Obj('Baz')] container['foo'] = objects[0] container['bar'] = objects[1] container['baz'] = objects[2] # with a custom name chooser import codecs from zope.interface import implementer, Interface from zope.container.interfaces import INameChooser class IMyContainer(Interface): "An interface" @adapter(IMyContainer) @implementer(INameChooser) class MyNameChooser(object): def __init__(self, container): self.container = container def chooseName(self, name, obj): return codecs.getencoder('rot-13')(name)[0] 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) self.assertEqual(renamer.renameItem('bar', 'quux'), u'dhhk') self.assertEqual(list(container.keys()), [u'foo', u'dhhk', u'baz']) self.assertEqual(container.values(), objects)
class RelationshipStates(Persistent, Contained): implements(IRelationshipStates) title = None states = None system_titles = None factory = RelationshipState def __init__(self, title): self.title = title self.states = OrderedContainer() locate(self.states, self, 'states') self.system_titles = OrderedContainer() locate(self.system_titles, self, 'system_titles') def __iter__(self): return iter(self.states.values()) def getState(self, state_tuple): if state_tuple is None: return None meaning, code = state_tuple state = self.states.get(code) return state def getTitle(self, state_tuple): state = self.getState(state_tuple) if state is None: return None return state.title def getDescription(self, state_tuple): if state_tuple is None: return None meaning, code = state_tuple state = self.system_titles.get(meaning) return state @classmethod def overlap(cls, codes, other): for code in codes: if code in other: return True return False def add(self, *args, **kw): state = self.factory(*args, **kw) self.states[state.code] = state def describe(self, active, title): active = ''.join(sorted(set(active))) self.system_titles[active] = title
def test_order_adding_none(self): # This is a regression test: adding None to an OrderedContainer # used to corrupt its internal data structure (_order and _data # would get out of sync, causing KeyErrors when you tried to iterate). from zope.container.ordered import OrderedContainer oc = OrderedContainer() oc['foo'] = None self.assertEqual(oc.keys(), ['foo']) self.assertEqual(oc.values(), [None]) self.assertEqual(oc.items(), [('foo', None)]) # None got proxied, so 'is None is not true self.assertIsNotNone(oc['foo']) self.assertEqual(None, oc['foo'])