Skip to content

Commit ab8da29

Browse files
authored
Merge pull request #5 from wimglenn/safe_dump
Allow to safe_dump with OrderedDict instances
2 parents 1e8c8ff + de97b8b commit ab8da29

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

oyaml.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def map_constructor(loader, node):
1818

1919
pyyaml.add_representer(dict, map_representer)
2020
pyyaml.add_representer(OrderedDict, map_representer)
21+
pyyaml.add_representer(OrderedDict, map_representer, Dumper=pyyaml.dumper.SafeDumper)
2122

2223

2324
if sys.version_info < (3, 7):

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from distutils.core import setup
1+
from setuptools import setup
22

33
setup(
44
name='oyaml',
5-
version='0.2',
5+
version='0.3',
66
description='Ordered YAML: drop-in replacement for PyYAML which preserves dict ordering',
77
author='Wim Glenn',
88
author_email='hey@wimglenn.com',

test_oyaml.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,70 @@
11
import sys
22
from collections import OrderedDict
3+
from types import GeneratorType
34

45
import pytest
6+
from yaml.representer import RepresenterError
57

68
import oyaml as yaml
79

810

9-
d = OrderedDict([('k1', 'v1'), ('k3', 'v3'), ('k2', 'v2')])
11+
data = OrderedDict([('x', 1), ('z', 3), ('y', 2)])
1012

1113

1214
def test_dump():
13-
assert yaml.dump(d) == '{k1: v1, k3: v3, k2: v2}\n'
15+
assert yaml.dump(data) == '{x: 1, z: 3, y: 2}\n'
16+
17+
18+
def test_safe_dump():
19+
assert yaml.safe_dump(data) == '{x: 1, z: 3, y: 2}\n'
20+
21+
22+
def test_dump_all():
23+
assert yaml.dump_all(documents=[data, {}]) == '{x: 1, z: 3, y: 2}\n--- {}\n'
24+
25+
26+
def test_safe_dump_all():
27+
assert yaml.safe_dump_all(documents=[data, {}]) == '{x: 1, z: 3, y: 2}\n--- {}\n'
1428

1529

1630
def test_load():
17-
loaded = yaml.load('{k1: v1, k3: v3, k2: v2}')
18-
assert loaded == {'k1': 'v1', 'k3': 'v3', 'k2': 'v2'}
31+
loaded = yaml.load('{x: 1, z: 3, y: 2}')
32+
assert loaded == {'x': 1, 'z': 3, 'y': 2}
33+
34+
35+
def test_load_all():
36+
gen = yaml.load_all('{x: 1, z: 3, y: 2}\n--- {}\n')
37+
assert isinstance(gen, GeneratorType)
38+
ordered_data, empty_dict = gen
39+
assert empty_dict == {}
40+
assert ordered_data == data
1941

2042

2143
@pytest.mark.skipif(sys.version_info >= (3,7), reason="requires python3.6-")
2244
def test_loads_to_ordered_dict():
23-
loaded = yaml.load('{k1: v1, k3: v3, k2: v2}')
45+
loaded = yaml.load('{x: 1, z: 3, y: 2}')
2446
assert isinstance(loaded, OrderedDict)
2547

2648

2749
@pytest.mark.skipif(sys.version_info < (3,7), reason="requires python3.7+")
2850
def test_loads_to_std_dict():
29-
loaded = yaml.load('{k1: v1, k3: v3, k2: v2}')
51+
loaded = yaml.load('{x: 1, z: 3, y: 2}')
3052
assert not isinstance(loaded, OrderedDict)
3153
assert isinstance(loaded, dict)
3254

3355

56+
def test_subclass_dump():
57+
58+
class MyOrderedDict(OrderedDict):
59+
pass
60+
61+
data = MyOrderedDict([('x', 1), ('y', 2)])
62+
assert '!!python/object/apply:test_oyaml.MyOrderedDict' in yaml.dump(data)
63+
with pytest.raises(RepresenterError) as cm:
64+
yaml.safe_dump(data)
65+
assert str(cm.value) == "cannot represent an object: MyOrderedDict([('x', 1), ('y', 2)])"
66+
67+
3468
def test_anchors_and_references():
3569
text = '''
3670
defaults:

0 commit comments

Comments
 (0)