diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index ffb0474374..d5a9fbf478 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -10,7 +10,6 @@ Manage application-wide preferences. import optparse import os -import plistlib from copy import deepcopy from calibre.constants import ( @@ -22,7 +21,6 @@ from calibre.utils.config_base import ( tweaks, from_json, to_json ) from calibre.utils.lock import ExclusiveFile -from polyglot.builtins import string_or_bytes # optparse uses gettext.gettext instead of _ from builtins, so we @@ -335,10 +333,12 @@ class XMLConfig(dict): pass def raw_to_object(self, raw): - return plistlib.readPlistFromString(raw) + from polyglot.plistlib import loads + return loads(raw) def to_raw(self): - return plistlib.writePlistToString(self) + from polyglot.plistlib import dumps + return dumps(self) def decouple(self, prefix): self.file_path = os.path.join(os.path.dirname(self.file_path), prefix + os.path.basename(self.file_path)) @@ -362,26 +362,29 @@ class XMLConfig(dict): self.update(d) def __getitem__(self, key): + from polyglot.plistlib import Data try: ans = dict.__getitem__(self, key) - if isinstance(ans, plistlib.Data): + if isinstance(ans, Data): ans = ans.data return ans except KeyError: return self.defaults.get(key, None) def get(self, key, default=None): + from polyglot.plistlib import Data try: ans = dict.__getitem__(self, key) - if isinstance(ans, plistlib.Data): + if isinstance(ans, Data): ans = ans.data return ans except KeyError: return self.defaults.get(key, default) def __setitem__(self, key, val): - if isinstance(val, string_or_bytes): - val = plistlib.Data(val) + from polyglot.plistlib import Data + if isinstance(val, bytes): + val = Data(val) dict.__setitem__(self, key, val) self.commit() diff --git a/src/calibre/utils/open_with/osx.py b/src/calibre/utils/open_with/osx.py index 68ee4a2ecf..3a0d7a235d 100644 --- a/src/calibre/utils/open_with/osx.py +++ b/src/calibre/utils/open_with/osx.py @@ -6,12 +6,13 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, plistlib, re, mimetypes, subprocess +import os, re, mimetypes, subprocess from collections import defaultdict from calibre.ptempfile import TemporaryDirectory from calibre.utils.icu import numeric_sort_key from polyglot.builtins import iteritems, unicode_type, string_or_bytes +from polyglot.plistlib import loads application_locations = ('/Applications', '~/Applications', '~/Desktop') @@ -266,7 +267,8 @@ def get_bundle_data(path): 'path': path, } try: - plist = plistlib.readPlist(info) + with open(info, 'rb') as f: + plist = loads(f.read()) except Exception: return None ans['name'] = plist.get('CFBundleDisplayName') or plist.get('CFBundleName') or ans['name'] diff --git a/src/polyglot/plistlib.py b/src/polyglot/plistlib.py new file mode 100644 index 0000000000..d428ab3d2f --- /dev/null +++ b/src/polyglot/plistlib.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python2 +# vim:fileencoding=utf-8 +# License: GPL v3 Copyright: 2019, Kovid Goyal + +from __future__ import absolute_import, division, print_function, unicode_literals + +from polyglot.builtins import is_py3 + +if is_py3: + from plistlib import loads, dumps, Data # noqa +else: + from plistlib import readPlistFromString as loads, writePlistToString as dumps, Data # noqa