py3: port plistlib

This commit is contained in:
Kovid Goyal 2019-04-01 16:05:31 +05:30
parent e0205790b9
commit ce007d8bab
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 27 additions and 10 deletions

View File

@ -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()

View File

@ -6,12 +6,13 @@ from __future__ import (unicode_literals, division, absolute_import,
__license__ = 'GPL v3'
__copyright__ = '2015, Kovid Goyal <kovid at kovidgoyal.net>'
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']

12
src/polyglot/plistlib.py Normal file
View File

@ -0,0 +1,12 @@
#!/usr/bin/env python2
# vim:fileencoding=utf-8
# License: GPL v3 Copyright: 2019, Kovid Goyal <kovid at kovidgoyal.net>
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