def test_add_item(self): c1 = Closure() r1 = Cell('user/block/name1') version = BlockVersion(BRLBlock('owner/user/block/branch'), 13) biiout = OutputStream() resource = Resource(r1, None) c1.add_item(resource, version, biiout) r2 = Cell('user/block/name1') r2.hasMain = True resource2 = Resource(r2, None) version2 = BlockVersion(BRLBlock('owner/user/block/branch'), 14) c1.add_item(resource2, version2, biiout) self.assertEqual(ClosureItem(resource, version), c1['user/block/name1']) self.assertIn('Incompatible dependency', str(biiout))
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