summaryrefslogtreecommitdiff
path: root/tests/lib/test_multi_constructor.py
blob: dcff2ce577c6b838fdad34de0ab51408f8303212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import yaml
import pprint
import sys

def _load_code(expression):
    return eval(expression)

def myconstructor1(constructor, tag, node):
    seq = constructor.construct_sequence(node)
    return {tag: seq }

def myconstructor2(constructor, tag, node):
    seq = constructor.construct_sequence(node)
    string = ''
    try:
        i = tag.index('!') + 1
    except:
        try:
            i = tag.rindex(':') + 1
        except:
            pass
    if i >= 0:
        tag = tag[i:]
    return { tag: seq }

class Multi1(yaml.FullLoader):
    pass
class Multi2(yaml.FullLoader):
    pass

def test_multi_constructor(input_filename, code_filename, verbose=False):
    with open(input_filename, 'rb') as file:
        input = file.read().decode('utf-8')
    with open(code_filename, 'rb') as file:
        native = _load_code(file.read())

    # default multi constructor for ! and !! tags
    Multi1.add_multi_constructor('!', myconstructor1)
    Multi1.add_multi_constructor('tag:yaml.org,2002:', myconstructor1)

    data = yaml.load(input, Loader=Multi1)
    if verbose:
        print('Multi1:')
        print(data)
        print(native)
    assert(data == native)


    # default multi constructor for all tags
    Multi2.add_multi_constructor(None, myconstructor2)

    data = yaml.load(input, Loader=Multi2)
    if verbose:
        print('Multi2:')
        print(data)
        print(native)
    assert(data == native)


test_multi_constructor.unittest = ['.multi', '.code']

if __name__ == '__main__':
    import test_appliance
    test_appliance.run(globals())