Merge pull request #6 from SpamapS/master

Render complex sub-objects using json.dumps
This commit is contained in:
Tim Miller 2013-03-20 09:28:31 -07:00
commit 354297435d
3 changed files with 47 additions and 2 deletions

View File

@ -2,7 +2,6 @@
import json import json
import logging import logging
import os import os
import pystache
import sys import sys
from argparse import ArgumentParser from argparse import ArgumentParser
from pystache.context import KeyNotFoundError from pystache.context import KeyNotFoundError
@ -10,6 +9,7 @@ from subprocess import Popen, PIPE
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from value_types import ensure_type from value_types import ensure_type
from config_exception import ConfigException from config_exception import ConfigException
from renderers import JsonRenderer
TEMPLATES_DIR = os.environ.get('OS_CONFIG_APPLIER_TEMPLATES', TEMPLATES_DIR = os.environ.get('OS_CONFIG_APPLIER_TEMPLATES',
'/opt/stack/os-config-applier/templates') '/opt/stack/os-config-applier/templates')
@ -76,7 +76,7 @@ def is_executable(path):
def render_moustache(text, config): def render_moustache(text, config):
r = pystache.Renderer(missing_tags='strict') r = JsonRenderer(missing_tags='strict')
return r.render(text, config) return r.render(text, config)

View File

@ -0,0 +1,26 @@
import json
from pystache import Renderer
class JsonRenderer(Renderer):
def __init__(self,
file_encoding=None,
string_encoding=None,
decode_errors=None,
search_dirs=None,
file_extension=None,
escape=None,
partials=None,
missing_tags=None):
# json would be html escaped otherwise
if escape is None:
escape = lambda u: u
return super(JsonRenderer, self).__init__(file_encoding,
string_encoding,
decode_errors, search_dirs,
file_extension, escape,
partials, missing_tags)
def str_coerce(self, val):
return json.dumps(val)

View File

@ -0,0 +1,19 @@
import json
from nose.tools import assert_equals
from os_config_applier.renderers import JsonRenderer
TEST_JSON = '{"a":{"b":[1,2,3,"foo"],"c": "the quick brown fox"}}'
def test_json_renderer():
context = json.loads(TEST_JSON)
x = JsonRenderer()
result = x.render('{{a.b}}', context)
print result
result_structure = json.loads(result)
desire_structure = json.loads('[1,2,3,"foo"]')
assert_equals(desire_structure, result_structure)
result = x.render('{{a.c}}', context)
print result
assert_equals(u'the quick brown fox', result)