Skip to content

Instantly share code, notes, and snippets.

@kynikos
Forked from enaeseth/yaml_ordered_dict.py
Last active August 29, 2015 14:18
Show Gist options
  • Select an option

  • Save kynikos/5e0cd1330b823fa9d6b5 to your computer and use it in GitHub Desktop.

Select an option

Save kynikos/5e0cd1330b823fa9d6b5 to your computer and use it in GitHub Desktop.
# Original code by Eric Naeseth (enaeseth on GitHub)
# https://gist.github.com/enaeseth/844388
import yaml
import yaml.constructor
from collections import OrderedDict
class OrderedDictYAMLLoader(yaml.Loader):
"""
A YAML loader that loads mappings into ordered dictionaries.
"""
def __init__(self, *args, **kwargs):
yaml.Loader.__init__(self, *args, **kwargs)
self.add_constructor(u'tag:yaml.org,2002:map',
type(self).construct_yaml_map)
self.add_constructor(u'tag:yaml.org,2002:omap',
type(self).construct_yaml_map)
def construct_yaml_map(self, node):
data = OrderedDict()
yield data
value = self.construct_mapping(node)
data.update(value)
def construct_mapping(self, node, deep=False):
if isinstance(node, yaml.MappingNode):
self.flatten_mapping(node)
else:
raise yaml.constructor.ConstructorError(None, None,
'expected a mapping node, but found %s'
% node.id, node.start_mark)
mapping = OrderedDict()
for key_node, value_node in node.value:
key = self.construct_object(key_node, deep=deep)
try:
hash(key)
except TypeError as exc:
raise yaml.constructor.ConstructorError(
'while constructing a mapping', node.start_mark,
'found unacceptable key (%s)' % exc, key_node.start_mark)
value = self.construct_object(value_node, deep=deep)
mapping[key] = value
return mapping
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment