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))
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