Merge pull request #38554 from multani/fix/30454

Fix YAML deserialization of unicode
This commit is contained in:
Mike Place 2017-01-04 08:31:16 -07:00 committed by GitHub
commit 325dc56e59
4 changed files with 50 additions and 9 deletions

View file

@ -349,7 +349,6 @@ class SerializerExtension(Extension, object):
super(SerializerExtension, self).__init__(environment)
self.environment.filters.update({
'yaml': self.format_yaml,
'yaml_safe': self.format_yaml_safe,
'json': self.format_json,
'python': self.format_python,
'load_yaml': self.load_yaml,
@ -391,13 +390,6 @@ class SerializerExtension(Extension, object):
yaml_txt = yaml_txt[:len(yaml_txt)-4]
return Markup(yaml_txt)
def format_yaml_safe(self, value, flow_style=True):
yaml_txt = yaml.safe_dump(value, default_flow_style=flow_style,
Dumper=OrderedDictDumper).strip()
if yaml_txt.endswith('\n...\n'):
yaml_txt = yaml_txt[:len(yaml_txt-5)]
return Markup(yaml_txt)
def format_python(self, value):
return Markup(pprint.pformat(value).strip())

View file

@ -45,6 +45,9 @@ class SaltYamlSafeLoader(yaml.SafeLoader, object):
self.add_constructor(
u'tag:yaml.org,2002:omap',
type(self).construct_yaml_map)
self.add_constructor(
u'tag:yaml.org,2002:python/unicode',
type(self).construct_unicode)
self.dictclass = dictclass
def construct_yaml_map(self, node):
@ -53,6 +56,9 @@ class SaltYamlSafeLoader(yaml.SafeLoader, object):
value = self.construct_mapping(node)
data.update(value)
def construct_unicode(self, node):
return node.value
def construct_mapping(self, node, deep=False):
'''
Build the mapping for YAML

View file

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Import Python Libs
from __future__ import absolute_import
# Import Salt Testing libs
from salttesting import TestCase
from salttesting.helpers import ensure_in_syspath
ensure_in_syspath('../../')
# Import Salt libs
from salt.renderers import yaml
yaml.__salt__ = {}
yaml.__opts__ = {}
class YAMLRendererTestCase(TestCase):
def test_yaml_render_string(self):
data = "string"
result = yaml.render(data)
self.assertEqual(result, data)
def test_yaml_render_unicode(self):
data = "!!python/unicode python unicode string"
result = yaml.render(data)
self.assertEqual(result, u"python unicode string")

View file

@ -471,7 +471,14 @@ class TestCustomExtensions(TestCase):
"foo": True,
"bar": 42,
"baz": [1, 2, 3],
"qux": 2.0
"qux": 2.0,
"spam": OrderedDict([
('foo', OrderedDict([
('bar', 'baz'),
('qux', 42)
])
)
])
}
env = Environment(extensions=[SerializerExtension])
rendered = env.from_string('{{ dataset|yaml }}').render(dataset=dataset)
@ -483,6 +490,12 @@ class TestCustomExtensions(TestCase):
rendered = env.from_string('{{ dataset|yaml }}').render(dataset=dataset)
self.assertEqual(dataset, rendered)
def test_serialize_yaml_unicode(self):
dataset = u"str value"
env = Environment(extensions=[SerializerExtension])
rendered = env.from_string('{{ dataset|yaml }}').render(dataset=dataset)
self.assertEqual("!!python/unicode str value", rendered)
def test_serialize_python(self):
dataset = {
"foo": True,