summaryrefslogtreecommitdiff
path: root/_test/test_api_change.py
blob: 8961273c245a7a654395e9e704f6fbdf259d9f35 (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
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# coding: utf-8

"""
testing of anchors and the aliases referring to them
"""

import sys
import textwrap
import pytest  # type: ignore
from pathlib import Path

from typing import Any


class TestNewAPI:
    def test_duplicate_keys_00(self) -> None:
        from ruamel.yaml import YAML
        from ruamel.yaml.constructor import DuplicateKeyError

        yaml = YAML()
        with pytest.raises(DuplicateKeyError):
            yaml.load('{a: 1, a: 2}')

    def test_duplicate_keys_01(self) -> None:
        from ruamel.yaml import YAML
        from ruamel.yaml.constructor import DuplicateKeyError

        yaml = YAML(typ='safe', pure=True)
        with pytest.raises(DuplicateKeyError):
            yaml.load('{a: 1, a: 2}')

    def test_duplicate_keys_02(self) -> None:
        from ruamel.yaml import YAML
        from ruamel.yaml.constructor import DuplicateKeyError

        yaml = YAML(typ='safe')
        with pytest.raises(DuplicateKeyError):
            yaml.load('{a: 1, a: 2}')

    def test_issue_135(self) -> None:
        # reported by Andrzej Ostrowski
        from ruamel.yaml import YAML

        data = {'a': 1, 'b': 2}
        yaml = YAML(typ='safe')
        # originally on 2.7: with pytest.raises(TypeError):
        yaml.dump(data, sys.stdout)

    def test_issue_135_temporary_workaround(self) -> None:
        # never raised error
        from ruamel.yaml import YAML

        data = {'a': 1, 'b': 2}
        yaml = YAML(typ='safe', pure=True)
        yaml.dump(data, sys.stdout)


class TestWrite:
    def test_dump_path(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        fn = Path(str(tmpdir)) / 'test.yaml'
        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        yaml.dump(data, fn)
        assert fn.read_text() == 'a: 1\nb: 2\n'

    def test_dump_file(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        fn = Path(str(tmpdir)) / 'test.yaml'
        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        with open(str(fn), 'w') as fp:
            yaml.dump(data, fp)
        assert fn.read_text() == 'a: 1\nb: 2\n'

    def test_dump_missing_stream(self) -> None:
        from ruamel.yaml import YAML

        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        with pytest.raises(TypeError):
            yaml.dump(data)

    def test_dump_too_many_args(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        fn = Path(str(tmpdir)) / 'test.yaml'
        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        with pytest.raises(TypeError):
            yaml.dump(data, fn, True)  # type: ignore

    def test_transform(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        def tr(s: str) -> str:
            return s.replace(' ', '  ')

        fn = Path(str(tmpdir)) / 'test.yaml'
        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        yaml.dump(data, fn, transform=tr)
        assert fn.read_text() == 'a:  1\nb:  2\n'

    def test_print(self, capsys: Any) -> None:
        from ruamel.yaml import YAML

        yaml = YAML()
        data = yaml.map()
        data['a'] = 1
        data['b'] = 2
        yaml.dump(data, sys.stdout)
        out, err = capsys.readouterr()
        assert out == 'a: 1\nb: 2\n'


class TestRead:
    def test_multi_load(self) -> None:
        # make sure reader, scanner, parser get reset
        from ruamel.yaml import YAML

        yaml = YAML()
        yaml.load('a: 1')
        yaml.load('a: 1')  # did not work in 0.15.4

    def test_parse(self) -> None:
        # ensure `parse` method is functional and can parse "unsafe" yaml
        from ruamel.yaml import YAML
        from ruamel.yaml.constructor import ConstructorError

        yaml = YAML(typ='safe')
        s = '- !User0 {age: 18, name: Anthon}'
        # should fail to load
        with pytest.raises(ConstructorError):
            yaml.load(s)
        # should parse fine
        yaml = YAML(typ='safe')
        for _ in yaml.parse(s):
            pass


class TestLoadAll:
    def test_multi_document_load(self, tmpdir: Any) -> None:
        """this went wrong on 3.7 because of StopIteration, PR 37 and Issue 211"""
        from ruamel.yaml import YAML

        fn = Path(str(tmpdir)) / 'test.yaml'
        fn.write_text(
            textwrap.dedent("""\
            ---
            - a
            ---
            - b
            ...
            """)
        )
        yaml = YAML()
        assert list(yaml.load_all(fn)) == [['a'], ['b']]


class TestDuplSet:
    def test_dupl_set_00(self) -> None:
        # round-trip-loader should except
        from ruamel.yaml import YAML
        from ruamel.yaml.constructor import DuplicateKeyError

        yaml = YAML()
        with pytest.raises(DuplicateKeyError):
            yaml.load(
                textwrap.dedent("""\
                !!set
                ? a
                ? b
                ? c
                ? a
                """)
            )


class TestDumpLoadUnicode:
    # test triggered by SamH on stackoverflow (https://stackoverflow.com/q/45281596/1307905)
    # and answer by randomir (https://stackoverflow.com/a/45281922/1307905)
    def test_write_unicode(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        yaml = YAML()
        text_dict = {'text': 'HELLO_WORLD©'}
        file_name = str(tmpdir) + '/tstFile.yaml'
        yaml.dump(text_dict, open(file_name, 'w'))
        assert open(file_name, 'rb').read().decode('utf-8') == 'text: HELLO_WORLD©\n'

    def test_read_unicode(self, tmpdir: Any) -> None:
        from ruamel.yaml import YAML

        yaml = YAML()
        file_name = str(tmpdir) + '/tstFile.yaml'
        with open(file_name, 'wb') as fp:
            fp.write('text: HELLO_WORLD©\n'.encode('utf-8'))
        text_dict = yaml.load(open(file_name, 'r'))
        assert text_dict['text'] == 'HELLO_WORLD©'


class TestFlowStyle:
    def test_flow_style(self, capsys: Any) -> None:
        # https://stackoverflow.com/questions/45791712/
        from ruamel.yaml import YAML

        yaml = YAML()
        yaml.default_flow_style = None
        data = yaml.map()
        data['b'] = 1
        data['a'] = [[1, 2], [3, 4]]
        yaml.dump(data, sys.stdout)
        out, err = capsys.readouterr()
        assert out == 'b: 1\na:\n- [1, 2]\n- [3, 4]\n'


class TestOldAPI:
    @pytest.mark.skipif(sys.version_info >= (3, 0), reason='ok on Py3')  # type: ignore
    def test_duplicate_keys_02(self) -> None:
        # Issue 165 unicode keys in error/warning
        from ruamel.yaml import safe_load
        from ruamel.yaml.constructor import DuplicateKeyError

        with pytest.raises(DuplicateKeyError):
            safe_load('type: Doméstica\ntype: International')