def test_traverse_datasets(): """ A -> B | | | v +--> C -> D | +--> E """ def node(name, **kwargs): return SimpleNamespace(id=name, sources=kwargs) A, *_ = make_graph_abcde(node) def visitor(node, name=None, depth=0, out=None): s = '{}:{}:{:d}'.format(node.id, name if name else '..', depth) out.append(s) with pytest.raises(ValueError): traverse_datasets(A, visitor, mode='not-a-real-mode') expect_preorder = ''' A:..:0 B:ab:1 C:bc:2 D:cd:3 C:ac:1 D:cd:2 E:ae:1 '''.lstrip().rstrip() expect_postorder = ''' D:cd:3 C:bc:2 B:ab:1 D:cd:2 C:ac:1 E:ae:1 A:..:0 '''.lstrip().rstrip() for mode, expect in zip(['pre-order', 'post-order'], [expect_preorder, expect_postorder]): out = [] traverse_datasets(A, visitor, mode=mode, out=out) assert '\n'.join(out) == expect fv = flatten_datasets(A) assert len(fv['A']) == 1 assert len(fv['C']) == 2 assert len(fv['E']) == 1 assert set(fv.keys()) == set('ABCDE') leaf = SimpleNamespace(id='N', sources=None) out = [] traverse_datasets(leaf, visitor, out=out) assert out == ["N:..:0"]
def test_simple_doc_nav(): """ A -> B | | | v +--> C -> D | +--> E """ def node(name, **kwargs): return dict(id=name, lineage=dict(source_datasets=kwargs)) A, _, C, _, _ = make_graph_abcde(node) rdr = SimpleDocNav(A) assert rdr.doc == A assert rdr.doc_without_lineage_sources == node('A') assert isinstance(rdr.sources['ae'], SimpleDocNav) assert rdr.sources['ab'].sources['bc'].doc == C assert rdr.doc_without_lineage_sources is rdr.doc_without_lineage_sources assert rdr.sources is rdr.sources assert isinstance(rdr.sources_path, tuple) def visitor(node, name=None, depth=0, out=None): s = '{}:{}:{:d}'.format(node.id, name if name else '..', depth) out.append(s) expect_preorder = ''' A:..:0 B:ab:1 C:bc:2 D:cd:3 C:ac:1 D:cd:2 E:ae:1 '''.lstrip().rstrip() expect_postorder = ''' D:cd:3 C:bc:2 B:ab:1 D:cd:2 C:ac:1 E:ae:1 A:..:0 '''.lstrip().rstrip() for mode, expect in zip(['pre-order', 'post-order'], [expect_preorder, expect_postorder]): out = [] traverse_datasets(rdr, visitor, mode=mode, out=out) assert '\n'.join(out) == expect fv = flatten_datasets(rdr) assert len(fv['A']) == 1 assert len(fv['C']) == 2 assert len(fv['E']) == 1 assert set(fv.keys()) == set('ABCDE') fv, dg = flatten_datasets(rdr, with_depth_grouping=True) assert len(fv['A']) == 1 assert len(fv['C']) == 2 assert len(fv['E']) == 1 assert set(fv.keys()) == set('ABCDE') assert isinstance(dg, list) assert len(dg) == 4 assert [len(l) for l in dg] == [1, 3, 2, 1] def to_set(xx): return set(x.id for x in xx) assert [set(s) for s in ('A', 'BCE', 'CD', 'D')] == [to_set(xx) for xx in dg]