fix yaml output

In b9be2de, OrderedDict was replaced with HashableOrderedDict.
Add logic to yamldumper to handle the new type.
This commit is contained in:
Tom Doherty 2024-08-07 15:18:41 +01:00 committed by Daniel Wozniak
parent 9922b1a145
commit caf62f97bd
5 changed files with 91 additions and 7 deletions

1
changelog/66783.fixed.md Normal file
View file

@ -0,0 +1 @@
fix yaml output

View file

@ -51,7 +51,7 @@ from salt.exceptions import CommandExecutionError, SaltRenderError, SaltReqTimeo
from salt.serializers.msgpack import deserialize as msgpack_deserialize
from salt.serializers.msgpack import serialize as msgpack_serialize
from salt.template import compile_template, compile_template_str
from salt.utils.odict import DefaultOrderedDict, OrderedDict
from salt.utils.odict import DefaultOrderedDict, HashableOrderedDict
log = logging.getLogger(__name__)
@ -127,11 +127,6 @@ STATE_INTERNAL_KEYWORDS = STATE_REQUISITE_KEYWORDS.union(
).union(STATE_RUNTIME_KEYWORDS)
class HashableOrderedDict(OrderedDict):
def __hash__(self):
return id(self)
def split_low_tag(tag):
"""
Take a low tag and split it back into the low dict that it came from

View file

@ -62,3 +62,8 @@ class DefaultOrderedDict(OrderedDict):
return "DefaultOrderedDict({}, {})".format(
self.default_factory, super().__repr__()
)
class HashableOrderedDict(OrderedDict):
def __hash__(self):
return id(self)

View file

@ -13,7 +13,7 @@ import collections
import yaml # pylint: disable=blacklisted-import
import salt.utils.context
from salt.utils.odict import OrderedDict
from salt.utils.odict import HashableOrderedDict, OrderedDict
try:
from yaml import CDumper as Dumper
@ -71,7 +71,9 @@ def represent_undefined(dumper, data):
OrderedDumper.add_representer(OrderedDict, represent_ordereddict)
OrderedDumper.add_representer(HashableOrderedDict, represent_ordereddict)
SafeOrderedDumper.add_representer(OrderedDict, represent_ordereddict)
SafeOrderedDumper.add_representer(HashableOrderedDict, represent_ordereddict)
SafeOrderedDumper.add_representer(None, represent_undefined)
OrderedDumper.add_representer(

View file

@ -2,7 +2,11 @@
Unit tests for salt.utils.yamldumper
"""
from collections import OrderedDict, defaultdict
import salt.utils.yamldumper
from salt.utils.context import NamespacedDictWrapper
from salt.utils.odict import HashableOrderedDict
from tests.support.unit import TestCase
@ -35,3 +39,80 @@ class YamlDumperTestCase(TestCase):
salt.utils.yamldumper.safe_dump(data, default_flow_style=False)
== "foo: bar\n"
)
def test_yaml_ordered_dump(self):
"""
Test yaml.dump with OrderedDict
"""
data = OrderedDict([("foo", "bar"), ("baz", "qux")])
exp_yaml = "{foo: bar, baz: qux}\n"
assert (
salt.utils.yamldumper.dump(data, Dumper=salt.utils.yamldumper.OrderedDumper)
== exp_yaml
)
def test_yaml_safe_ordered_dump(self):
"""
Test yaml.safe_dump with OrderedDict
"""
data = OrderedDict([("foo", "bar"), ("baz", "qux")])
exp_yaml = "{foo: bar, baz: qux}\n"
assert salt.utils.yamldumper.safe_dump(data) == exp_yaml
def test_yaml_indent_safe_ordered_dump(self):
"""
Test yaml.dump with IndentedSafeOrderedDumper
"""
data = OrderedDict([("foo", ["bar", "baz"]), ("qux", "quux")])
exp_yaml = "foo:\n- bar\n- baz\nqux: quux\n"
assert (
salt.utils.yamldumper.dump(
data,
Dumper=salt.utils.yamldumper.IndentedSafeOrderedDumper,
default_flow_style=False,
)
== exp_yaml
)
def test_yaml_defaultdict_dump(self):
"""
Test yaml.dump with defaultdict
"""
data = defaultdict(list)
data["foo"].append("bar")
exp_yaml = "foo: [bar]\n"
assert salt.utils.yamldumper.safe_dump(data) == exp_yaml
def test_yaml_namespaced_dict_wrapper_dump(self):
"""
Test yaml.dump with NamespacedDictWrapper
"""
data = NamespacedDictWrapper({"test": {"foo": "bar"}}, "test")
exp_yaml = (
"!!python/object/new:salt.utils.context.NamespacedDictWrapper\n"
"dictitems: {foo: bar}\n"
"state:\n"
" _NamespacedDictWrapper__dict:\n"
" test: {foo: bar}\n"
" pre_keys: !!python/tuple [test]\n"
)
assert salt.utils.yamldumper.dump(data) == exp_yaml
def test_yaml_undefined_dump(self):
"""
Test yaml.safe_dump with None
"""
data = {"foo": None}
exp_yaml = "{foo: null}\n"
assert salt.utils.yamldumper.safe_dump(data) == exp_yaml
def test_yaml_hashable_ordered_dict_dump(self):
"""
Test yaml.dump with HashableOrderedDict
"""
data = HashableOrderedDict([("foo", "bar"), ("baz", "qux")])
exp_yaml = "{foo: bar, baz: qux}\n"
assert (
salt.utils.yamldumper.dump(data, Dumper=salt.utils.yamldumper.OrderedDumper)
== exp_yaml
)