Merge pull request #1406 from madig/plistlib-accept-mapping-for-dict

[plistlib] Treat Mapping objects as dicts
This commit is contained in:
Cosimo Lupo 2018-12-13 16:12:36 +00:00 committed by GitHub
commit fa69bb0d94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 2 deletions

View File

@ -6,6 +6,11 @@ from datetime import datetime
from base64 import b64encode, b64decode
from numbers import Integral
try:
from collections.abc import Mapping # python >= 3.3
except ImportError:
from collections import Mapping
try:
from functools import singledispatch
except ImportError:
@ -384,7 +389,7 @@ if singledispatch is not None:
_make_element.register(bool)(_bool_element)
_make_element.register(Integral)(_integer_element)
_make_element.register(float)(_real_element)
_make_element.register(dict)(_dict_element)
_make_element.register(Mapping)(_dict_element)
_make_element.register(list)(_array_element)
_make_element.register(tuple)(_array_element)
_make_element.register(datetime)(_date_element)
@ -404,7 +409,7 @@ else:
return _integer_element(value, ctx)
elif isinstance(value, float):
return _real_element(value, ctx)
elif isinstance(value, dict):
elif isinstance(value, Mapping):
return _dict_element(value, ctx)
elif isinstance(value, (list, tuple)):
return _array_element(value, ctx)

View File

@ -14,6 +14,10 @@ from fontTools.ufoLib.plistlib import (
)
import pytest
try:
from collections.abc import Mapping # python >= 3.3
except ImportError:
from collections import Mapping
PY2 = sys.version_info < (3,)
if PY2:
@ -530,6 +534,25 @@ def test_non_ascii_bytes():
plistlib.dumps("\U0001f40d".encode("utf-8"), use_builtin_types=False)
class CustomMapping(Mapping):
a = {"a": 1, "b": 2}
def __getitem__(self, key):
return self.a[key]
def __iter__(self):
return iter(self.a)
def __len__(self):
return len(self.a)
def test_custom_mapping():
test_mapping = CustomMapping()
data = plistlib.dumps(test_mapping)
assert plistlib.loads(data) == {"a": 1, "b": 2}
if __name__ == "__main__":
import sys