Skip to content

Commit

Permalink
ensure that printed OrderedDict can be parsed by YAML (like a regular…
Browse files Browse the repository at this point in the history
… dict)
  • Loading branch information
Xavier Barbosa committed Oct 9, 2013
1 parent bc45e72 commit 5690168
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions salt/utils/jinja.py
Expand Up @@ -7,6 +7,7 @@
from os import path
import logging
import json
from functools import wraps

# Import third party libs
from jinja2 import BaseLoader, Markup, TemplateNotFound, nodes
Expand Down Expand Up @@ -110,6 +111,33 @@ def uptodate():
raise TemplateNotFound(template)


class PrintableDict(OrderedDict):
'''
Ensures that dict str() and repr() are YAML friendly.
.. code-block:: python
mapping = OrderedDict([('a', 'b'), ('c', None)])
print mapping
# OrderedDict([('a', 'b'), ('c', None)])
decorated = PrintableDict(mapping)
print decorated
# {'a': 'b', 'c': None}
'''
def __str__(self):
output = []
for key, value in self.items():
output.append('{0!r}: {1!r}'.format(str(key), str(value)))
return '{' + ', '.join(output) + '}'

def __repr__(self):
output = []
for key, value in self.items():
output.append('{0!r}: {1!r}'.format(key, value))
return '{' + ', '.join(output) + '}'


class SerializerExtension(Extension, object):
'''
Yaml and Json manipulation.
Expand Down Expand Up @@ -229,6 +257,28 @@ def __init__(self, environment):
'load_json': self.load_json
})

if self.environment.finalize is None:
self.environment.finalize = self.finalizer
else:
finalizer = self.environment.finalize

@wraps(finalizer)
def wrapper(self, data):
return finalizer(self.finalizer(data))
self.environment.finalize = wrapper

def finalizer(self, data):
'''
Ensure that printed mappings are YAML friendly.
'''
def explore(data):
if isinstance(data, (dict, OrderedDict)):
return PrintableDict([(key, explore(value)) for key, value in data.items()])
elif isinstance(data, (list, tuple, set)):
return data.__class__([explore(value) for value in data])
return data
return explore(data)

def format_json(self, value):
return Markup(json.dumps(value, sort_keys=True).strip())

Expand Down

0 comments on commit 5690168

Please sign in to comment.