summaryrefslogtreecommitdiffstats
path: root/_test/test_api_change.py
diff options
context:
space:
mode:
Diffstat (limited to '_test/test_api_change.py')
-rw-r--r--_test/test_api_change.py230
1 files changed, 230 insertions, 0 deletions
diff --git a/_test/test_api_change.py b/_test/test_api_change.py
new file mode 100644
index 0000000..dd25fd9
--- /dev/null
+++ b/_test/test_api_change.py
@@ -0,0 +1,230 @@
+# coding: utf-8
+
+"""
+testing of anchors and the aliases referring to them
+"""
+
+import sys
+import textwrap
+from pathlib import Path
+
+import pytest
+
+
+class TestNewAPI:
+ def test_duplicate_keys_00(self):
+ from ruyaml import YAML
+ from ruyaml.constructor import DuplicateKeyError
+
+ yaml = YAML()
+ with pytest.raises(DuplicateKeyError):
+ yaml.load('{a: 1, a: 2}')
+
+ def test_duplicate_keys_01(self):
+ from ruyaml import YAML
+ from ruyaml.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):
+ from ruyaml import YAML
+ from ruyaml.constructor import DuplicateKeyError
+
+ yaml = YAML(typ='safe')
+ with pytest.raises(DuplicateKeyError):
+ yaml.load('{a: 1, a: 2}')
+
+ def test_issue_135(self):
+ # reported by Andrzej Ostrowski
+ from ruyaml 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):
+ # never raised error
+ from ruyaml 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):
+ from ruyaml 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):
+ from ruyaml 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):
+ from ruyaml 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):
+ from ruyaml 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)
+
+ def test_transform(self, tmpdir):
+ from ruyaml import YAML
+
+ def tr(s):
+ 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):
+ from ruyaml 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):
+ # make sure reader, scanner, parser get reset
+ from ruyaml import YAML
+
+ yaml = YAML()
+ yaml.load('a: 1')
+ yaml.load('a: 1') # did not work in 0.15.4
+
+ def test_parse(self):
+ # ensure `parse` method is functional and can parse "unsafe" yaml
+ from ruyaml import YAML
+ from ruyaml.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):
+ """this went wrong on 3.7 because of StopIteration, PR 37 and Issue 211"""
+ from ruyaml 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):
+ # round-trip-loader should except
+ from ruyaml import YAML
+ from ruyaml.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):
+ from ruyaml 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):
+ from ruyaml 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):
+ # https://stackoverflow.com/questions/45791712/
+ from ruyaml 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'