mirror of https://github.com/python/cpython
gh-113537: support loads str in plistlib.loads (#113582)
Add support for loading XML plists from a string value instead of a only bytes value.
This commit is contained in:
parent
66f3964815
commit
bbf214df23
|
@ -27,7 +27,7 @@ top level object is a dictionary.
|
|||
To write out and to parse a plist file, use the :func:`dump` and
|
||||
:func:`load` functions.
|
||||
|
||||
To work with plist data in bytes objects, use :func:`dumps`
|
||||
To work with plist data in bytes or string objects, use :func:`dumps`
|
||||
and :func:`loads`.
|
||||
|
||||
Values can be strings, integers, floats, booleans, tuples, lists, dictionaries
|
||||
|
@ -89,11 +89,13 @@ This module defines the following functions:
|
|||
|
||||
.. function:: loads(data, *, fmt=None, dict_type=dict, aware_datetime=False)
|
||||
|
||||
Load a plist from a bytes object. See :func:`load` for an explanation of
|
||||
the keyword arguments.
|
||||
Load a plist from a bytes or string object. See :func:`load` for an
|
||||
explanation of the keyword arguments.
|
||||
|
||||
.. versionadded:: 3.4
|
||||
|
||||
.. versionchanged:: 3.13
|
||||
*data* can be a string when *fmt* equals :data:`FMT_XML`.
|
||||
|
||||
.. function:: dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False, aware_datetime=False)
|
||||
|
||||
|
|
|
@ -906,6 +906,11 @@ def loads(value, *, fmt=None, dict_type=dict, aware_datetime=False):
|
|||
"""Read a .plist file from a bytes object.
|
||||
Return the unpacked root object (which usually is a dictionary).
|
||||
"""
|
||||
if isinstance(value, str):
|
||||
if fmt == FMT_BINARY:
|
||||
raise TypeError("value must be bytes-like object when fmt is "
|
||||
"FMT_BINARY")
|
||||
value = value.encode()
|
||||
fp = BytesIO(value)
|
||||
return load(fp, fmt=fmt, dict_type=dict_type, aware_datetime=aware_datetime)
|
||||
|
||||
|
|
|
@ -510,6 +510,19 @@ class TestPlistlib(unittest.TestCase):
|
|||
data2 = plistlib.dumps(pl2)
|
||||
self.assertEqual(data, data2)
|
||||
|
||||
def test_loads_str_with_xml_fmt(self):
|
||||
pl = self._create()
|
||||
b = plistlib.dumps(pl)
|
||||
s = b.decode()
|
||||
self.assertIsInstance(s, str)
|
||||
pl2 = plistlib.loads(s)
|
||||
self.assertEqual(pl, pl2)
|
||||
|
||||
def test_loads_str_with_binary_fmt(self):
|
||||
msg = "value must be bytes-like object when fmt is FMT_BINARY"
|
||||
with self.assertRaisesRegex(TypeError, msg):
|
||||
plistlib.loads('test', fmt=plistlib.FMT_BINARY)
|
||||
|
||||
def test_indentation_array(self):
|
||||
data = [[[[[[[[{'test': b'aaaaaa'}]]]]]]]]
|
||||
self.assertEqual(plistlib.loads(plistlib.dumps(data)), data)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Support loads ``str`` in :func:`plistlib.loads`.
|
Loading…
Reference in New Issue