From 4a4bccab1e94b552c0ed25d22de93c7e92cd44bc Mon Sep 17 00:00:00 2001 From: tuunit Date: Fri, 29 Dec 2023 22:57:24 +0000 Subject: [PATCH 1/3] fix yaml default mapping value resolver breaking parsing of simple string lists --- lib/yaml/constructor.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/yaml/constructor.py b/lib/yaml/constructor.py index 619acd30..8cad129a 100644 --- a/lib/yaml/constructor.py +++ b/lib/yaml/constructor.py @@ -8,6 +8,7 @@ 'ConstructorError' ] +from collections import defaultdict from .error import * from .nodes import * @@ -134,13 +135,16 @@ def construct_mapping(self, node, deep=False): raise ConstructorError(None, None, "expected a mapping node, but found %s" % node.id, node.start_mark) - mapping = {} + mapping = defaultdict() for key_node, value_node in node.value: key = self.construct_object(key_node, deep=deep) if not isinstance(key, collections.abc.Hashable): raise ConstructorError("while constructing a mapping", node.start_mark, "found unhashable key", key_node.start_mark) value = self.construct_object(value_node, deep=deep) + + if key_node.tag == "tag:yaml.org,2002:value": + mapping.default_factory = self.mapping_values_default_factory(value) mapping[key] = value return mapping @@ -168,13 +172,13 @@ def add_multi_constructor(cls, tag_prefix, multi_constructor): cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() cls.yaml_multi_constructors[tag_prefix] = multi_constructor + @staticmethod + def mapping_values_default_factory(value): + return lambda: value + class SafeConstructor(BaseConstructor): def construct_scalar(self, node): - if isinstance(node, MappingNode): - for key_node, value_node in node.value: - if key_node.tag == 'tag:yaml.org,2002:value': - return self.construct_scalar(value_node) return super().construct_scalar(node) def flatten_mapping(self, node): @@ -204,9 +208,6 @@ def flatten_mapping(self, node): raise ConstructorError("while constructing a mapping", node.start_mark, "expected a mapping or list of mappings for merging, but found %s" % value_node.id, value_node.start_mark) - elif key_node.tag == 'tag:yaml.org,2002:value': - key_node.tag = 'tag:yaml.org,2002:str' - index += 1 else: index += 1 if merge: @@ -408,10 +409,11 @@ def construct_yaml_seq(self, node): data.extend(self.construct_sequence(node)) def construct_yaml_map(self, node): - data = {} + data = defaultdict() yield data value = self.construct_mapping(node) data.update(value) + data.default_factory = value.default_factory def construct_yaml_object(self, node, cls): data = cls.__new__(cls) @@ -468,6 +470,10 @@ def construct_undefined(self, node): 'tag:yaml.org,2002:str', SafeConstructor.construct_yaml_str) +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:value', + SafeConstructor.construct_yaml_str) + SafeConstructor.add_constructor( 'tag:yaml.org,2002:seq', SafeConstructor.construct_yaml_seq) @@ -670,6 +676,14 @@ def construct_python_object_new(self, suffix, node): 'tag:yaml.org,2002:python/str', FullConstructor.construct_python_str) +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/value', + FullConstructor.construct_python_str) + +FullConstructor.add_constructor( + 'tag:yaml.org,2002:python/value', + FullConstructor.construct_python_str) + FullConstructor.add_constructor( 'tag:yaml.org,2002:python/unicode', FullConstructor.construct_python_unicode) From 74cdb2a696bf72d391a2e868532cec0adf3771bd Mon Sep 17 00:00:00 2001 From: tuunit Date: Fri, 29 Dec 2023 22:58:32 +0000 Subject: [PATCH 2/3] remove duplicate lines --- lib/yaml/constructor.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/yaml/constructor.py b/lib/yaml/constructor.py index 8cad129a..a2e339e8 100644 --- a/lib/yaml/constructor.py +++ b/lib/yaml/constructor.py @@ -680,10 +680,6 @@ def construct_python_object_new(self, suffix, node): 'tag:yaml.org,2002:python/value', FullConstructor.construct_python_str) -FullConstructor.add_constructor( - 'tag:yaml.org,2002:python/value', - FullConstructor.construct_python_str) - FullConstructor.add_constructor( 'tag:yaml.org,2002:python/unicode', FullConstructor.construct_python_unicode) From 06b7b31b3b4d8bbf32a6ccd8e125ff477ff30168 Mon Sep 17 00:00:00 2001 From: tuunit Date: Fri, 29 Dec 2023 23:09:06 +0000 Subject: [PATCH 3/3] add test data --- tests/legacy_tests/data/str.data | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/legacy_tests/data/str.data b/tests/legacy_tests/data/str.data index 7cbdb7c6..b0aedb87 100644 --- a/tests/legacy_tests/data/str.data +++ b/tests/legacy_tests/data/str.data @@ -1 +1,2 @@ - abcd +- =