mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 10:44:36 +08:00
Update plistlib from CPython 3.10.6
This commit is contained in:
1 parent
91e4f8d456
commit
91a394e3e8
1 file changed
+8
-146
Vendored
+8
-146
@@ -46,14 +46,11 @@ Parse Plist example:
|
||||
print(pl["aKey"])
|
||||
"""
|
||||
__all__ = [
|
||||
"readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes",
|
||||
"Data", "InvalidFileException", "FMT_XML", "FMT_BINARY",
|
||||
"load", "dump", "loads", "dumps", "UID"
|
||||
"InvalidFileException", "FMT_XML", "FMT_BINARY", "load", "dump", "loads", "dumps", "UID"
|
||||
]
|
||||
|
||||
import binascii
|
||||
import codecs
|
||||
import contextlib
|
||||
import datetime
|
||||
import enum
|
||||
from io import BytesIO
|
||||
@@ -61,7 +58,6 @@ import itertools
|
||||
import os
|
||||
import re
|
||||
import struct
|
||||
from warnings import warn
|
||||
from xml.parsers.expat import ParserCreate
|
||||
|
||||
|
||||
@@ -69,112 +65,6 @@ PlistFormat = enum.Enum('PlistFormat', 'FMT_XML FMT_BINARY', module=__name__)
|
||||
globals().update(PlistFormat.__members__)
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Deprecated functionality
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
@contextlib.contextmanager
|
||||
def _maybe_open(pathOrFile, mode):
|
||||
if isinstance(pathOrFile, str):
|
||||
with open(pathOrFile, mode) as fp:
|
||||
yield fp
|
||||
|
||||
else:
|
||||
yield pathOrFile
|
||||
|
||||
|
||||
def readPlist(pathOrFile):
|
||||
"""
|
||||
Read a .plist from a path or file. pathOrFile should either
|
||||
be a file name, or a readable binary file object.
|
||||
|
||||
This function is deprecated, use load instead.
|
||||
"""
|
||||
warn("The readPlist function is deprecated, use load() instead",
|
||||
DeprecationWarning, 2)
|
||||
|
||||
with _maybe_open(pathOrFile, 'rb') as fp:
|
||||
return load(fp, fmt=None, use_builtin_types=False)
|
||||
|
||||
def writePlist(value, pathOrFile):
|
||||
"""
|
||||
Write 'value' to a .plist file. 'pathOrFile' may either be a
|
||||
file name or a (writable) file object.
|
||||
|
||||
This function is deprecated, use dump instead.
|
||||
"""
|
||||
warn("The writePlist function is deprecated, use dump() instead",
|
||||
DeprecationWarning, 2)
|
||||
with _maybe_open(pathOrFile, 'wb') as fp:
|
||||
dump(value, fp, fmt=FMT_XML, sort_keys=True, skipkeys=False)
|
||||
|
||||
|
||||
def readPlistFromBytes(data):
|
||||
"""
|
||||
Read a plist data from a bytes object. Return the root object.
|
||||
|
||||
This function is deprecated, use loads instead.
|
||||
"""
|
||||
warn("The readPlistFromBytes function is deprecated, use loads() instead",
|
||||
DeprecationWarning, 2)
|
||||
return load(BytesIO(data), fmt=None, use_builtin_types=False)
|
||||
|
||||
|
||||
def writePlistToBytes(value):
|
||||
"""
|
||||
Return 'value' as a plist-formatted bytes object.
|
||||
|
||||
This function is deprecated, use dumps instead.
|
||||
"""
|
||||
warn("The writePlistToBytes function is deprecated, use dumps() instead",
|
||||
DeprecationWarning, 2)
|
||||
f = BytesIO()
|
||||
dump(value, f, fmt=FMT_XML, sort_keys=True, skipkeys=False)
|
||||
return f.getvalue()
|
||||
|
||||
|
||||
class Data:
|
||||
"""
|
||||
Wrapper for binary data.
|
||||
|
||||
This class is deprecated, use a bytes object instead.
|
||||
"""
|
||||
|
||||
def __init__(self, data):
|
||||
if not isinstance(data, bytes):
|
||||
raise TypeError("data must be as bytes")
|
||||
self.data = data
|
||||
|
||||
@classmethod
|
||||
def fromBase64(cls, data):
|
||||
# base64.decodebytes just calls binascii.a2b_base64;
|
||||
# it seems overkill to use both base64 and binascii.
|
||||
return cls(_decode_base64(data))
|
||||
|
||||
def asBase64(self, maxlinelength=76):
|
||||
return _encode_base64(self.data, maxlinelength)
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, self.__class__):
|
||||
return self.data == other.data
|
||||
elif isinstance(other, bytes):
|
||||
return self.data == other
|
||||
else:
|
||||
return NotImplemented
|
||||
|
||||
def __repr__(self):
|
||||
return "%s(%s)" % (self.__class__.__name__, repr(self.data))
|
||||
|
||||
#
|
||||
#
|
||||
# End of deprecated functionality
|
||||
#
|
||||
#
|
||||
|
||||
|
||||
class UID:
|
||||
def __init__(self, data):
|
||||
if not isinstance(data, int):
|
||||
@@ -202,7 +92,6 @@ class UID:
|
||||
def __hash__(self):
|
||||
return hash(self.data)
|
||||
|
||||
|
||||
#
|
||||
# XML support
|
||||
#
|
||||
@@ -273,11 +162,10 @@ def _escape(text):
|
||||
return text
|
||||
|
||||
class _PlistParser:
|
||||
def __init__(self, use_builtin_types, dict_type):
|
||||
def __init__(self, dict_type):
|
||||
self.stack = []
|
||||
self.current_key = None
|
||||
self.root = None
|
||||
self._use_builtin_types = use_builtin_types
|
||||
self._dict_type = dict_type
|
||||
|
||||
def parse(self, fileobj):
|
||||
@@ -377,11 +265,7 @@ class _PlistParser:
|
||||
self.add_object(self.get_data())
|
||||
|
||||
def end_data(self):
|
||||
if self._use_builtin_types:
|
||||
self.add_object(_decode_base64(self.get_data()))
|
||||
|
||||
else:
|
||||
self.add_object(Data.fromBase64(self.get_data()))
|
||||
self.add_object(_decode_base64(self.get_data()))
|
||||
|
||||
def end_date(self):
|
||||
self.add_object(_date_from_string(self.get_data()))
|
||||
@@ -463,9 +347,6 @@ class _PlistWriter(_DumbXMLWriter):
|
||||
elif isinstance(value, dict):
|
||||
self.write_dict(value)
|
||||
|
||||
elif isinstance(value, Data):
|
||||
self.write_data(value)
|
||||
|
||||
elif isinstance(value, (bytes, bytearray)):
|
||||
self.write_bytes(value)
|
||||
|
||||
@@ -478,9 +359,6 @@ class _PlistWriter(_DumbXMLWriter):
|
||||
else:
|
||||
raise TypeError("unsupported type: %s" % type(value))
|
||||
|
||||
def write_data(self, data):
|
||||
self.write_bytes(data.data)
|
||||
|
||||
def write_bytes(self, data):
|
||||
self.begin_element("data")
|
||||
self._indent_level -= 1
|
||||
@@ -574,8 +452,7 @@ class _BinaryPlistParser:
|
||||
|
||||
see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c
|
||||
"""
|
||||
def __init__(self, use_builtin_types, dict_type):
|
||||
self._use_builtin_types = use_builtin_types
|
||||
def __init__(self, dict_type):
|
||||
self._dict_type = dict_type
|
||||
|
||||
def parse(self, fp):
|
||||
@@ -678,8 +555,6 @@ class _BinaryPlistParser:
|
||||
result = self._fp.read(s)
|
||||
if len(result) != s:
|
||||
raise InvalidFileException()
|
||||
if not self._use_builtin_types:
|
||||
result = Data(result)
|
||||
|
||||
elif tokenH == 0x50: # ascii string
|
||||
s = self._get_size(tokenL)
|
||||
@@ -803,10 +678,6 @@ class _BinaryPlistWriter (object):
|
||||
if (type(value), value) in self._objtable:
|
||||
return
|
||||
|
||||
elif isinstance(value, Data):
|
||||
if (type(value.data), value.data) in self._objtable:
|
||||
return
|
||||
|
||||
elif id(value) in self._objidtable:
|
||||
return
|
||||
|
||||
@@ -815,8 +686,6 @@ class _BinaryPlistWriter (object):
|
||||
self._objlist.append(value)
|
||||
if isinstance(value, _scalars):
|
||||
self._objtable[(type(value), value)] = refnum
|
||||
elif isinstance(value, Data):
|
||||
self._objtable[(type(value.data), value.data)] = refnum
|
||||
else:
|
||||
self._objidtable[id(value)] = refnum
|
||||
|
||||
@@ -846,8 +715,6 @@ class _BinaryPlistWriter (object):
|
||||
def _getrefnum(self, value):
|
||||
if isinstance(value, _scalars):
|
||||
return self._objtable[(type(value), value)]
|
||||
elif isinstance(value, Data):
|
||||
return self._objtable[(type(value.data), value.data)]
|
||||
else:
|
||||
return self._objidtable[id(value)]
|
||||
|
||||
@@ -905,10 +772,6 @@ class _BinaryPlistWriter (object):
|
||||
f = (value - datetime.datetime(2001, 1, 1)).total_seconds()
|
||||
self._fp.write(struct.pack('>Bd', 0x33, f))
|
||||
|
||||
elif isinstance(value, Data):
|
||||
self._write_size(0x40, len(value.data))
|
||||
self._fp.write(value.data)
|
||||
|
||||
elif isinstance(value, (bytes, bytearray)):
|
||||
self._write_size(0x40, len(value))
|
||||
self._fp.write(value)
|
||||
@@ -990,7 +853,7 @@ _FORMATS={
|
||||
}
|
||||
|
||||
|
||||
def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict):
|
||||
def load(fp, *, fmt=None, dict_type=dict):
|
||||
"""Read a .plist file. 'fp' should be a readable and binary file object.
|
||||
Return the unpacked root object (which usually is a dictionary).
|
||||
"""
|
||||
@@ -1008,17 +871,16 @@ def load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict):
|
||||
else:
|
||||
P = _FORMATS[fmt]['parser']
|
||||
|
||||
p = P(use_builtin_types=use_builtin_types, dict_type=dict_type)
|
||||
p = P(dict_type=dict_type)
|
||||
return p.parse(fp)
|
||||
|
||||
|
||||
def loads(value, *, fmt=None, use_builtin_types=True, dict_type=dict):
|
||||
def loads(value, *, fmt=None, dict_type=dict):
|
||||
"""Read a .plist file from a bytes object.
|
||||
Return the unpacked root object (which usually is a dictionary).
|
||||
"""
|
||||
fp = BytesIO(value)
|
||||
return load(
|
||||
fp, fmt=fmt, use_builtin_types=use_builtin_types, dict_type=dict_type)
|
||||
return load(fp, fmt=fmt, dict_type=dict_type)
|
||||
|
||||
|
||||
def dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False):
|
||||
|
||||
Reference in new issue
Block a user