Skip to content

Commit

Permalink
added 2 jinja filters: yaml and json
Browse files Browse the repository at this point in the history
  • Loading branch information
Xavier Barbosa committed Jul 8, 2013
1 parent 18e270d commit 02f48b7
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 2 deletions.
27 changes: 27 additions & 0 deletions doc/ref/renderers/all/salt.renderers.jinja.rst
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,33 @@ the context into the included file is required:
.. _imports: http://jinja.pocoo.org/docs/templates/#import

Variable Serializers
====================

Salt allows to serialize any variable into **json** or **yaml**. For example this
variable::

data:
foo: True
bar: 42
baz:
- 1
- 2
- 3
qux: 2.0

with this template::

yaml -> {{ data|yaml }}

json -> {{ data|json }}

will be rendered has::

yaml -> {bar: 42, baz: [1, 2, 3], foo: true, qux: 2.0}

json -> {"baz": [1, 2, 3], "foo": true, "bar": 42, "qux": 2.0}

Template Inheritance
====================

Expand Down
53 changes: 51 additions & 2 deletions salt/utils/jinja.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,24 @@
# Import python libs
from os import path
import logging
from functools import partial
import json

# Import third party libs
from jinja2 import BaseLoader
from jinja2.exceptions import TemplateNotFound
from jinja2 import BaseLoader, Markup, TemplateNotFound
from jinja2.ext import Extension
import yaml

# Import salt libs
import salt
import salt.fileclient

log = logging.getLogger(__name__)

__all__ = [
'SaltCacheLoader',
'SerializerExtension'
]

class SaltCacheLoader(BaseLoader):
'''
Expand Down Expand Up @@ -88,3 +95,45 @@ def uptodate():
continue
# there is no template file within searchpaths
raise TemplateNotFound(template)


class SerializerExtension(Extension):
"""
Serializes variables.
For example, this dataset:
.. code-block:: python
data = {
"foo": True,
"bar": 42,
"baz": [1, 2, 3],
"qux": 2.0
}
.. code-block:: jinja
yaml = {{ data|yaml }}
json = {{ data|json }}
will be rendered has::
yaml = {bar: 42, baz: [1, 2, 3], foo: true, qux: 2.0}
json = {"baz": [1, 2, 3], "foo": true, "bar": 42, "qux": 2.0}
"""

def __init__(self, environment):
self.environment = environment
environment.filters.update({
'yaml': partial(self.format, formatter='yaml'),
'json': partial(self.format, formatter='json')
})

def format(self, value, formatter, *args, **kwargs):
if formatter == "json":
return Markup(json.dumps(value))
elif formatter == "yaml":
return Markup(yaml.dump(value, default_flow_style=True))
raise ValueError("Serializer {} is not implemented".format(formatter))
2 changes: 2 additions & 0 deletions salt/utils/templates.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import salt.utils
import salt.exceptions
from salt.utils.jinja import SaltCacheLoader as JinjaSaltCacheLoader
from salt.utils.jinja import SerializerExtension as JinjaSerializerExtension

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -107,6 +108,7 @@ def render_jinja_tmpl(tmplstr, context, tmplpath=None):
env_args['extensions'].append('jinja2.ext.do')
if hasattr(jinja2.ext, 'loopcontrols'):
env_args['extensions'].append('jinja2.ext.loopcontrols')
jinja_env.add_extension(JinjaSerializerExtension)

if opts.get('allow_undefined', False):
jinja_env = jinja2.Environment(**env_args)
Expand Down

0 comments on commit 02f48b7

Please sign in to comment.