/
roundtrip.story
154 lines (133 loc) · 3.58 KB
/
roundtrip.story
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Reading in YAML, editing it and writing it back out:
docs: howto/roundtripping
based on: strictyaml
description: |
Loaded YAML can be modified and dumped out again with
comments preserved using .as_yaml().
Note that due to some bugs in the library (ruamel.yaml)
underlying StrictYAML, while the data parsed should
be precisely the same, the exact syntax (newlines, comment
locations, etc.) may not be identical.
given:
yaml_snippet: |
# Some comment
a: â # value comment
# Another comment
b:
x: 4
y: 5
c:
- a: 1
- b: 2
setup: |
from strictyaml import Map, MapPattern, EmptyDict, Str, Seq, Int, load
from ensure import Ensure
schema = Map({
"a": Str(),
"b": Map({"x": Int(), "y": Int()}),
"c": EmptyDict() | Seq(MapPattern(Str(), Str())),
})
variations:
Commented:
steps:
- Run:
code: |
Ensure(load(yaml_snippet, schema).as_yaml()).equals(yaml_snippet)
Modified with invalid variable:
steps:
- Run:
code: |
to_modify = load(yaml_snippet, schema)
to_modify['b']['x'] = 2
to_modify['c'][0]['a'] = '3'
to_modify['b']['x'] = 'not an integer'
raises:
type: strictyaml.exceptions.YAMLSerializationError
message: "'not an integer' not an integer."
Modified with float:
steps:
- run:
code: |
to_modify = load(yaml_snippet, schema)
to_modify['c'][0]['a'] = "1.0001"
print(to_modify.as_yaml())
will output: |-
# Some comment
a: â # value comment
# Another comment
b:
x: 4
y: 5
c:
- a: 1.0001
- b: 2
Modify multi line string:
given:
yaml_snippet: |
a: some
b: |
text
steps:
- run:
code: |
schema = Map({"a": Str(), "b": Str()})
to_modify = load(yaml_snippet, schema)
to_modify['a'] = 'changed'
print(to_modify.as_yaml())
will output: |-
a: changed
b: |
text
Modified with one variable:
steps:
- run:
code: |
to_modify = load(yaml_snippet, schema)
to_modify['b']['x'] = 2
to_modify['c'][0]['a'] = '3'
print(to_modify.as_yaml())
will output: |-
# Some comment
a: â # value comment
# Another comment
b:
x: 2
y: 5
c:
- a: 3
- b: 2
Text across lines:
steps:
- run:
code: |
to_modify = load(yaml_snippet, schema)
to_modify['c'][0]['a'] = "text\nacross\nlines"
print(to_modify.as_yaml())
will output: |-
# Some comment
a: â # value comment
# Another comment
b:
x: 4
y: 5
c:
- a: |-
text
across
lines
- b: 2
With empty dict:
steps:
- run:
code: |
to_modify = load(yaml_snippet, schema)
to_modify['c'] = {}
print(to_modify.as_yaml())
will output: |-
# Some comment
a: â # value comment
# Another comment
b:
x: 4
y: 5
c: