def test_delitem(self): folder = OrderedBTreeFolderBase("f1") folder._setOb('foo', DummyObject('foo')) folder._setOb('bar', DummyObject('bar')) self.assertEquals(len(folder.objectIds()), 2) del folder['foo'] del folder['bar'] self.assertEquals(len(folder.objectIds()), 0)
def test_delitem(self): folder = OrderedBTreeFolderBase("f1") folder._setOb("foo", DummyObject("foo")) folder._setOb("bar", DummyObject("bar")) self.assertEquals(len(folder.objectIds()), 2) del folder["foo"] del folder["bar"] self.assertEquals(len(folder.objectIds()), 0)
def checkOrderedFolder(folder): """check invariants """ ordering = folder.getOrdering() if not isinstance(ordering, DefaultOrdering): return ids = OrderedBTreeFolderBase.objectIds(folder) order = ordering._order() assert len(ids) == len(order) assert len(set(order)) == len(order) assert len(ordering._pos()) == len(order) for index, value in enumerate(order): assert value in ids assert value in ordering._pos() assert ordering._pos()[value] == index
def fixOrderedFolder(folder): result = list() try: checkOrderedFolder(folder) except AssertionError: path = '/'.join(folder.getPhysicalPath()) logger.warn('Detected damage to %s. Fixing now.' % path, exc_info=sys.exc_info()) try: ids = OrderedBTreeFolderBase.objectIds(folder) ordering = folder.getOrdering() # keep only ids that exist in underlying BTreeFolder # keep first id if there is more than one seen = list() for index, value in enumerate(ordering._order()): if value not in seen and value in ids: seen.append(value) # add ids of objects found in BTreeFolder # but not in ordering if len(seen) < len(ids): for id in ids: if id not in seen: seen.append(id) # build new order list and pos dict order, pos = resetOrdering(ordering) for index, value in enumerate(seen): order.append(value) pos[value] = index checkOrderedFolder(folder) result.append('Fixed folder %s' % path) except: # noqa logger.error('Failed to fix %s.' % path, exc_info=sys.exc_info()) raise else: logger.info('Fixed %s.' % path) return result