Пример #1
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)
Пример #2
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