def simple_collisions_test(self):
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()

        brl0 = BRLBlock("user/user/block/master")
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl0, 1)

        g1.add_node(v0)
        g2.add_node(v1)
        expected = BlockVersionGraph()
        expected.add_nodes([v0, v1])
        self.assertEqual(expected, g1.collision(g2))
        self.assertEqual(expected, g2.collision(g1))
    def simple_collisions_test(self):
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()

        brl0 = BRLBlock('user/user/block/master')
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl0, 1)

        g1.add_node(v0)
        g2.add_node(v1)
        expected = BlockVersionGraph()
        expected.add_nodes([v0, v1])
        self.assertEqual(expected, g1.collision(g2))
        self.assertEqual(expected, g2.collision(g1))
    def disjoints_graphs_no_collisions_test(self):
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        self.assertEqual(BlockVersionGraph(), g1.collision(g2))
        self.assertEqual(BlockVersionGraph(), g2.collision(g1))

        brl0 = BRLBlock('user/user/block/master')
        brl1 = BRLBlock('user/user/block2/master')
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)

        g1.add_node(v0)
        g2.add_node(v1)
        self.assertEqual(BlockVersionGraph(), g1.collision(g2))
        self.assertEqual(BlockVersionGraph(), g2.collision(g1))
    def disjoints_graphs_no_collisions_test(self):
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        self.assertEqual(BlockVersionGraph(), g1.collision(g2))
        self.assertEqual(BlockVersionGraph(), g2.collision(g1))

        brl0 = BRLBlock("user/user/block/master")
        brl1 = BRLBlock("user/user/block2/master")
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)

        g1.add_node(v0)
        g2.add_node(v1)
        self.assertEqual(BlockVersionGraph(), g1.collision(g2))
        self.assertEqual(BlockVersionGraph(), g2.collision(g1))
    def empty_test(self):
        '''When one is empty, it should always be compatible'''
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        self.assertFalse(g1.collision(g2))

        brl0 = BRLBlock('user/user/block/master')
        brl1 = BRLBlock('user/user/block2/master')
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)
        g1.add_node(v0)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))

        g1.add_node(v1)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))
    def empty_test(self):
        """When one is empty, it should always be compatible"""
        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        self.assertFalse(g1.collision(g2))

        brl0 = BRLBlock("user/user/block/master")
        brl1 = BRLBlock("user/user/block2/master")
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)
        g1.add_node(v0)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))

        g1.add_node(v1)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))
    def incompatible_test(self):
        '''both not empty, and incompatible'''
        brl0 = BRLBlock('user/user/block/master')
        brl1 = BRLBlock('user/user/block2/master')
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)
        v2 = BlockVersion(brl1, 0)
        v3 = BlockVersion(brl0, 1)

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_node(v0)
        g2.add_node(v3)
        self.assertTrue(g1.collision(g2))
        self.assertTrue(g2.collision(g1))

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_nodes([v0, v1])
        g2.add_nodes([v2, v3])
        self.assertTrue(g1.collision(g2))
        self.assertTrue(g2.collision(g1))
    def incompatible_test(self):
        """both not empty, and incompatible"""
        brl0 = BRLBlock("user/user/block/master")
        brl1 = BRLBlock("user/user/block2/master")
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)
        v2 = BlockVersion(brl1, 0)
        v3 = BlockVersion(brl0, 1)

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_node(v0)
        g2.add_node(v3)
        self.assertTrue(g1.collision(g2))
        self.assertTrue(g2.collision(g1))

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_nodes([v0, v1])
        g2.add_nodes([v2, v3])
        self.assertTrue(g1.collision(g2))
        self.assertTrue(g2.collision(g1))
    def compatible_test(self):
        '''both not empty, but compatible'''
        brl0 = BRLBlock('user/user/block/master')
        brl1 = BRLBlock('user/user/block2/master')
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_node(v0)
        g2.add_node(v1)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))

        g1.add_node(v1)
        g2.add_node(v0)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))
    def compatible_test(self):
        """both not empty, but compatible"""
        brl0 = BRLBlock("user/user/block/master")
        brl1 = BRLBlock("user/user/block2/master")
        v0 = BlockVersion(brl0, 0)
        v1 = BlockVersion(brl1, 1)

        g1 = BlockVersionGraph()
        g2 = BlockVersionGraph()
        g1.add_node(v0)
        g2.add_node(v1)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))

        g1.add_node(v1)
        g2.add_node(v0)
        self.assertFalse(g1.collision(g2))
        self.assertFalse(g2.collision(g1))
Exemple #11
0
def build_closure(biiapi, references, base_table, settings=None, biiout=None):
    graph = BlockVersionGraph()
    closure = Closure()
    visited = set()
    visited_block_versions = set()
    overwrites = defaultdict(set)
    if references:
        assert not ([
            r for r in references.explode()
            if r.block_version.block_name in base_table
            and base_table[r.block_version.block_name] != r.block_version
        ])
        frontier = [(references, base_table)
                    ]  # Of tuple (references, base_table)
    else:
        frontier = []

    class Visited(namedtuple('Visited', 'version cell_name, dep_table')):
        def __hash__(self):
            return hash((self.version, self.cell_name))

    while frontier:
        references, base_table = frontier.pop()
        retrieved = biiapi.get_published_resources(references)
        for block_version, resources in retrieved.iteritems():
            graph.add_node(block_version)
            dep_targets = set()

            if block_version not in visited_block_versions:
                cell_names = biiapi.get_cells_snapshot(block_version)
                _add_implicit_targets(dep_targets, cell_names, block_version)
                visited_block_versions.add(block_version)
            try:
                up_table = biiapi.get_dep_table(block_version)
            except Exception as e:
                raise BiiException(
                    '%s\nbiicode needs compare your local "%s" block with your last'
                    ' version published one. If you want to delete it, delete the '
                    'folder in the filesystem.' %
                    (str(e), block_version.block_name))
            effective, propagate, overwrite = compute_effective(
                base_table, up_table, block_version.block_name)
            if overwrite:
                overwrites[block_version].update(overwrite)

            for cell_name, resource in resources.iteritems():
                closure.add_item(resource, block_version, biiout)
                visited.add(Visited(block_version, cell_name, base_table))
                _update_dep_targets(dep_targets, resource, settings, biiout)

            other_refs = References()
            self_refs = References()
            for target in dep_targets:
                if target.block_name == block_version.block_name:
                    next_visit = Visited(block_version, target.cell_name,
                                         base_table)
                    if next_visit not in visited:
                        self_refs[block_version].add(target.cell_name)
                else:
                    next_version = effective[target.block_name]
                    graph.add_edge(block_version, next_version)
                    if next_version.time is not None:
                        next_visit = Visited(next_version, target.cell_name,
                                             propagate)
                        if next_visit not in visited:
                            other_refs[next_version].add(target.cell_name)

            if other_refs:
                frontier.append((other_refs, propagate))
            if self_refs:
                frontier.append((self_refs, base_table))

    return graph, closure, overwrites
def build_closure(biiapi, references, base_table, settings=None, biiout=None):
    graph = BlockVersionGraph()
    closure = Closure()
    visited = set()
    visited_block_versions = set()
    overwrites = defaultdict(set)
    if references:
        assert not ([r for r in references.explode() if r.block_version.block_name in base_table
                     and base_table[r.block_version.block_name] != r.block_version])
        frontier = [(references, base_table)]  # Of tuple (references, base_table)
    else:
        frontier = []

    class Visited(namedtuple('Visited', 'version cell_name, dep_table')):
        def __hash__(self):
            return hash((self.version, self.cell_name))

    while frontier:
        references, base_table = frontier.pop()
        retrieved = biiapi.get_published_resources(references)
        for block_version, resources in retrieved.iteritems():
            graph.add_node(block_version)
            dep_targets = set()

            if block_version not in visited_block_versions:
                cell_names = biiapi.get_cells_snapshot(block_version)
                _add_implicit_targets(dep_targets, cell_names, block_version)
                visited_block_versions.add(block_version)
            try:
                up_table = biiapi.get_dep_table(block_version)
            except Exception as e:
                raise BiiException('%s\nbiicode needs compare your local "%s" block with your last'
                                   ' version published one. If you want to delete it, delete the '
                                   'folder in the filesystem.' % (str(e),
                                                                  block_version.block_name))
            effective, propagate, overwrite = compute_effective(base_table, up_table,
                                                                block_version.block_name)
            if overwrite:
                overwrites[block_version].update(overwrite)

            for cell_name, resource in resources.iteritems():
                closure.add_item(resource, block_version, biiout)
                visited.add(Visited(block_version, cell_name, base_table))
                _update_dep_targets(dep_targets, resource, settings, biiout)

            other_refs = References()
            self_refs = References()
            for target in dep_targets:
                if target.block_name == block_version.block_name:
                    next_visit = Visited(block_version, target.cell_name, base_table)
                    if next_visit not in visited:
                        self_refs[block_version].add(target.cell_name)
                else:
                    next_version = effective[target.block_name]
                    graph.add_edge(block_version, next_version)
                    if next_version.time is not None:
                        next_visit = Visited(next_version, target.cell_name, propagate)
                        if next_visit not in visited:
                            other_refs[next_version].add(target.cell_name)

            if other_refs:
                frontier.append((other_refs, propagate))
            if self_refs:
                frontier.append((self_refs, base_table))

    return graph, closure, overwrites