diff --git a/src/calibre/ebooks/compression/palmdoc.py b/src/calibre/ebooks/compression/palmdoc.py index 01f70bd67b..b142cefe73 100644 --- a/src/calibre/ebooks/compression/palmdoc.py +++ b/src/calibre/ebooks/compression/palmdoc.py @@ -8,12 +8,8 @@ __copyright__ = '2008, Kovid Goyal ' import io from struct import pack -from calibre.constants import plugins from polyglot.builtins import range -cPalmdoc = plugins['cPalmdoc'][0] -if not cPalmdoc: - raise RuntimeError(('Failed to load required cPalmdoc module: ' - '%s')%plugins['cPalmdoc'][1]) +from calibre_extensions import cPalmdoc def decompress_doc(data): diff --git a/src/calibre/ebooks/djvu/djvu.py b/src/calibre/ebooks/djvu/djvu.py index fc73178aba..7df99ac2e1 100644 --- a/src/calibre/ebooks/djvu/djvu.py +++ b/src/calibre/ebooks/djvu/djvu.py @@ -14,16 +14,14 @@ import sys import struct from calibre.ebooks.djvu.djvubzzdec import BZZDecoder -from calibre.constants import plugins class DjvuChunk(object): def __init__(self, buf, start, end, align=True, bigendian=True, inclheader=False, verbose=0): - self.speedup, err = plugins['bzzdec'] - if self.speedup is None: - raise RuntimeError('Failed to load bzzdec plugin: %s' % err) + from calibre_extensions import speedup + self.speedup = speedup self.subtype = None self._subchunks = [] self.buf = buf diff --git a/src/calibre/ebooks/djvu/djvubzzdec.py b/src/calibre/ebooks/djvu/djvubzzdec.py index 135e6d1cf4..592f78fe2e 100644 --- a/src/calibre/ebooks/djvu/djvubzzdec.py +++ b/src/calibre/ebooks/djvu/djvubzzdec.py @@ -733,10 +733,9 @@ class BZZDecoder(): # for testing def main(): import sys - from calibre.constants import plugins + from calibre_extensions import bzzdec as d with open(sys.argv[1], "rb") as f: raw = f.read() - d = plugins['bzzdec'][0] print(d.decompress(raw)) diff --git a/src/calibre/ebooks/lit/lzx.py b/src/calibre/ebooks/lit/lzx.py index c4e06b0b04..44b10c0b75 100644 --- a/src/calibre/ebooks/lit/lzx.py +++ b/src/calibre/ebooks/lit/lzx.py @@ -7,11 +7,7 @@ LZX compression/decompression wrapper. __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -from calibre.constants import plugins - -_lzx, _error = plugins['lzx'] -if _lzx is None: - raise RuntimeError('Failed to load the lzx plugin: %s' % _error) +from calibre_extensions import lzx as _lzx __all__ = ['Compressor', 'Decompressor', 'LZXError'] diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 54489e0f10..f478487eb4 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -17,12 +17,9 @@ import calibre.ebooks.lit.mssha1 as mssha1 from calibre.ebooks.oeb.base import urlnormalize, xpath from calibre.ebooks.oeb.reader import OEBReader from calibre.ebooks import DRMError -from calibre.constants import plugins from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes, range, itervalues from polyglot.urllib import unquote as urlunquote, urldefrag - -lzx, lxzerror = plugins['lzx'] -msdes, msdeserror = plugins['msdes'] +from calibre_extensions import lzx, msdes __all__ = ["LitReader"] diff --git a/src/calibre/ebooks/lit/writer.py b/src/calibre/ebooks/lit/writer.py index 453e3dd4c2..a023a264f9 100644 --- a/src/calibre/ebooks/lit/writer.py +++ b/src/calibre/ebooks/lit/writer.py @@ -27,8 +27,7 @@ from calibre.ebooks.oeb.base import prefixname, \ from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.lit.lzx import Compressor import calibre -from calibre.constants import plugins -msdes, msdeserror = plugins['msdes'] +from calibre_extensions import msdes import calibre.ebooks.lit.mssha1 as mssha1 from polyglot.builtins import codepoint_to_chr, unicode_type, string_or_bytes, range, zip, native_string_type from polyglot.urllib import urldefrag, unquote diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index 8fe22e4476..f7fcf9030f 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -10,12 +10,10 @@ import codecs, zlib, numbers from io import BytesIO from datetime import datetime -from calibre.constants import plugins from calibre.utils.logging import default_log from polyglot.builtins import iteritems, unicode_type, codepoint_to_chr from polyglot.binary import as_hex_bytes - -pdf_float = plugins['speedup'][0].pdf_float +from calibre_extensions.speedup import pdf_float EOL = b'\n' diff --git a/src/calibre/spell/dictionary.py b/src/calibre/spell/dictionary.py index 2f9ed3e1e6..3e0d236c4d 100644 --- a/src/calibre/spell/dictionary.py +++ b/src/calibre/spell/dictionary.py @@ -8,14 +8,13 @@ import os import re import shutil import sys +from calibre_extensions import hunspell from collections import defaultdict, namedtuple from functools import partial from itertools import chain from calibre import prints -from calibre.constants import ( - config_dir, filesystem_encoding, iswindows, plugins -) +from calibre.constants import config_dir, filesystem_encoding, iswindows from calibre.spell import parse_lang_code from calibre.utils.config import JSONConfig from calibre.utils.icu import capitalize @@ -24,9 +23,6 @@ from polyglot.builtins import filter, iteritems, itervalues, map, unicode_type Dictionary = namedtuple('Dictionary', 'primary_locale locales dicpath affpath builtin name id') LoadedDictionary = namedtuple('Dictionary', 'primary_locale locales obj builtin name id') -hunspell = plugins['hunspell'][0] -if hunspell is None: - raise RuntimeError('Failed to load hunspell: %s' % plugins['hunspell'][1]) dprefs = JSONConfig('dictionaries/prefs.json') dprefs.defaults['preferred_dictionaries'] = {} dprefs.defaults['preferred_locales'] = {} diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 1d8334ce9b..190157e899 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -12,7 +12,7 @@ Test a binary calibre build to ensure that all needed binary images/libraries ha import os, ctypes, sys, unittest, time, shutil -from calibre.constants import plugins, iswindows, islinux, ismacos, plugins_loc +from calibre.constants import iswindows, islinux, ismacos, plugins_loc from polyglot.builtins import iteritems, map, unicode_type, getenv is_ci = os.environ.get('CI', '').lower() == 'true' @@ -22,7 +22,8 @@ class BuildTest(unittest.TestCase): @unittest.skipUnless(iswindows and not is_ci, 'DLL loading needs testing only on windows (non-continuous integration)') def test_dlls(self): - base = plugins['winutil'][0].get_dll_directory() + from calibre_extensions import winutil + base = winutil.get_dll_directory() for x in os.listdir(base): if x.lower().endswith('.dll'): try: @@ -105,14 +106,15 @@ class BuildTest(unittest.TestCase): if islinux and not os.path.exists('/dev/bus/usb'): # libusb fails to initialize in containers without USB subsystems exclusions.update(set('libusb libmtp'.split())) - for name in plugins: + from importlib import import_module + from importlib.resources import contents + for name in contents('calibre_extensions'): if name in exclusions: if name in ('libusb', 'libmtp'): # Just check that the DLL can be loaded ctypes.CDLL(os.path.join(plugins_loc, name + ('.dylib' if ismacos else '.so'))) continue - mod, err = plugins[name] - self.assertTrue(mod, f'Failed to load plugin: {name} with error: {err}') + import_module('calibre_extensions.' + name) def test_lxml(self): from calibre.utils.cleantext import test_clean_xml_chars @@ -147,9 +149,8 @@ class BuildTest(unittest.TestCase): @unittest.skipUnless(iswindows, 'winutil is windows only') def test_winutil(self): import tempfile - from calibre.constants import plugins from calibre import strftime - winutil = plugins['winutil'][0] + from calibre_extensions import winutil def au(x, name): self.assertTrue( @@ -363,7 +364,7 @@ class BuildTest(unittest.TestCase): @unittest.skipUnless(iswindows, 'WPD is windows only') def test_wpd(self): - wpd = plugins['wpd'][0] + from calibre_extensions import wpd try: wpd.init('calibre', 1, 1, 1) except wpd.NoWPD: