1a5f9918aSopenharmony_ciimport yaml
2a5f9918aSopenharmony_ciimport pprint
3a5f9918aSopenharmony_ciimport sys
4a5f9918aSopenharmony_ci
5a5f9918aSopenharmony_cidef _load_code(expression):
6a5f9918aSopenharmony_ci    return eval(expression)
7a5f9918aSopenharmony_ci
8a5f9918aSopenharmony_cidef myconstructor1(constructor, tag, node):
9a5f9918aSopenharmony_ci    seq = constructor.construct_sequence(node)
10a5f9918aSopenharmony_ci    return {tag: seq }
11a5f9918aSopenharmony_ci
12a5f9918aSopenharmony_cidef myconstructor2(constructor, tag, node):
13a5f9918aSopenharmony_ci    seq = constructor.construct_sequence(node)
14a5f9918aSopenharmony_ci    string = ''
15a5f9918aSopenharmony_ci    try:
16a5f9918aSopenharmony_ci        i = tag.index('!') + 1
17a5f9918aSopenharmony_ci    except:
18a5f9918aSopenharmony_ci        try:
19a5f9918aSopenharmony_ci            i = tag.rindex(':') + 1
20a5f9918aSopenharmony_ci        except:
21a5f9918aSopenharmony_ci            pass
22a5f9918aSopenharmony_ci    if i >= 0:
23a5f9918aSopenharmony_ci        tag = tag[i:]
24a5f9918aSopenharmony_ci    return { tag: seq }
25a5f9918aSopenharmony_ci
26a5f9918aSopenharmony_ciclass Multi1(yaml.FullLoader):
27a5f9918aSopenharmony_ci    pass
28a5f9918aSopenharmony_ciclass Multi2(yaml.FullLoader):
29a5f9918aSopenharmony_ci    pass
30a5f9918aSopenharmony_ci
31a5f9918aSopenharmony_cidef test_multi_constructor(input_filename, code_filename, verbose=False):
32a5f9918aSopenharmony_ci    with open(input_filename, 'rb') as file:
33a5f9918aSopenharmony_ci        input = file.read().decode('utf-8')
34a5f9918aSopenharmony_ci    with open(code_filename, 'rb') as file:
35a5f9918aSopenharmony_ci        native = _load_code(file.read())
36a5f9918aSopenharmony_ci
37a5f9918aSopenharmony_ci    # default multi constructor for ! and !! tags
38a5f9918aSopenharmony_ci    Multi1.add_multi_constructor('!', myconstructor1)
39a5f9918aSopenharmony_ci    Multi1.add_multi_constructor('tag:yaml.org,2002:', myconstructor1)
40a5f9918aSopenharmony_ci
41a5f9918aSopenharmony_ci    data = yaml.load(input, Loader=Multi1)
42a5f9918aSopenharmony_ci    if verbose:
43a5f9918aSopenharmony_ci        print('Multi1:')
44a5f9918aSopenharmony_ci        print(data)
45a5f9918aSopenharmony_ci        print(native)
46a5f9918aSopenharmony_ci    assert(data == native)
47a5f9918aSopenharmony_ci
48a5f9918aSopenharmony_ci
49a5f9918aSopenharmony_ci    # default multi constructor for all tags
50a5f9918aSopenharmony_ci    Multi2.add_multi_constructor(None, myconstructor2)
51a5f9918aSopenharmony_ci
52a5f9918aSopenharmony_ci    data = yaml.load(input, Loader=Multi2)
53a5f9918aSopenharmony_ci    if verbose:
54a5f9918aSopenharmony_ci        print('Multi2:')
55a5f9918aSopenharmony_ci        print(data)
56a5f9918aSopenharmony_ci        print(native)
57a5f9918aSopenharmony_ci    assert(data == native)
58a5f9918aSopenharmony_ci
59a5f9918aSopenharmony_ci
60a5f9918aSopenharmony_citest_multi_constructor.unittest = ['.multi', '.code']
61a5f9918aSopenharmony_ci
62a5f9918aSopenharmony_ciif __name__ == '__main__':
63a5f9918aSopenharmony_ci    import test_appliance
64a5f9918aSopenharmony_ci    test_appliance.run(globals())
65a5f9918aSopenharmony_ci
66