Skip to content

Commit

Permalink
Merge pull request #3 from wimglenn/develop
Browse files Browse the repository at this point in the history
Support for anchors/references
  • Loading branch information
wimglenn committed Feb 26, 2018
2 parents 05856d9 + ab19d35 commit 1e8c8ff
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 8 deletions.
18 changes: 11 additions & 7 deletions oyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,27 @@
import yaml as pyyaml


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


def _representer(dumper, data):
return dumper.represent_dict(getattr(data, _viewitems)())
def map_representer(dumper, data):
return dumper.represent_dict(getattr(data, _items)())


def _constructor(loader, node):
def map_constructor(loader, node):
loader.flatten_mapping(node)
return OrderedDict(loader.construct_pairs(node))


pyyaml.add_representer(dict, _representer)
pyyaml.add_representer(OrderedDict, _representer)
pyyaml.add_representer(dict, map_representer)
pyyaml.add_representer(OrderedDict, map_representer)


if sys.version_info < (3, 7):
pyyaml.add_constructor(pyyaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, _constructor)
pyyaml.add_constructor('tag:yaml.org,2002:map', map_constructor)


del map_constructor, map_representer


# Merge PyYAML namespace into ours.
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name='oyaml',
version='0.1',
version='0.2',
description='Ordered YAML: drop-in replacement for PyYAML which preserves dict ordering',
author='Wim Glenn',
author_email='hey@wimglenn.com',
Expand Down
35 changes: 35 additions & 0 deletions test_oyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,38 @@ def test_loads_to_std_dict():
loaded = yaml.load('{k1: v1, k3: v3, k2: v2}')
assert not isinstance(loaded, OrderedDict)
assert isinstance(loaded, dict)


def test_anchors_and_references():
text = '''
defaults:
all: &all
product: foo
development: &development
<<: *all
profile: bar
development:
platform:
<<: *development
host: baz
'''
expected_load = {
'defaults': {
'all': {
'product': 'foo',
},
'development': {
'product': 'foo',
'profile': 'bar',
},
},
'development': {
'platform': {
'host': 'baz',
'product': 'foo',
'profile': 'bar',
},
},
}
assert yaml.load(text) == expected_load

0 comments on commit 1e8c8ff

Please sign in to comment.