Move the meta path finders in constants since it depends on winutil in particular

This commit is contained in:
Kovid Goyal 2020-10-15 18:18:30 +05:30
parent 6690187e0a
commit d57c4d369b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 126 additions and 128 deletions

View File

@ -138,9 +138,8 @@ def _get_cache_dir():
return ans return ans
if iswindows: if iswindows:
w = plugins['winutil'][0]
try: try:
candidate = os.path.join(w.special_folder_path(w.CSIDL_LOCAL_APPDATA), '%s-cache'%__appname__) candidate = os.path.join(winutil.special_folder_path(winutil.CSIDL_LOCAL_APPDATA), '%s-cache'%__appname__)
except ValueError: except ValueError:
return confcache return confcache
elif ismacos: elif ismacos:
@ -174,6 +173,125 @@ plugins_loc = sys.extensions_location
# plugins {{{ # plugins {{{
from importlib.machinery import ModuleSpec, EXTENSION_SUFFIXES, ExtensionFileLoader
from importlib.util import find_spec
from importlib import import_module
class DeVendorLoader:
def __init__(self, aliased_name):
self.aliased_module = import_module(aliased_name)
try:
self.path = self.aliased_module.__loader__.path
except Exception:
self.path = aliased_name
def create_module(self, spec):
return self.aliased_module
def exec_module(self, module):
return module
def __repr__(self):
return repr(self.path)
class DeVendor:
def find_spec(self, fullname, path=None, target=None):
if fullname == 'calibre.web.feeds.feedparser':
return find_spec('feedparser')
if fullname.startswith('calibre.ebooks.markdown'):
return ModuleSpec(fullname, DeVendorLoader(fullname[len('calibre.ebooks.'):]))
class ExtensionsPackageLoader:
def __init__(self, calibre_extensions):
self.calibre_extensions = calibre_extensions
def is_package(self, fullname=None):
return True
def get_resource_reader(self, fullname=None):
return self
def get_source(self, fullname=None):
return ''
def contents(self):
return iter(self.calibre_extensions)
def create_module(self, spec):
pass
def exec_module(self, spec):
pass
class ExtensionsImporter:
def __init__(self):
extensions = (
'pictureflow',
'lzx',
'msdes',
'podofo',
'cPalmdoc',
'progress_indicator',
'icu',
'speedup',
'html_as_json',
'unicode_names',
'html_syntax_highlighter',
'hyphen',
'freetype',
'imageops',
'hunspell',
'_patiencediff_c',
'bzzdec',
'matcher',
'tokenizer',
'certgen',
)
if iswindows:
extra = ('winutil', 'wpd', 'winfonts')
elif ismacos:
extra = ('usbobserver', 'cocoa')
elif isfreebsd or ishaiku or islinux or ismacos:
extra = ('libusb', 'libmtp')
else:
extra = ()
self.calibre_extensions = frozenset(extensions + extra)
def find_spec(self, fullname, path=None, target=None):
if not fullname.startswith('calibre_extensions'):
return
parts = fullname.split('.')
if parts[0] != 'calibre_extensions':
return
if len(parts) > 2:
return
is_package = len(parts) == 1
extension_name = None if is_package else parts[1]
path = os.path.join(plugins_loc, '__init__.py')
if extension_name:
if extension_name not in self.calibre_extensions:
return
for suffix in EXTENSION_SUFFIXES:
path = os.path.join(plugins_loc, extension_name + suffix)
if os.path.exists(path):
break
else:
return
return ModuleSpec(fullname, ExtensionFileLoader(fullname, path), is_package=is_package, origin=path)
return ModuleSpec(fullname, ExtensionsPackageLoader(self.calibre_extensions), is_package=is_package, origin=path)
sys.meta_path.insert(0, DeVendor())
sys.meta_path.append(ExtensionsImporter())
class Plugins(collections.Mapping): class Plugins(collections.Mapping):
@ -218,10 +336,9 @@ cconfd = getenv('CALIBRE_CONFIG_DIRECTORY')
if cconfd is not None: if cconfd is not None:
config_dir = os.path.abspath(cconfd) config_dir = os.path.abspath(cconfd)
elif iswindows: elif iswindows:
if plugins['winutil'][0] is None: from calibre_extensions import winutil
raise Exception(plugins['winutil'][1])
try: try:
config_dir = plugins['winutil'][0].special_folder_path(plugins['winutil'][0].CSIDL_APPDATA) config_dir = winutil.special_folder_path(plugins['winutil'][0].CSIDL_APPDATA)
except ValueError: except ValueError:
config_dir = None config_dir = None
if not config_dir or not os.access(config_dir, os.W_OK|os.X_OK): if not config_dir or not os.access(config_dir, os.W_OK|os.X_OK):
@ -293,25 +410,21 @@ def get_windows_username():
Note that usernames on windows are case insensitive, the case of the value Note that usernames on windows are case insensitive, the case of the value
returned depends on what the user typed into the login box at login time. returned depends on what the user typed into the login box at login time.
''' '''
username = plugins['winutil'][0].username return winutil.username()
return username()
def get_windows_temp_path(): def get_windows_temp_path():
temp_path = plugins['winutil'][0].temp_path return winutil.temp_path()
return temp_path()
def get_windows_user_locale_name(): def get_windows_user_locale_name():
locale_name = plugins['winutil'][0].locale_name return winutil.locale_name()
return locale_name()
def get_windows_number_formats(): def get_windows_number_formats():
ans = getattr(get_windows_number_formats, 'ans', None) ans = getattr(get_windows_number_formats, 'ans', None)
if ans is None: if ans is None:
localeconv = plugins['winutil'][0].localeconv d = winutil.localeconv()
d = localeconv()
thousands_sep, decimal_point = d['thousands_sep'], d['decimal_point'] thousands_sep, decimal_point = d['thousands_sep'], d['decimal_point']
ans = get_windows_number_formats.ans = thousands_sep, decimal_point ans = get_windows_number_formats.ans = thousands_sep, decimal_point
return ans return ans

View File

@ -49,121 +49,6 @@ def get_debug_executable():
if not _run_once: if not _run_once:
_run_once = True _run_once = True
from importlib.machinery import ModuleSpec, EXTENSION_SUFFIXES, ExtensionFileLoader
from importlib.util import find_spec
from importlib import import_module
class DeVendorLoader:
def __init__(self, aliased_name):
self.aliased_module = import_module(aliased_name)
try:
self.path = self.aliased_module.__loader__.path
except Exception:
self.path = aliased_name
def create_module(self, spec):
return self.aliased_module
def exec_module(self, module):
return module
def __repr__(self):
return repr(self.path)
class DeVendor:
def find_spec(self, fullname, path=None, target=None):
if fullname == 'calibre.web.feeds.feedparser':
return find_spec('feedparser')
if fullname.startswith('calibre.ebooks.markdown'):
return ModuleSpec(fullname, DeVendorLoader(fullname[len('calibre.ebooks.'):]))
sys.meta_path.insert(0, DeVendor())
class ExtensionsPackageLoader:
def __init__(self, calibre_extensions):
self.calibre_extensions = calibre_extensions
def is_package(self, fullname=None):
return True
def get_resource_reader(self, fullname=None):
return self
def get_source(self, fullname=None):
return ''
def contents(self):
return iter(self.calibre_extensions)
def create_module(self, spec):
pass
def exec_module(self, spec):
pass
class ExtensionsImporter:
def __init__(self):
extensions = (
'pictureflow',
'lzx',
'msdes',
'podofo',
'cPalmdoc',
'progress_indicator',
'icu',
'speedup',
'html_as_json',
'unicode_names',
'html_syntax_highlighter',
'hyphen',
'freetype',
'imageops',
'hunspell',
'_patiencediff_c',
'bzzdec',
'matcher',
'tokenizer',
'certgen',
)
if iswindows:
extra = ('winutil', 'wpd', 'winfonts')
elif ismacos:
extra = ('usbobserver', 'cocoa')
elif isfreebsd or ishaiku or islinux or ismacos:
extra = ('libusb', 'libmtp')
else:
extra = ()
self.calibre_extensions = frozenset(extensions + extra)
def find_spec(self, fullname, path=None, target=None):
if not fullname.startswith('calibre_extensions'):
return
parts = fullname.split('.')
if parts[0] != 'calibre_extensions':
return
if len(parts) > 2:
return
is_package = len(parts) == 1
extension_name = None if is_package else parts[1]
path = os.path.join(plugins_loc, '__init__.py')
if extension_name:
if extension_name not in self.calibre_extensions:
return
for suffix in EXTENSION_SUFFIXES:
path = os.path.join(plugins_loc, extension_name + suffix)
if os.path.exists(path):
break
else:
return
return ModuleSpec(fullname, ExtensionFileLoader(fullname, path), is_package=is_package, origin=path)
return ModuleSpec(fullname, ExtensionsPackageLoader(self.calibre_extensions), is_package=is_package, origin=path)
sys.meta_path.append(ExtensionsImporter())
# Ensure that all temp files/dirs are created under a calibre tmp dir # Ensure that all temp files/dirs are created under a calibre tmp dir
from calibre.ptempfile import base_dir from calibre.ptempfile import base_dir
try: try: