From 552f0279271a98a1bb051d98cb2dcae618b6b2f8 Mon Sep 17 00:00:00 2001 From: Wim Glenn Date: Thu, 28 Mar 2019 15:52:47 -0500 Subject: [PATCH 1/3] resolves https://github.com/wimglenn/oyaml/issues/17 --- oyaml.py | 3 +++ test_oyaml.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/oyaml.py b/oyaml.py index dc2ac0b..b593c04 100644 --- a/oyaml.py +++ b/oyaml.py @@ -16,6 +16,9 @@ def map_representer(dumper, data): def map_constructor(loader, node): + if not _std_dict_is_order_preserving: + # trigger any contextual error + loader.construct_mapping(node) loader.flatten_mapping(node) return OrderedDict(loader.construct_pairs(node)) diff --git a/test_oyaml.py b/test_oyaml.py index 53562b6..63b6df6 100644 --- a/test_oyaml.py +++ b/test_oyaml.py @@ -2,6 +2,7 @@ from types import GeneratorType import pytest +from yaml.constructor import ConstructorError from yaml.representer import RepresenterError import oyaml as yaml @@ -186,3 +187,9 @@ def test_merge(): assert map2 == expected assert map3 == expected assert map4 == expected + + +@pytest.mark.skipif(_std_dict_is_order_preserving, reason="requires old dict impl") +def test_unhashable_error_context(): + with pytest.raises(ConstructorError, match=r".*line.*column.*"): + yaml.safe_load("{foo: bar}: baz") From 8272adf6498722b62b079ea39e8c6b20903e660b Mon Sep 17 00:00:00 2001 From: Wim Glenn Date: Thu, 28 Mar 2019 16:23:07 -0500 Subject: [PATCH 2/3] version bump for release --- oyaml.py | 8 ++++---- setup.py | 2 +- test_oyaml.py | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/oyaml.py b/oyaml.py index b593c04..15967de 100644 --- a/oyaml.py +++ b/oyaml.py @@ -16,11 +16,11 @@ def map_representer(dumper, data): def map_constructor(loader, node): - if not _std_dict_is_order_preserving: - # trigger any contextual error - loader.construct_mapping(node) + loader.construct_mapping(node) # trigger any contextual error loader.flatten_mapping(node) - return OrderedDict(loader.construct_pairs(node)) + pairs = loader.construct_pairs(node) + result = OrderedDict(pairs) + return result if pyyaml.safe_dump is pyyaml.dump: diff --git a/setup.py b/setup.py index 807b696..a09cccf 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="oyaml", - version="0.8", + version="0.9", description="Ordered YAML: drop-in replacement for PyYAML which preserves dict ordering", long_description=open("README.rst").read(), author="Wim Glenn", diff --git a/test_oyaml.py b/test_oyaml.py index 63b6df6..bc6136e 100644 --- a/test_oyaml.py +++ b/test_oyaml.py @@ -189,7 +189,6 @@ def test_merge(): assert map4 == expected -@pytest.mark.skipif(_std_dict_is_order_preserving, reason="requires old dict impl") def test_unhashable_error_context(): with pytest.raises(ConstructorError, match=r".*line.*column.*"): yaml.safe_load("{foo: bar}: baz") From cd2b35843ecc5cce66a301c7d4fa94151284c14f Mon Sep 17 00:00:00 2001 From: Wim Glenn Date: Thu, 28 Mar 2019 16:27:00 -0500 Subject: [PATCH 3/3] dont degrade efficiency in happy path --- oyaml.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/oyaml.py b/oyaml.py index 15967de..0d88865 100644 --- a/oyaml.py +++ b/oyaml.py @@ -16,11 +16,13 @@ def map_representer(dumper, data): def map_constructor(loader, node): - loader.construct_mapping(node) # trigger any contextual error loader.flatten_mapping(node) pairs = loader.construct_pairs(node) - result = OrderedDict(pairs) - return result + try: + return OrderedDict(pairs) + except TypeError: + loader.construct_mapping(node) # trigger any contextual error + raise if pyyaml.safe_dump is pyyaml.dump: