Skip to content

Commit

Permalink
test on 4.2b4
Browse files Browse the repository at this point in the history
  • Loading branch information
wimglenn committed Aug 29, 2018
1 parent 38131ef commit 241e1c5
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 14 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ python:
env:
- PYYAML_VERSION="3.13"
# - PYYAML_VERSION="4.1" # this was pulled from the index (!) ..wtf, Ingy?
- PYYAML_VERSION="4.2b4"

matrix:
fast_finish: true
Expand Down
10 changes: 8 additions & 2 deletions oyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@ def map_constructor(loader, node):
loader.flatten_mapping(node)
return OrderedDict(loader.construct_pairs(node))


if pyyaml.safe_dump is pyyaml.dump:
# PyYAML >= 4
# PyYAML v4.1
SafeDumper = pyyaml.dumper.Dumper
DangerDumper = pyyaml.dumper.DangerDumper
SafeLoader = pyyaml.loader.Loader
DangerLoader = pyyaml.loader.DangerLoader
else:
SafeDumper = pyyaml.dumper.SafeDumper
DangerDumper = pyyaml.dumper.Dumper
SafeLoader = pyyaml.loader.SafeLoader
DangerLoader = pyyaml.loader.Loader

pyyaml.add_representer(dict, map_representer, Dumper=SafeDumper)
pyyaml.add_representer(OrderedDict, map_representer, Dumper=SafeDumper)
Expand All @@ -30,7 +35,8 @@ def map_constructor(loader, node):


if sys.version_info < (3, 7):
pyyaml.add_constructor('tag:yaml.org,2002:map', map_constructor)
pyyaml.add_constructor('tag:yaml.org,2002:map', map_constructor, Loader=SafeLoader)
pyyaml.add_constructor('tag:yaml.org,2002:map', map_constructor, Loader=DangerLoader)


del map_constructor, map_representer
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name='oyaml',
version='0.5',
version='0.6',
description='Ordered YAML: drop-in replacement for PyYAML which preserves dict ordering',
long_description=open('README.rst').read(),
author='Wim Glenn',
Expand Down
42 changes: 31 additions & 11 deletions test_oyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
data = OrderedDict([('x', 1), ('z', 3), ('y', 2)])


# this release was pulled from index, but still might be seen in the wild
pyyaml_41 = yaml.pyyaml.__version__ == '4.1'


def test_dump():
assert yaml.dump(data) == '{x: 1, z: 3, y: 2}\n'

Expand All @@ -18,7 +22,7 @@ def test_safe_dump():
assert yaml.safe_dump(data) == '{x: 1, z: 3, y: 2}\n'


@pytest.mark.skipif(yaml.pyyaml.__version__ < '4', reason="requires PyYAML version >= 4")
@pytest.mark.skipif(not pyyaml_41, reason="requires PyYAML version == 4.1")
def test_danger_dump():
assert yaml.danger_dump(data) == '{x: 1, z: 3, y: 2}\n'

Expand All @@ -27,14 +31,14 @@ def test_dump_all():
assert yaml.dump_all(documents=[data, {}]) == '{x: 1, z: 3, y: 2}\n--- {}\n'


@pytest.mark.skipif(yaml.pyyaml.__version__ >= '4', reason="requires PyYAML version < 4")
@pytest.mark.skipif(pyyaml_41, reason="requires PyYAML version != 4.1")
def test_dump_and_safe_dump_match():
mydict = {'x': 1, 'z': 2, 'y': 3}
# don't know if mydict is ordered in the implementation or not (but don't care)
assert yaml.dump(mydict) == yaml.safe_dump(mydict)


@pytest.mark.skipif(yaml.pyyaml.__version__ < '4', reason="requires PyYAML version >= 4")
@pytest.mark.skipif(not pyyaml_41, reason="requires PyYAML version == 4.1")
def test_danger_dump_and_safe_dump_match():
mydict = {'x': 1, 'z': 2, 'y': 3}
assert yaml.danger_dump(mydict) == yaml.safe_dump(mydict)
Expand All @@ -49,6 +53,11 @@ def test_load():
assert loaded == {'x': 1, 'z': 3, 'y': 2}


def test_safe_load():
loaded = yaml.safe_load('{x: 1, z: 3, y: 2}')
assert loaded == {'x': 1, 'z': 3, 'y': 2}


def test_load_all():
gen = yaml.load_all('{x: 1, z: 3, y: 2}\n--- {}\n')
assert isinstance(gen, GeneratorType)
Expand All @@ -57,39 +66,50 @@ def test_load_all():
assert ordered_data == data


@pytest.mark.skipif(sys.version_info >= (3,7), reason="requires python3.6-")
@pytest.mark.skipif(sys.version_info >= (3, 7), reason="requires python3.6-")
def test_loads_to_ordered_dict():
loaded = yaml.load('{x: 1, z: 3, y: 2}')
assert isinstance(loaded, OrderedDict)


@pytest.mark.skipif(sys.version_info < (3,7), reason="requires python3.7+")
@pytest.mark.skipif(sys.version_info < (3, 7), reason="requires python3.7+")
def test_loads_to_std_dict():
loaded = yaml.load('{x: 1, z: 3, y: 2}')
assert not isinstance(loaded, OrderedDict)
assert isinstance(loaded, dict)


@pytest.mark.skipif(sys.version_info >= (3, 7), reason="requires python3.6-")
def test_safe_loads_to_ordered_dict():
loaded = yaml.safe_load('{x: 1, z: 3, y: 2}')
assert isinstance(loaded, OrderedDict)


@pytest.mark.skipif(sys.version_info < (3, 7), reason="requires python3.7+")
def test_safe_loads_to_std_dict():
loaded = yaml.safe_load('{x: 1, z: 3, y: 2}')
assert not isinstance(loaded, OrderedDict)
assert isinstance(loaded, dict)


class MyOrderedDict(OrderedDict):
pass


@pytest.mark.skipif(yaml.pyyaml.__version__ >= '4', reason="requires PyYAML version < 4")
@pytest.mark.skipif(pyyaml_41, reason="requires PyYAML version != 4.1")
def test_subclass_dump_pyyaml3():
data = MyOrderedDict([('x', 1), ('y', 2)])
assert '!!python/object/apply:test_oyaml.MyOrderedDict' in yaml.dump(data)
with pytest.raises(yaml.pyyaml.representer.RepresenterError) as cm:
with pytest.raises(yaml.pyyaml.representer.RepresenterError, match='cannot represent an object') as cm:
yaml.safe_dump(data)
assert str(cm.value) == "cannot represent an object: MyOrderedDict([('x', 1), ('y', 2)])"


@pytest.mark.skipif(yaml.pyyaml.__version__ < '4', reason="requires PyYAML version >= 4")
@pytest.mark.skipif(not pyyaml_41, reason="requires PyYAML version == 4.1")
def test_subclass_dump_pyyaml4():
data = MyOrderedDict([('x', 1), ('y', 2)])
assert '!!python/object/apply:test_oyaml.MyOrderedDict' in yaml.danger_dump(data)
with pytest.raises(yaml.pyyaml.representer.RepresenterError) as cm:
with pytest.raises(yaml.pyyaml.representer.RepresenterError, match='cannot represent an object') as cm:
yaml.dump(data)
assert str(cm.value) == "('cannot represent an object', MyOrderedDict([('x', 1), ('y', 2)]))"


def test_anchors_and_references():
Expand Down

0 comments on commit 241e1c5

Please sign in to comment.