summaryrefslogtreecommitdiff
path: root/_test/roundtrip.py
blob: bd65c5a93f00c3f3163e885f32bf25935799a329 (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

from __future__ import print_function

"""
helper routines for testing round trip of commented YAML data
"""
import textwrap

import ruamel.yaml


def dedent(data):
    try:
        position_of_first_newline = data.index('\n')
        for idx in range(position_of_first_newline):
            if not data[idx].isspace():
                raise ValueError
    except ValueError:
        pass
    else:
        data = data[position_of_first_newline+1:]
    return textwrap.dedent(data)


def round_trip_load(inp):
    dinp = dedent(inp)
    return ruamel.yaml.load(dinp, ruamel.yaml.RoundTripLoader)


def round_trip_dump(data, indent=None):
    dumper = ruamel.yaml.RoundTripDumper
    return ruamel.yaml.dump(data, default_flow_style=False, Dumper=dumper,
                            allow_unicode=True,
                            indent=indent)


def round_trip(inp, outp=None, extra=None, intermediate=None, indent=None):
    if outp is None:
        outp = inp
    doutp = dedent(outp)
    if extra is not None:
        doutp += extra
    data = round_trip_load(inp)
    if intermediate is not None:
        if isinstance(intermediate, dict):
            for k, v in intermediate.items():
                if data[k] != v:
                    print('{0!r} <> {1!r}'.format(data[k], v))
                    raise ValueError
    res = round_trip_dump(data, indent=indent)
    print('roundtrip data:\n', res, sep='')
    assert res == doutp
    res = round_trip_dump(data, indent=indent)
    print('roundtrip second round data:\n', res, sep='')
    assert res == doutp