From 6350d9de586f40014296b55427ccbc1d7f47269a Mon Sep 17 00:00:00 2001 From: wim glenn Date: Thu, 28 Mar 2019 18:15:21 -0500 Subject: [PATCH] preserve contextual error when patching the loader (#18) resolves https://github.com/wimglenn/oyaml/issues/17 --- oyaml.py | 7 ++++++- setup.py | 2 +- test_oyaml.py | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/oyaml.py b/oyaml.py index dc2ac0b..0d88865 100644 --- a/oyaml.py +++ b/oyaml.py @@ -17,7 +17,12 @@ def map_representer(dumper, data): def map_constructor(loader, node): loader.flatten_mapping(node) - return OrderedDict(loader.construct_pairs(node)) + pairs = loader.construct_pairs(node) + try: + return OrderedDict(pairs) + except TypeError: + loader.construct_mapping(node) # trigger any contextual error + raise 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 53562b6..bc6136e 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,8 @@ def test_merge(): assert map2 == expected assert map3 == expected assert map4 == expected + + +def test_unhashable_error_context(): + with pytest.raises(ConstructorError, match=r".*line.*column.*"): + yaml.safe_load("{foo: bar}: baz")