Skip to content

Commit 1e8c8ff

Browse files
authored
Merge pull request #3 from wimglenn/develop
Support for anchors/references
2 parents 05856d9 + ab19d35 commit 1e8c8ff

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed

oyaml.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,27 @@
44
import yaml as pyyaml
55

66

7-
_viewitems = 'viewitems' if sys.version_info < (3,) else 'items'
7+
_items = 'viewitems' if sys.version_info < (3,) else 'items'
88

99

10-
def _representer(dumper, data):
11-
return dumper.represent_dict(getattr(data, _viewitems)())
10+
def map_representer(dumper, data):
11+
return dumper.represent_dict(getattr(data, _items)())
1212

1313

14-
def _constructor(loader, node):
14+
def map_constructor(loader, node):
15+
loader.flatten_mapping(node)
1516
return OrderedDict(loader.construct_pairs(node))
1617

1718

18-
pyyaml.add_representer(dict, _representer)
19-
pyyaml.add_representer(OrderedDict, _representer)
19+
pyyaml.add_representer(dict, map_representer)
20+
pyyaml.add_representer(OrderedDict, map_representer)
2021

2122

2223
if sys.version_info < (3, 7):
23-
pyyaml.add_constructor(pyyaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, _constructor)
24+
pyyaml.add_constructor('tag:yaml.org,2002:map', map_constructor)
25+
26+
27+
del map_constructor, map_representer
2428

2529

2630
# Merge PyYAML namespace into ours.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setup(
44
name='oyaml',
5-
version='0.1',
5+
version='0.2',
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: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,38 @@ def test_loads_to_std_dict():
2929
loaded = yaml.load('{k1: v1, k3: v3, k2: v2}')
3030
assert not isinstance(loaded, OrderedDict)
3131
assert isinstance(loaded, dict)
32+
33+
34+
def test_anchors_and_references():
35+
text = '''
36+
defaults:
37+
all: &all
38+
product: foo
39+
development: &development
40+
<<: *all
41+
profile: bar
42+
43+
development:
44+
platform:
45+
<<: *development
46+
host: baz
47+
'''
48+
expected_load = {
49+
'defaults': {
50+
'all': {
51+
'product': 'foo',
52+
},
53+
'development': {
54+
'product': 'foo',
55+
'profile': 'bar',
56+
},
57+
},
58+
'development': {
59+
'platform': {
60+
'host': 'baz',
61+
'product': 'foo',
62+
'profile': 'bar',
63+
},
64+
},
65+
}
66+
assert yaml.load(text) == expected_load

0 commit comments

Comments
 (0)