diff --git a/bypy/init_env.py b/bypy/init_env.py index a16e06ab2f..3da499f1d1 100644 --- a/bypy/init_env.py +++ b/bypy/init_env.py @@ -8,10 +8,8 @@ import re import subprocess import sys -from bypy.constants import ( - LIBDIR, PREFIX, PYTHON, SRC as CALIBRE_DIR, build_dir, islinux, ismacos, - worker_env -) +from bypy.constants import LIBDIR, PREFIX, PYTHON, build_dir, islinux, ismacos, worker_env +from bypy.constants import SRC as CALIBRE_DIR from bypy.utils import run_shell dlls = [ diff --git a/bypy/linux/__main__.py b/bypy/linux/__main__.py index ebdfe96644..acff193a92 100644 --- a/bypy/linux/__main__.py +++ b/bypy/linux/__main__.py @@ -12,16 +12,10 @@ import tarfile import time from functools import partial -from bypy.constants import ( - LIBDIR, OUTPUT_DIR, PREFIX, SRC as CALIBRE_DIR, python_major_minor_version, -) -from bypy.freeze import ( - extract_extension_modules, fix_pycryptodome, freeze_python, is_package_dir, - path_to_freeze_dir, -) -from bypy.utils import ( - create_job, get_dll_path, mkdtemp, parallel_build, py_compile, run, walk, -) +from bypy.constants import LIBDIR, OUTPUT_DIR, PREFIX, python_major_minor_version +from bypy.constants import SRC as CALIBRE_DIR +from bypy.freeze import extract_extension_modules, fix_pycryptodome, freeze_python, is_package_dir, path_to_freeze_dir +from bypy.utils import create_job, get_dll_path, mkdtemp, parallel_build, py_compile, run, walk j = os.path.join self_dir = os.path.dirname(os.path.abspath(__file__)) diff --git a/bypy/macos/__main__.py b/bypy/macos/__main__.py index f0f9d43a93..bc6f423e11 100644 --- a/bypy/macos/__main__.py +++ b/bypy/macos/__main__.py @@ -19,16 +19,10 @@ import zipfile from functools import partial, reduce from itertools import repeat -from bypy.constants import ( - OUTPUT_DIR, PREFIX, PYTHON, SRC as CALIBRE_DIR, python_major_minor_version, -) -from bypy.freeze import ( - extract_extension_modules, fix_pycryptodome, freeze_python, is_package_dir, - path_to_freeze_dir, -) -from bypy.utils import ( - current_dir, get_arches_in_binary, mkdtemp, py_compile, timeit, walk, -) +from bypy.constants import OUTPUT_DIR, PREFIX, PYTHON, python_major_minor_version +from bypy.constants import SRC as CALIBRE_DIR +from bypy.freeze import extract_extension_modules, fix_pycryptodome, freeze_python, is_package_dir, path_to_freeze_dir +from bypy.utils import current_dir, get_arches_in_binary, mkdtemp, py_compile, timeit, walk abspath, join, basename, dirname = os.path.abspath, os.path.join, os.path.basename, os.path.dirname iv = globals()['init_env'] diff --git a/bypy/macos/sign.py b/bypy/macos/sign.py index 3279255aa7..c2ba8efbfd 100644 --- a/bypy/macos/sign.py +++ b/bypy/macos/sign.py @@ -6,10 +6,7 @@ import os import plistlib from glob import glob -from bypy.macos_sign import ( - codesign, create_entitlements_file, make_certificate_useable, notarize_app, - verify_signature -) +from bypy.macos_sign import codesign, create_entitlements_file, make_certificate_useable, notarize_app, verify_signature from bypy.utils import current_dir entitlements = { diff --git a/bypy/macos/site.py b/bypy/macos/site.py index 90545770e9..26c3d18c5e 100644 --- a/bypy/macos/site.py +++ b/bypy/macos/site.py @@ -1,6 +1,7 @@ import builtins import os import sys + import _sitebuiltins USER_SITE = None diff --git a/bypy/windows/__main__.py b/bypy/windows/__main__.py index ba6aaad858..d9eb08c0fd 100644 --- a/bypy/windows/__main__.py +++ b/bypy/windows/__main__.py @@ -15,14 +15,9 @@ import subprocess import sys import zipfile -from bypy.constants import ( - CL, LINK, MT, PREFIX, RC, SIGNTOOL, SRC as CALIBRE_DIR, SW, build_dir, - python_major_minor_version, worker_env -) -from bypy.freeze import ( - cleanup_site_packages, extract_extension_modules, freeze_python, - path_to_freeze_dir -) +from bypy.constants import CL, LINK, MT, PREFIX, RC, SIGNTOOL, SW, build_dir, python_major_minor_version, worker_env +from bypy.constants import SRC as CALIBRE_DIR +from bypy.freeze import cleanup_site_packages, extract_extension_modules, freeze_python, path_to_freeze_dir from bypy.utils import mkdtemp, py_compile, run, walk iv = globals()['init_env'] diff --git a/bypy/windows/site.py b/bypy/windows/site.py index 1563c330f2..2871855025 100644 --- a/bypy/windows/site.py +++ b/bypy/windows/site.py @@ -6,8 +6,8 @@ import builtins import os import sys from importlib import import_module -from importlib.util import spec_from_file_location from importlib.machinery import EXTENSION_SUFFIXES +from importlib.util import spec_from_file_location import _sitebuiltins @@ -96,6 +96,7 @@ if __name__ == '__main__': except Exception: if sys.gui_app and sys.excepthook == sys.__excepthook__: import traceback + import calibre_os_module calibre_os_module.gui_error_message( f"Unhandled exception running {sys.calibre_basename}", diff --git a/bypy/windows/wix.py b/bypy/windows/wix.py index b404bed6d9..5c93e21c4b 100644 --- a/bypy/windows/wix.py +++ b/bypy/windows/wix.py @@ -2,9 +2,9 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal -from itertools import count import os import shutil +from itertools import count from bypy.constants import is64bit from bypy.utils import run diff --git a/icons/icns/make_iconsets.py b/icons/icns/make_iconsets.py index b81705865e..c9bf6f88dc 100644 --- a/icons/icns/make_iconsets.py +++ b/icons/icns/make_iconsets.py @@ -5,7 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, shutil, subprocess, sys +import os +import shutil +import subprocess +import sys d, j, a = (getattr(os.path, x) for x in ('dirname', 'join', 'abspath')) base = d(a(__file__)) diff --git a/icons/make_ico_files.py b/icons/make_ico_files.py index 23378e7d6f..179d7606db 100644 --- a/icons/make_ico_files.py +++ b/icons/make_ico_files.py @@ -5,7 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, shutil, subprocess, sys +import os +import shutil +import subprocess +import sys d, j, a = (getattr(os.path, x) for x in ('dirname', 'join', 'abspath')) base = d(a(__file__)) diff --git a/imgsrc/generate.py b/imgsrc/generate.py index c0d41a639d..9adaeab79f 100755 --- a/imgsrc/generate.py +++ b/imgsrc/generate.py @@ -2,7 +2,12 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, glob, subprocess, argparse, json, hashlib +import argparse +import glob +import hashlib +import json +import os +import subprocess duplicates = { 'character-set': ['languages'], diff --git a/imgsrc/render-logo.py b/imgsrc/render-logo.py index 806aa6cf5e..82d85072ae 100755 --- a/imgsrc/render-logo.py +++ b/imgsrc/render-logo.py @@ -3,7 +3,10 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, subprocess, sys, shutil +import os +import shutil +import subprocess +import sys j = os.path.join base = os.path.dirname(os.path.abspath(__file__)) diff --git a/imgsrc/srv/generate.py b/imgsrc/srv/generate.py index bc043fb432..c56f3140f6 100644 --- a/imgsrc/srv/generate.py +++ b/imgsrc/srv/generate.py @@ -3,7 +3,9 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, re, sys +import os +import re +import sys from lxml import etree diff --git a/manual/build.py b/manual/build.py index 4027691e11..0fdfb90d3a 100755 --- a/manual/build.py +++ b/manual/build.py @@ -5,7 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import sys, os, subprocess, shutil +import os +import shutil +import subprocess +import sys import tempfile from functools import partial @@ -14,8 +17,10 @@ BASE = d(a(__file__)) SPHINX_BUILD = ['sphinx-build'] sys.path.insert(0, d(BASE)) -from setup import __appname__, __version__ from calibre.ebooks.oeb.polish.container import epub_to_azw3 + +from setup import __appname__, __version__ + sys.path.remove(d(BASE)) diff --git a/manual/conf.py b/manual/conf.py index 26cb887d8b..966de55a2e 100644 --- a/manual/conf.py +++ b/manual/conf.py @@ -11,17 +11,21 @@ # All configuration values have a default value; values that are commented out # serve to show the default value. -import sys, os, errno +import errno +import os +import sys from datetime import date # If your extensions are in another directory, add it here. base = os.path.dirname(os.path.abspath(__file__)) sys.path.append(base) sys.path.insert(0, os.path.dirname(base)) -from setup import __appname__, __version__ -from calibre.utils.localization import localize_website_link import calibre.utils.img as cimg import custom +from calibre.utils.localization import localize_website_link + +from setup import __appname__, __version__ + del sys.path[0] custom, cimg # General configuration @@ -158,6 +162,7 @@ html_last_updated_fmt = '%b %d, %Y' html_short_title = _('Start') from calibre.utils.localization import get_language + html_context = {} html_context['other_languages'] = [ (lc, get_language(lc)) for lc in os.environ.get('ALL_USER_MANUAL_LANGUAGES', '').split() if lc != language] diff --git a/manual/custom.py b/manual/custom.py index 3b280593d5..aaec02e502 100644 --- a/manual/custom.py +++ b/manual/custom.py @@ -6,11 +6,10 @@ import os import re from functools import partial -from sphinx.util.console import bold -from sphinx.util.logging import getLogger - from calibre.linux import cli_index_strings, entry_points from epub import EPUBHelpBuilder +from sphinx.util.console import bold +from sphinx.util.logging import getLogger def info(*a): @@ -86,7 +85,7 @@ def titlecase(language, x): def generate_calibredb_help(preamble, language): - from calibre.db.cli.main import COMMANDS, option_parser_for, get_parser + from calibre.db.cli.main import COMMANDS, get_parser, option_parser_for preamble = preamble[:preamble.find('\n\n\n', preamble.find('code-block'))] preamble += '\n\n' preamble += _('''\ @@ -156,8 +155,8 @@ details and examples. def generate_ebook_convert_help(preamble, app): - from calibre.ebooks.conversion.cli import create_option_parser, manual_index_strings from calibre.customize.ui import input_format_plugins, output_format_plugins + from calibre.ebooks.conversion.cli import create_option_parser, manual_index_strings from calibre.utils.logging import default_log preamble = re.sub(r'http.*\.html', ':ref:`conversion`', preamble) diff --git a/manual/epub.py b/manual/epub.py index 8a6ca38e2e..c3cf010f3d 100644 --- a/manual/epub.py +++ b/manual/epub.py @@ -8,13 +8,13 @@ __docformat__ = 'restructuredtext en' import os -from sphinx.builders.epub3 import Epub3Builder as EpubBuilder - from calibre.ebooks.oeb.base import OPF -from calibre.ebooks.oeb.polish.container import get_container, OEB_DOCS -from calibre.ebooks.oeb.polish.check.links import check_links, UnreferencedResource +from calibre.ebooks.oeb.polish.check.links import UnreferencedResource, check_links +from calibre.ebooks.oeb.polish.container import OEB_DOCS, get_container from calibre.ebooks.oeb.polish.pretty import pretty_html_tree, pretty_opf from calibre.utils.imghdr import identify +from sphinx.builders.epub3 import Epub3Builder as EpubBuilder + from polyglot.builtins import iteritems diff --git a/manual/plugin_examples/editor_demo/main.py b/manual/plugin_examples/editor_demo/main.py index 33cbf501ba..1262c8720e 100644 --- a/manual/plugin_examples/editor_demo/main.py +++ b/manual/plugin_examples/editor_demo/main.py @@ -6,15 +6,15 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import re -from qt.core import QAction, QInputDialog -from css_parser.css import CSSRule + +from calibre import force_unicode +from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES, serialize +from calibre.gui2 import error_dialog # The base class that all tools must inherit from from calibre.gui2.tweak_book.plugin import Tool - -from calibre import force_unicode -from calibre.gui2 import error_dialog -from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES, serialize +from css_parser.css import CSSRule +from qt.core import QAction, QInputDialog class DemoTool(Tool): diff --git a/manual/plugin_examples/helloworld/__init__.py b/manual/plugin_examples/helloworld/__init__.py index f8fde737c3..60b3cb570b 100644 --- a/manual/plugin_examples/helloworld/__init__.py +++ b/manual/plugin_examples/helloworld/__init__.py @@ -7,8 +7,10 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os + from calibre.customize import FileTypePlugin + class HelloWorld(FileTypePlugin): name = 'Hello World Plugin' # Name of the plugin diff --git a/manual/plugin_examples/interface_demo/__init__.py b/manual/plugin_examples/interface_demo/__init__.py index 1aa5d4fbf2..f6733549f2 100644 --- a/manual/plugin_examples/interface_demo/__init__.py +++ b/manual/plugin_examples/interface_demo/__init__.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' # The class that all Interface Action plugin wrappers must inherit from from calibre.customize import InterfaceActionBase + class InterfacePluginDemo(InterfaceActionBase): ''' This class is a simple wrapper that provides information about the actual diff --git a/manual/plugin_examples/interface_demo/config.py b/manual/plugin_examples/interface_demo/config.py index 00319b0e22..0dd8c8a473 100644 --- a/manual/plugin_examples/interface_demo/config.py +++ b/manual/plugin_examples/interface_demo/config.py @@ -6,9 +6,8 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import QWidget, QHBoxLayout, QLabel, QLineEdit - from calibre.utils.config import JSONConfig +from qt.core import QHBoxLayout, QLabel, QLineEdit, QWidget # This is where all preferences for this plugin will be stored # Remember that this name (i.e. plugins/interface_demo) is also diff --git a/manual/plugin_examples/interface_demo/main.py b/manual/plugin_examples/interface_demo/main.py index d9417b3a87..a8dd3e658e 100644 --- a/manual/plugin_examples/interface_demo/main.py +++ b/manual/plugin_examples/interface_demo/main.py @@ -12,9 +12,8 @@ if False: # You do not need this code in your plugins get_icons = get_resources = None -from qt.core import QDialog, QVBoxLayout, QPushButton, QMessageBox, QLabel - from calibre_plugins.interface_demo.config import prefs +from qt.core import QDialog, QLabel, QMessageBox, QPushButton, QVBoxLayout class DemoDialog(QDialog): diff --git a/manual/sidebar_toc.py b/manual/sidebar_toc.py index a2c4151239..b399c130b3 100644 --- a/manual/sidebar_toc.py +++ b/manual/sidebar_toc.py @@ -1,8 +1,9 @@ #!/usr/bin/env python # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai -from docutils import nodes from itertools import count + +from docutils import nodes from sphinx.environment.adapters.toctree import TocTree id_counter = count() diff --git a/setup.py b/setup.py index 59533e6d68..5a250024b6 100755 --- a/setup.py +++ b/setup.py @@ -6,7 +6,10 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, re +import os +import re +import sys + src_base = os.path.dirname(os.path.abspath(__file__)) @@ -32,7 +35,7 @@ check_version_info() sys.path.insert(0, src_base) import setup.commands as commands -from setup import prints, get_warnings +from setup import get_warnings, prints def option_parser(): diff --git a/setup/__init__.py b/setup/__init__.py index 8288fb8863..3553fb2dd1 100644 --- a/setup/__init__.py +++ b/setup/__init__.py @@ -6,6 +6,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import errno +import hashlib import os import re import shutil @@ -13,7 +14,6 @@ import subprocess import sys import tempfile import time -import hashlib from contextlib import contextmanager from functools import lru_cache @@ -167,7 +167,7 @@ def get_warnings(): def edit_file(path): return subprocess.Popen([ - 'vim', '-c', 'ALELint', '-c', 'ALEFirst', '-S', os.path.join(SRC, '../session.vim'), '-f', path + os.environ.get('EDITOR', 'vim'), '-S', os.path.join(SRC, '../session.vim'), '-f', path ]).wait() == 0 diff --git a/setup/browser_data.py b/setup/browser_data.py index 33f9a0294b..c2583078b3 100644 --- a/setup/browser_data.py +++ b/setup/browser_data.py @@ -4,8 +4,8 @@ import bz2 import os -import sys import ssl +import sys from datetime import datetime, timezone from urllib.request import urlopen diff --git a/setup/build.py b/setup/build.py index 9e46f565e9..d0a6891902 100644 --- a/setup/build.py +++ b/setup/build.py @@ -15,7 +15,7 @@ import sys import sysconfig import textwrap from functools import partial -from typing import NamedTuple, List +from typing import List, NamedTuple from setup import SRC, Command, isbsd, isfreebsd, ishaiku, islinux, ismacos, iswindows diff --git a/setup/check.py b/setup/check.py index 352a8d5bfd..afe85be24e 100644 --- a/setup/check.py +++ b/setup/check.py @@ -5,8 +5,13 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, json, subprocess, errno, hashlib -from setup import Command, build_cache_dir, edit_file, dump_json +import errno +import hashlib +import json +import os +import subprocess + +from setup import Command, build_cache_dir, dump_json, edit_file class Message: diff --git a/setup/commands.py b/setup/commands.py index 64b06a5d42..266b4a1dcc 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -23,7 +23,8 @@ __all__ = [ 'export_packages', 'hyphenation', 'liberation_fonts', 'stylelint', 'xwin', ] -from setup.installers import Linux, Win, OSX, Linux64, LinuxArm64, Win64, ExtDev, BuildDep, ExportPackages +from setup.installers import OSX, BuildDep, ExportPackages, ExtDev, Linux, Linux64, LinuxArm64, Win, Win64 + linux, linux64, linuxarm64 = Linux(), Linux64(), LinuxArm64() win, win64 = Win(), Win64() osx = OSX() @@ -31,7 +32,8 @@ extdev = ExtDev() build_dep = BuildDep() export_packages = ExportPackages() -from setup.translations import POT, GetTranslations, Translations, ISO639, ISO3166 +from setup.translations import ISO639, ISO3166, POT, GetTranslations, Translations + pot = POT() translations = Translations() get_translations = GetTranslations() @@ -39,49 +41,60 @@ iso639 = ISO639() iso3166 = ISO3166() from setup.csslint import CSSLint + stylelint = CSSLint() from setup.build import Build + build = Build() from setup.mathjax import MathJax + mathjax = MathJax() from setup.hyphenation import Hyphenation + hyphenation = Hyphenation() from setup.liberation import LiberationFonts + liberation_fonts = LiberationFonts() from setup.git_version import GitVersion + git_version = GitVersion() -from setup.install import Develop, Install, Sdist, Bootstrap +from setup.install import Bootstrap, Develop, Install, Sdist + develop = Develop() install = Install() sdist = Sdist() bootstrap = Bootstrap() from setup.gui import GUI + gui = GUI() from setup.check import Check, UpgradeSourceCode + check = Check() upgrade_source_code = UpgradeSourceCode() from setup.test import Test, TestRS + test = Test() test_rs = TestRS() -from setup.resources import Resources, Kakasi, CACerts, RapydScript, RecentUAs +from setup.resources import CACerts, Kakasi, RapydScript, RecentUAs, Resources + resources = Resources() kakasi = Kakasi() cacerts = CACerts() recent_uas = RecentUAs() rapydscript = RapydScript() -from setup.publish import Manual, TagRelease, Stage1, Stage2, \ - Stage3, Stage4, Stage5, Publish, PublishBetas, PublishPreview, ManPages +from setup.publish import ManPages, Manual, Publish, PublishBetas, PublishPreview, Stage1, Stage2, Stage3, Stage4, Stage5, TagRelease + manual = Manual() tag_release = TagRelease() stage1 = Stage1() @@ -94,8 +107,8 @@ publish_betas = PublishBetas() publish_preview = PublishPreview() man_pages = ManPages() -from setup.upload import (UploadUserManual, UploadDemo, UploadInstallers, - UploadToServer, ReUpload) +from setup.upload import ReUpload, UploadDemo, UploadInstallers, UploadToServer, UploadUserManual + upload_user_manual = UploadUserManual() upload_demo = UploadDemo() upload_to_server = UploadToServer() @@ -104,6 +117,7 @@ reupload = ReUpload() from setup.xwin import XWin + xwin = XWin() commands = {} diff --git a/setup/file-hosting-bw.py b/setup/file-hosting-bw.py index f2ad65c342..c179e6fb4a 100644 --- a/setup/file-hosting-bw.py +++ b/setup/file-hosting-bw.py @@ -4,7 +4,9 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, subprocess, socket +import os +import socket +import subprocess BASE = '/srv/download/bw' diff --git a/setup/git_post_checkout_hook.py b/setup/git_post_checkout_hook.py index 71546b437b..3d244a0af2 100755 --- a/setup/git_post_checkout_hook.py +++ b/setup/git_post_checkout_hook.py @@ -3,7 +3,9 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import os, subprocess, sys +import os +import subprocess +import sys prev_rev, current_rev, flags = sys.argv[1:] diff --git a/setup/git_post_rewrite_hook.py b/setup/git_post_rewrite_hook.py index 79474bde86..bc5c450487 100755 --- a/setup/git_post_rewrite_hook.py +++ b/setup/git_post_rewrite_hook.py @@ -3,7 +3,9 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import subprocess, os, sys +import os +import subprocess +import sys base = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) os.chdir(base) diff --git a/setup/git_pre_commit_hook.py b/setup/git_pre_commit_hook.py index 21d3d0996d..90fb181d04 100755 --- a/setup/git_pre_commit_hook.py +++ b/setup/git_pre_commit_hook.py @@ -11,6 +11,7 @@ import sys import urllib.error import urllib.parse import urllib.request + from lxml import html ''' diff --git a/setup/hosting.py b/setup/hosting.py index 2c367f9780..b0dc825aa2 100644 --- a/setup/hosting.py +++ b/setup/hosting.py @@ -4,11 +4,16 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, time, sys, shutil, json, mimetypes -from pprint import pprint +import json +import mimetypes +import os +import shutil +import sys +import time from argparse import ArgumentParser, FileType -from subprocess import check_call from collections import OrderedDict +from pprint import pprint +from subprocess import check_call class ReadFileWithProgressReporting: # {{{ diff --git a/setup/install.py b/setup/install.py index 3691565309..a9c3a40430 100644 --- a/setup/install.py +++ b/setup/install.py @@ -12,10 +12,7 @@ import tempfile import textwrap import time -from setup import ( - Command, __appname__, __version__, basenames, functions, - isbsd, ishaiku, islinux, modules -) +from setup import Command, __appname__, __version__, basenames, functions, isbsd, ishaiku, islinux, modules HEADER = '''\ #!/usr/bin/env python{py_major_version} diff --git a/setup/installers.py b/setup/installers.py index ef55612552..2a2de8809d 100644 --- a/setup/installers.py +++ b/setup/installers.py @@ -2,11 +2,14 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, sys, subprocess, binascii, json +import binascii +import json +import os +import subprocess +import sys from setup import Command - d = os.path.dirname diff --git a/setup/iso_codes.py b/setup/iso_codes.py index 3a3bfecd12..66d196357f 100644 --- a/setup/iso_codes.py +++ b/setup/iso_codes.py @@ -3,7 +3,8 @@ import fnmatch import os -import shutil, time +import shutil +import time import zipfile from io import BytesIO diff --git a/setup/lc_data.py b/setup/lc_data.py index f632db152c..4e252afcb1 100644 --- a/setup/lc_data.py +++ b/setup/lc_data.py @@ -8,7 +8,11 @@ __copyright__ = '2014, Kovid Goyal ' # To regenerate run: # sudo locale-gen -A && python3 lc_time.py -import locale, os, pprint, sys +import locale +import os +import pprint +import sys + def generate_data(): def nl(code): diff --git a/setup/linux-installer.py b/setup/linux-installer.py index e4aace9120..8cfdce9861 100644 --- a/setup/linux-installer.py +++ b/setup/linux-installer.py @@ -37,17 +37,18 @@ if machine.startswith('arm') or machine.startswith('aarch64'): if py3: unicode = str raw_input = input - from urllib.parse import urlparse - from urllib.request import BaseHandler, build_opener, Request, urlopen, getproxies, addinfourl import http.client as httplib + from urllib.parse import urlparse + from urllib.request import BaseHandler, Request, addinfourl, build_opener, getproxies, urlopen def encode_for_subprocess(x): return x else: - from future_builtins import map - from urlparse import urlparse - from urllib import urlopen, getproxies, addinfourl - from urllib2 import BaseHandler, build_opener, Request + from urllib import addinfourl, getproxies, urlopen + import httplib + from future_builtins import map + from urllib2 import BaseHandler, Request, build_opener + from urlparse import urlparse def encode_for_subprocess(x): if isinstance(x, unicode): diff --git a/setup/mathjax.py b/setup/mathjax.py index fa81f29181..cf23e7b330 100644 --- a/setup/mathjax.py +++ b/setup/mathjax.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, json +import json +import os from hashlib import sha1 - from setup.revendor import ReVendor diff --git a/setup/parallel_build.py b/setup/parallel_build.py index 0208bbaefc..015fb2d5d5 100644 --- a/setup/parallel_build.py +++ b/setup/parallel_build.py @@ -4,14 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import subprocess, os, itertools, json, sys, shlex -from multiprocessing.pool import ThreadPool as Pool +import itertools +import json +import os +import shlex +import subprocess +import sys from collections import namedtuple -from threading import Thread -from functools import partial from contextlib import closing +from functools import partial +from multiprocessing.pool import ThreadPool as Pool +from threading import Thread + +from polyglot.builtins import as_bytes, unicode_type -from polyglot.builtins import unicode_type, as_bytes Job = namedtuple('Job', 'cmd human_text cwd') cpu_count = min(16, max(1, os.cpu_count())) diff --git a/setup/plugins_mirror.py b/setup/plugins_mirror.py index 537c9780bd..2c94378540 100644 --- a/setup/plugins_mirror.py +++ b/setup/plugins_mirror.py @@ -45,9 +45,9 @@ except ImportError: try: from urllib.error import URLError - from urllib.request import urlopen, Request, build_opener + from urllib.request import Request, build_opener, urlopen except Exception: - from urllib2 import urlopen, Request, build_opener, URLError + from urllib2 import Request, URLError, build_opener, urlopen # }}} USER_AGENT = 'calibre mirror' diff --git a/setup/publish.py b/setup/publish.py index 280642fa6d..eb83130243 100644 --- a/setup/publish.py +++ b/setup/publish.py @@ -5,10 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, subprocess, tempfile, json, time, filecmp, sys +import filecmp +import json +import os +import shutil +import subprocess +import sys +import tempfile +import time -from setup import Command, __version__, require_clean_git, require_git_master, installer_names -from setup.parallel_build import parallel_build, create_job +from setup import Command, __version__, installer_names, require_clean_git, require_git_master +from setup.parallel_build import create_job, parallel_build class Stage1(Command): diff --git a/setup/resources.py b/setup/resources.py index def7997576..a88b511b24 100644 --- a/setup/resources.py +++ b/setup/resources.py @@ -5,11 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re, shutil, zipfile, glob, json, errno +import errno +import glob +import json +import os +import re +import shutil +import zipfile from zlib import compress -from setup import Command, basenames, __appname__, download_securely, dump_json -from polyglot.builtins import codepoint_to_chr, itervalues, iteritems, only_unicode_recursive +from polyglot.builtins import codepoint_to_chr, iteritems, itervalues, only_unicode_recursive +from setup import Command, __appname__, basenames, download_securely, dump_json def get_opts_from_parser(parser): @@ -180,7 +186,7 @@ class RapydScript(Command): # {{{ help='Only compile the specified module') def run(self, opts): - from calibre.utils.rapydscript import compile_srv, compile_editor, compile_viewer + from calibre.utils.rapydscript import compile_editor, compile_srv, compile_viewer if opts.only_module: locals()['compile_' + opts.only_module]() else: @@ -210,8 +216,7 @@ class Resources(Command): # {{{ with open(dest, 'wb') as f: f.write(msgpack_dumps(scripts)) - from calibre.web.feeds.recipes.collection import \ - serialize_builtin_recipes, iterate_over_builtin_recipe_files + from calibre.web.feeds.recipes.collection import iterate_over_builtin_recipe_files, serialize_builtin_recipes files = [x[1] for x in iterate_over_builtin_recipe_files()] @@ -270,6 +275,7 @@ class Resources(Command): # {{{ dest = self.j(self.RESOURCES, 'template-functions.json') function_dict = {} import inspect + from calibre.utils.formatter_functions import formatter_functions for obj in formatter_functions().get_builtins().values(): eval_func = inspect.getmembers(obj, diff --git a/setup/run-calibre-worker.py b/setup/run-calibre-worker.py index a048e2a9f4..6cbcc4e695 100644 --- a/setup/run-calibre-worker.py +++ b/setup/run-calibre-worker.py @@ -2,7 +2,9 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import sys, os +import os +import sys + sys.setup_dir = os.path.dirname(os.path.abspath(__file__)) SRC = os.path.abspath(os.path.join(os.path.dirname(sys.setup_dir), 'src')) sys.path.insert(0, SRC) @@ -11,4 +13,5 @@ sys.extensions_location = os.path.join(SRC, 'calibre', 'plugins') sys.running_from_setup = True from calibre.utils.ipc.worker import main + sys.exit(main()) diff --git a/setup/test.py b/setup/test.py index 0a9fd14b2e..1a82e0d454 100644 --- a/setup/test.py +++ b/setup/test.py @@ -6,7 +6,8 @@ import os import subprocess import sys -from setup import Command, ismacos, is_ci +from setup import Command, is_ci, ismacos + TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants build misc dbcli ebooks'.split()) @@ -59,9 +60,7 @@ class Test(BaseTest): sys.libxslt_dylib = ctypes.CDLL(os.path.join(os.environ['SW'], 'lib', 'libxslt.dylib')) sys.libexslt_dylib = ctypes.CDLL(os.path.join(os.environ['SW'], 'lib', 'libexslt.dylib')) print(sys.libxml2_dylib, sys.libxslt_dylib, sys.libexslt_dylib, file=sys.stderr, flush=True) - from calibre.utils.run_tests import ( - filter_tests_by_name, remove_tests_by_name, run_cli, find_tests - ) + from calibre.utils.run_tests import filter_tests_by_name, find_tests, remove_tests_by_name, run_cli tests = find_tests(which_tests=frozenset(opts.test_module), exclude_tests=frozenset(opts.exclude_test_module)) if opts.test_name: tests = filter_tests_by_name(tests, *opts.test_name) diff --git a/setup/translations.py b/setup/translations.py index fea29f69bf..168b3c87e3 100644 --- a/setup/translations.py +++ b/setup/translations.py @@ -5,15 +5,27 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, tempfile, shutil, subprocess, glob, re, time, textwrap, shlex, json, errno, hashlib, sys +import errno +import glob +import hashlib +import json +import os +import re +import shlex +import shutil +import subprocess +import sys +import tempfile +import textwrap +import time from collections import defaultdict -from locale import normalize as normalize_locale from functools import partial +from locale import normalize as normalize_locale -from setup import Command, __appname__, __version__, require_git_master, build_cache_dir, edit_file, dump_json, is_ci -from setup.parallel_build import batched_parallel_jobs -from setup.iso_codes import iso_data from polyglot.builtins import codepoint_to_chr, iteritems +from setup import Command, __appname__, __version__, build_cache_dir, dump_json, edit_file, is_ci, require_git_master +from setup.iso_codes import iso_data +from setup.parallel_build import batched_parallel_jobs def qt_sources(): @@ -439,7 +451,7 @@ class Translations(POT): # {{{ def compile_content_server_translations(self): self.info('Compiling content-server translations') from calibre.utils.rapydscript import msgfmt - from calibre.utils.zipfile import ZipFile, ZIP_DEFLATED, ZipInfo, ZIP_STORED + from calibre.utils.zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile, ZipInfo with ZipFile(self.j(self.RESOURCES, 'content-server', 'locales.zip'), 'w', ZIP_DEFLATED) as zf: for src in glob.glob(os.path.join(self.TRANSLATIONS, 'content-server', '*.po')): if not self.is_po_file_ok(src): @@ -472,7 +484,7 @@ class Translations(POT): # {{{ def freeze_locales(self): zf = self.DEST + '.zip' from calibre import CurrentDir - from calibre.utils.zipfile import ZipFile, ZIP_DEFLATED + from calibre.utils.zipfile import ZIP_DEFLATED, ZipFile with ZipFile(zf, 'w', ZIP_DEFLATED) as zf: with CurrentDir(self.DEST): zf.add_dir('.') @@ -483,9 +495,9 @@ class Translations(POT): # {{{ return self.j(self.d(self.DEST), 'stats.calibre_msgpack') def _compile_website_translations(self, name='website', threshold=50): - from calibre.utils.zipfile import ZipFile, ZipInfo, ZIP_STORED from calibre.ptempfile import TemporaryDirectory from calibre.utils.localization import get_language, translator_for_lang + from calibre.utils.zipfile import ZIP_STORED, ZipFile, ZipInfo self.info('Compiling', name, 'translations...') srcbase = self.j(self.d(self.SRC), 'translations', name) if not os.path.exists(srcbase): diff --git a/setup/upload.py b/setup/upload.py index d1f48e58d5..7c0076d339 100644 --- a/setup/upload.py +++ b/setup/upload.py @@ -5,18 +5,27 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, subprocess, hashlib, shutil, glob, stat, sys, time, json +import glob +import hashlib +import json +import os +import shutil +import stat +import subprocess +import sys +import time from subprocess import check_call -from tempfile import NamedTemporaryFile, mkdtemp, gettempdir +from tempfile import NamedTemporaryFile, gettempdir, mkdtemp from zipfile import ZipFile + from polyglot.builtins import iteritems -from polyglot.urllib import urlopen, Request +from polyglot.urllib import Request, urlopen if __name__ == '__main__': d = os.path.dirname sys.path.insert(0, d(d(os.path.abspath(__file__)))) -from setup import Command, __version__, __appname__, installer_names +from setup import Command, __appname__, __version__, installer_names DOWNLOADS = '/srv/main/downloads' HTML2LRF = "calibre/ebooks/lrf/html/demo" diff --git a/setup/xwin.py b/setup/xwin.py index b14219ea38..724eb28af6 100644 --- a/setup/xwin.py +++ b/setup/xwin.py @@ -2,7 +2,8 @@ # License: GPLv3 Copyright: 2023, Kovid Goyal -import os, runpy +import os +import runpy import shutil from setup import Command diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 4f0337573e..3d858548a6 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -3,10 +3,15 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, re, time, warnings -from polyglot.builtins import codepoint_to_chr, hasenv, native_string_type -from math import floor +import os +import re +import sys +import time +import warnings from functools import partial +from math import floor + +from polyglot.builtins import codepoint_to_chr, hasenv, native_string_type if not hasenv('CALIBRE_SHOW_DEPRECATION_WARNINGS'): warnings.simplefilter('ignore', DeprecationWarning) @@ -15,13 +20,25 @@ try: except OSError: os.chdir(os.path.expanduser('~')) -from calibre.constants import (iswindows, ismacos, islinux, isfrozen, - isbsd, preferred_encoding, __appname__, __version__, __author__, - plugins, filesystem_encoding, config_dir) +from calibre.constants import ( + __appname__, + __author__, + __version__, + config_dir, + filesystem_encoding, + isbsd, + isfrozen, + islinux, + ismacos, + iswindows, + plugins, + preferred_encoding, +) from calibre.startup import initialize_calibre + initialize_calibre() -from calibre.utils.icu import safe_chr from calibre.prints import prints +from calibre.utils.icu import safe_chr from calibre.utils.resources import get_path as P if False: @@ -293,7 +310,7 @@ def is_mobile_ua(ua): def random_user_agent(choose=None, allow_ie=True): - from calibre.utils.random_ua import common_user_agents, choose_randomly_by_popularity + from calibre.utils.random_ua import choose_randomly_by_popularity, common_user_agents ua_list = common_user_agents() ua_list = tuple(x for x in ua_list if not is_mobile_ua(x)) if not allow_ie: diff --git a/src/calibre/build_forms.py b/src/calibre/build_forms.py index d45992ec85..222aff76bd 100644 --- a/src/calibre/build_forms.py +++ b/src/calibre/build_forms.py @@ -1,8 +1,8 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2021, Kovid Goyal -import os import importlib +import os def form_to_compiled_form(form): @@ -39,6 +39,7 @@ def ensure_icons_built(resource_dir, force_compile, info): def build_forms(srcdir, info=None, summary=False, check_for_migration=False, check_icons=True): import re + from qt.core import QT_VERSION_STR qt_major = QT_VERSION_STR.split('.')[0] m = importlib.import_module(f'PyQt{qt_major}.uic') diff --git a/src/calibre/constants.py b/src/calibre/constants.py index 51b5a6375d..4e2efe3455 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -1,8 +1,14 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2015, Kovid Goyal -from polyglot.builtins import environ_item, hasenv +import codecs +import collections +import collections.abc +import locale +import os +import sys from functools import lru_cache -import sys, locale, codecs, os, collections, collections.abc + +from polyglot.builtins import environ_item, hasenv __appname__ = 'calibre' numeric_version = (7, 7, 101) @@ -173,9 +179,9 @@ def cache_dir(): plugins_loc = sys.extensions_location system_plugins_loc = getattr(sys, 'system_plugins_location', None) -from importlib.machinery import ModuleSpec, EXTENSION_SUFFIXES, ExtensionFileLoader -from importlib.util import find_spec from importlib import import_module +from importlib.machinery import EXTENSION_SUFFIXES, ExtensionFileLoader, ModuleSpec +from importlib.util import find_spec class DeVendorLoader: @@ -389,7 +395,8 @@ else: not os.access(config_dir, os.W_OK) or not \ os.access(config_dir, os.X_OK): print('No write access to', config_dir, 'using a temporary dir instead') - import tempfile, atexit + import atexit + import tempfile config_dir = tempfile.mkdtemp(prefix='calibre-config-') def cleanup_cdir(): diff --git a/src/calibre/customize/__init__.py b/src/calibre/customize/__init__.py index 3bdf4a5f67..a50a76ac94 100644 --- a/src/calibre/customize/__init__.py +++ b/src/calibre/customize/__init__.py @@ -145,10 +145,7 @@ class Plugin: # {{{ True if the user clicks OK, False otherwise. The changes are automatically applied. ''' - from qt.core import ( - QApplication, QDialog, QDialogButtonBox, QLabel, QLineEdit, QScrollArea, Qt, - QVBoxLayout, QSize - ) + from qt.core import QApplication, QDialog, QDialogButtonBox, QLabel, QLineEdit, QScrollArea, QSize, Qt, QVBoxLayout from calibre.gui2 import gprefs diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 297169a7e5..52ea221a46 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1,12 +1,13 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, glob -from calibre.customize import (FileTypePlugin, MetadataReaderPlugin, - MetadataWriterPlugin, PreferencesPlugin, InterfaceActionBase, StoreBase) +import glob +import os + from calibre.constants import numeric_version -from calibre.ebooks.metadata.archive import ArchiveExtract, KPFExtract, get_comic_metadata +from calibre.customize import FileTypePlugin, InterfaceActionBase, MetadataReaderPlugin, MetadataWriterPlugin, PreferencesPlugin, StoreBase from calibre.ebooks.html.to_zip import HTML2ZIP +from calibre.ebooks.metadata.archive import ArchiveExtract, KPFExtract, get_comic_metadata plugins = [] @@ -588,47 +589,45 @@ plugins += [x for x in list(locals().values()) if isinstance(x, type) and # }}} # Conversion plugins {{{ +from calibre.ebooks.conversion.plugins.azw4_input import AZW4Input +from calibre.ebooks.conversion.plugins.chm_input import CHMInput from calibre.ebooks.conversion.plugins.comic_input import ComicInput from calibre.ebooks.conversion.plugins.djvu_input import DJVUInput +from calibre.ebooks.conversion.plugins.docx_input import DOCXInput +from calibre.ebooks.conversion.plugins.docx_output import DOCXOutput from calibre.ebooks.conversion.plugins.epub_input import EPUBInput +from calibre.ebooks.conversion.plugins.epub_output import EPUBOutput from calibre.ebooks.conversion.plugins.fb2_input import FB2Input +from calibre.ebooks.conversion.plugins.fb2_output import FB2Output from calibre.ebooks.conversion.plugins.html_input import HTMLInput +from calibre.ebooks.conversion.plugins.html_output import HTMLOutput from calibre.ebooks.conversion.plugins.htmlz_input import HTMLZInput +from calibre.ebooks.conversion.plugins.htmlz_output import HTMLZOutput from calibre.ebooks.conversion.plugins.lit_input import LITInput +from calibre.ebooks.conversion.plugins.lit_output import LITOutput +from calibre.ebooks.conversion.plugins.lrf_input import LRFInput +from calibre.ebooks.conversion.plugins.lrf_output import LRFOutput from calibre.ebooks.conversion.plugins.mobi_input import MOBIInput +from calibre.ebooks.conversion.plugins.mobi_output import AZW3Output, MOBIOutput from calibre.ebooks.conversion.plugins.odt_input import ODTInput +from calibre.ebooks.conversion.plugins.oeb_output import OEBOutput from calibre.ebooks.conversion.plugins.pdb_input import PDBInput -from calibre.ebooks.conversion.plugins.azw4_input import AZW4Input +from calibre.ebooks.conversion.plugins.pdb_output import PDBOutput from calibre.ebooks.conversion.plugins.pdf_input import PDFInput +from calibre.ebooks.conversion.plugins.pdf_output import PDFOutput from calibre.ebooks.conversion.plugins.pml_input import PMLInput +from calibre.ebooks.conversion.plugins.pml_output import PMLOutput from calibre.ebooks.conversion.plugins.rb_input import RBInput +from calibre.ebooks.conversion.plugins.rb_output import RBOutput from calibre.ebooks.conversion.plugins.recipe_input import RecipeInput from calibre.ebooks.conversion.plugins.rtf_input import RTFInput -from calibre.ebooks.conversion.plugins.tcr_input import TCRInput -from calibre.ebooks.conversion.plugins.txt_input import TXTInput -from calibre.ebooks.conversion.plugins.lrf_input import LRFInput -from calibre.ebooks.conversion.plugins.chm_input import CHMInput -from calibre.ebooks.conversion.plugins.snb_input import SNBInput -from calibre.ebooks.conversion.plugins.docx_input import DOCXInput - -from calibre.ebooks.conversion.plugins.epub_output import EPUBOutput -from calibre.ebooks.conversion.plugins.fb2_output import FB2Output -from calibre.ebooks.conversion.plugins.lit_output import LITOutput -from calibre.ebooks.conversion.plugins.lrf_output import LRFOutput -from calibre.ebooks.conversion.plugins.mobi_output import (MOBIOutput, - AZW3Output) -from calibre.ebooks.conversion.plugins.oeb_output import OEBOutput -from calibre.ebooks.conversion.plugins.pdb_output import PDBOutput -from calibre.ebooks.conversion.plugins.pdf_output import PDFOutput -from calibre.ebooks.conversion.plugins.pml_output import PMLOutput -from calibre.ebooks.conversion.plugins.rb_output import RBOutput from calibre.ebooks.conversion.plugins.rtf_output import RTFOutput -from calibre.ebooks.conversion.plugins.tcr_output import TCROutput -from calibre.ebooks.conversion.plugins.txt_output import TXTOutput, TXTZOutput -from calibre.ebooks.conversion.plugins.html_output import HTMLOutput -from calibre.ebooks.conversion.plugins.htmlz_output import HTMLZOutput +from calibre.ebooks.conversion.plugins.snb_input import SNBInput from calibre.ebooks.conversion.plugins.snb_output import SNBOutput -from calibre.ebooks.conversion.plugins.docx_output import DOCXOutput +from calibre.ebooks.conversion.plugins.tcr_input import TCRInput +from calibre.ebooks.conversion.plugins.tcr_output import TCROutput +from calibre.ebooks.conversion.plugins.txt_input import TXTInput +from calibre.ebooks.conversion.plugins.txt_output import TXTOutput, TXTZOutput plugins += [ ComicInput, @@ -677,57 +676,92 @@ plugins += [ # }}} # Catalog plugins {{{ -from calibre.library.catalogs.csv_xml import CSV_XML from calibre.library.catalogs.bibtex import BIBTEX +from calibre.library.catalogs.csv_xml import CSV_XML from calibre.library.catalogs.epub_mobi import EPUB_MOBI + plugins += [CSV_XML, BIBTEX, EPUB_MOBI] # }}} # Profiles {{{ from calibre.customize.profiles import input_profiles, output_profiles + plugins += input_profiles + output_profiles # }}} # Device driver plugins {{{ -from calibre.devices.hanlin.driver import HANLINV3, HANLINV5, BOOX, SPECTRA +from calibre.devices.android.driver import ANDROID, S60, WEBOS +from calibre.devices.binatone.driver import README from calibre.devices.blackberry.driver import BLACKBERRY, PLAYBOOK -from calibre.devices.cybook.driver import CYBOOK, ORIZON, MUSE, DIVA -from calibre.devices.eb600.driver import (EB600, COOL_ER, SHINEBOOK, TOLINO, - POCKETBOOK360, GER2, ITALICA, ECLICTO, DBOOK, INVESBOOK, - BOOQ, ELONEX, POCKETBOOK301, MENTOR, POCKETBOOK602, - POCKETBOOK701, POCKETBOOK740, POCKETBOOK360P, PI2, POCKETBOOK622, - POCKETBOOKHD) +from calibre.devices.boeye.driver import BOEYE_BDX, BOEYE_BEX +from calibre.devices.cybook.driver import CYBOOK, DIVA, MUSE, ORIZON +from calibre.devices.eb600.driver import ( + BOOQ, + COOL_ER, + DBOOK, + EB600, + ECLICTO, + ELONEX, + GER2, + INVESBOOK, + ITALICA, + MENTOR, + PI2, + POCKETBOOK301, + POCKETBOOK360, + POCKETBOOK360P, + POCKETBOOK602, + POCKETBOOK622, + POCKETBOOK701, + POCKETBOOK740, + POCKETBOOKHD, + SHINEBOOK, + TOLINO, +) +from calibre.devices.edge.driver import EDGE +from calibre.devices.eslick.driver import EBK52, ESLICK +from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG +from calibre.devices.hanlin.driver import BOOX, HANLINV3, HANLINV5, SPECTRA +from calibre.devices.hanvon.driver import ALEX, AZBOOKA, EB511, KIBANO, LIBREAIR, N516, ODYSSEY, THEBOOK from calibre.devices.iliad.driver import ILIAD -from calibre.devices.irexdr.driver import IREXDR1000, IREXDR800 -from calibre.devices.jetbook.driver import (JETBOOK, MIBUK, JETBOOK_MINI, - JETBOOK_COLOR) -from calibre.devices.kindle.driver import (KINDLE, KINDLE2, KINDLE_DX, - KINDLE_FIRE) +from calibre.devices.irexdr.driver import IREXDR800, IREXDR1000 +from calibre.devices.iriver.driver import IRIVER_STORY +from calibre.devices.jetbook.driver import JETBOOK, JETBOOK_COLOR, JETBOOK_MINI, MIBUK +from calibre.devices.kindle.driver import KINDLE, KINDLE2, KINDLE_DX, KINDLE_FIRE +from calibre.devices.kobo.driver import KOBO, KOBOTOUCH +from calibre.devices.misc import ( + ADAM, + ALURATEK_COLOR, + AVANT, + CERVANTES, + COBY, + EEEREADER, + EX124G, + GEMEI, + LUMIREAD, + MOOVYBOOK, + NEXTBOOK, + PALMPRE, + PDNOVEL, + PDNOVEL_KOBO, + POCKETBOOK626, + SONYDPTS1, + SWEEX, + TREKSTOR, + VELOCITYMICRO, + WAYTEQ, + WOXTER, +) +from calibre.devices.mtp.driver import MTP_DEVICE +from calibre.devices.nokia.driver import E52, E71X, N770, N810 from calibre.devices.nook.driver import NOOK, NOOK_COLOR +from calibre.devices.nuut2.driver import NUUT2 from calibre.devices.prs505.driver import PRS505 from calibre.devices.prst1.driver import PRST1 -from calibre.devices.user_defined.driver import USER_DEFINED -from calibre.devices.android.driver import ANDROID, S60, WEBOS -from calibre.devices.nokia.driver import N770, N810, E71X, E52 -from calibre.devices.eslick.driver import ESLICK, EBK52 -from calibre.devices.nuut2.driver import NUUT2 -from calibre.devices.iriver.driver import IRIVER_STORY -from calibre.devices.binatone.driver import README -from calibre.devices.hanvon.driver import (N516, EB511, ALEX, AZBOOKA, THEBOOK, - LIBREAIR, ODYSSEY, KIBANO) -from calibre.devices.edge.driver import EDGE -from calibre.devices.teclast.driver import (TECLAST_K3, NEWSMY, IPAPYRUS, - SOVOS, PICO, SUNSTECH_EB700, ARCHOS7O, STASH, WEXLER) -from calibre.devices.sne.driver import SNE -from calibre.devices.misc import ( - PALMPRE, AVANT, SWEEX, PDNOVEL, GEMEI, VELOCITYMICRO, PDNOVEL_KOBO, - LUMIREAD, ALURATEK_COLOR, TREKSTOR, EEEREADER, NEXTBOOK, ADAM, MOOVYBOOK, - COBY, EX124G, WAYTEQ, WOXTER, POCKETBOOK626, SONYDPTS1, CERVANTES) -from calibre.devices.folder_device.driver import FOLDER_DEVICE_FOR_CONFIG -from calibre.devices.kobo.driver import KOBO, KOBOTOUCH -from calibre.devices.boeye.driver import BOEYE_BEX, BOEYE_BDX from calibre.devices.smart_device_app.driver import SMART_DEVICE_APP -from calibre.devices.mtp.driver import MTP_DEVICE +from calibre.devices.sne.driver import SNE +from calibre.devices.teclast.driver import ARCHOS7O, IPAPYRUS, NEWSMY, PICO, SOVOS, STASH, SUNSTECH_EB700, TECLAST_K3, WEXLER +from calibre.devices.user_defined.driver import USER_DEFINED # Order here matters. The first matched device is the one used. plugins += [ @@ -805,12 +839,12 @@ plugins += [ # }}} # New metadata download plugins {{{ -from calibre.ebooks.metadata.sources.google import GoogleBooks from calibre.ebooks.metadata.sources.amazon import Amazon -from calibre.ebooks.metadata.sources.edelweiss import Edelweiss -from calibre.ebooks.metadata.sources.openlibrary import OpenLibrary -from calibre.ebooks.metadata.sources.google_images import GoogleImages from calibre.ebooks.metadata.sources.big_book_search import BigBookSearch +from calibre.ebooks.metadata.sources.edelweiss import Edelweiss +from calibre.ebooks.metadata.sources.google import GoogleBooks +from calibre.ebooks.metadata.sources.google_images import GoogleImages +from calibre.ebooks.metadata.sources.openlibrary import OpenLibrary plugins += [GoogleBooks, GoogleImages, Amazon, Edelweiss, OpenLibrary, BigBookSearch] @@ -1936,7 +1970,8 @@ plugins += [ if __name__ == '__main__': # Test load speed - import subprocess, textwrap + import subprocess + import textwrap try: subprocess.check_call(['python', '-c', textwrap.dedent( ''' diff --git a/src/calibre/customize/conversion.py b/src/calibre/customize/conversion.py index aa2dd48b9e..efeff90636 100644 --- a/src/calibre/customize/conversion.py +++ b/src/calibre/customize/conversion.py @@ -1,7 +1,10 @@ ''' Defines the plugin system for conversions. ''' -import re, os, shutil, numbers +import numbers +import os +import re +import shutil from calibre import CurrentDir from calibre.customize import Plugin diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index 84a6169065..f4e0285f34 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -1,26 +1,38 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import os, shutil, traceback, functools, sys +import functools +import os +import shutil +import sys +import traceback from collections import defaultdict from itertools import chain, repeat -from calibre.customize import (CatalogPlugin, FileTypePlugin, PluginNotFound, - MetadataReaderPlugin, MetadataWriterPlugin, - InterfaceActionBase as InterfaceAction, - PreferencesPlugin, platform, InvalidPlugin, - StoreBase as Store, EditBookToolPlugin, - LibraryClosedPlugin, PluginInstallationType) -from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin -from calibre.customize.zipplugin import loader -from calibre.customize.profiles import InputProfile, OutputProfile +from calibre.constants import DEBUG, ismacos, numeric_version, system_plugins_loc +from calibre.customize import ( + CatalogPlugin, + EditBookToolPlugin, + FileTypePlugin, + InvalidPlugin, + LibraryClosedPlugin, + MetadataReaderPlugin, + MetadataWriterPlugin, + PluginInstallationType, + PluginNotFound, + PreferencesPlugin, + platform, +) +from calibre.customize import InterfaceActionBase as InterfaceAction +from calibre.customize import StoreBase as Store from calibre.customize.builtins import plugins as builtin_plugins +from calibre.customize.conversion import InputFormatPlugin, OutputFormatPlugin +from calibre.customize.profiles import InputProfile, OutputProfile +from calibre.customize.zipplugin import loader from calibre.devices.interface import DevicePlugin from calibre.ebooks.metadata import MetaInformation -from calibre.utils.config import (make_config_dir, Config, ConfigProxy, - plugin_dir, OptionParser) from calibre.ebooks.metadata.sources.base import Source -from calibre.constants import DEBUG, numeric_version, system_plugins_loc, ismacos +from calibre.utils.config import Config, ConfigProxy, OptionParser, make_config_dir, plugin_dir from polyglot.builtins import iteritems, itervalues builtin_names = frozenset(p.name for p in builtin_plugins) @@ -757,8 +769,8 @@ def initialize_plugins(perf=False): system_plugins.pop(name, None) ostdout, ostderr = sys.stdout, sys.stderr if perf: - from collections import defaultdict import time + from collections import defaultdict times = defaultdict(int) for zfp, installation_type in chain( @@ -815,7 +827,7 @@ def initialized_plugins(): def build_plugin(path): from calibre import prints from calibre.ptempfile import PersistentTemporaryFile - from calibre.utils.zipfile import ZipFile, ZIP_STORED + from calibre.utils.zipfile import ZIP_STORED, ZipFile path = str(path) names = frozenset(os.listdir(path)) if '__init__.py' not in names: diff --git a/src/calibre/customize/zipplugin.py b/src/calibre/customize/zipplugin.py index aad3d83f90..efb988d005 100644 --- a/src/calibre/customize/zipplugin.py +++ b/src/calibre/customize/zipplugin.py @@ -18,9 +18,7 @@ from importlib.machinery import ModuleSpec from importlib.util import decode_source from calibre import as_unicode -from calibre.customize import ( - InvalidPlugin, Plugin, PluginNotFound, numeric_version, platform -) +from calibre.customize import InvalidPlugin, Plugin, PluginNotFound, numeric_version, platform from polyglot.builtins import itervalues, reload, string_or_bytes diff --git a/src/calibre/db/__init__.py b/src/calibre/db/__init__.py index 1b9c618cf6..05481f3625 100644 --- a/src/calibre/db/__init__.py +++ b/src/calibre/db/__init__.py @@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en' SPOOL_SIZE = 30*1024*1024 import numbers + from polyglot.builtins import iteritems @@ -20,8 +21,9 @@ class FTSQueryError(ValueError): def _get_next_series_num_for_list(series_indices, unwrap=True): - from calibre.utils.config_base import tweaks from math import ceil, floor + + from calibre.utils.config_base import tweaks if not series_indices: if isinstance(tweaks['series_index_auto_increment'], numbers.Number): return float(tweaks['series_index_auto_increment']) @@ -77,6 +79,7 @@ def get_data_as_dict(self, prefix=None, authors_as_string=False, ids=None, conve all entries in database. ''' import os + from calibre.ebooks.metadata import authors_to_string from calibre.utils.date import as_local_time backend = getattr(self, 'backend', self) # Works with both old and legacy interfaces diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 4e79368bd6..b75ab5c45b 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -6,7 +6,6 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' # Imports {{{ -import apsw import errno import hashlib import json @@ -17,48 +16,64 @@ import sys import time import uuid from contextlib import closing, suppress -from typing import Optional from functools import partial +from typing import Optional + +import apsw from calibre import as_unicode, force_unicode, isbytestring, prints -from calibre.constants import ( - filesystem_encoding, iswindows, plugins, preferred_encoding, -) +from calibre.constants import filesystem_encoding, iswindows, plugins, preferred_encoding from calibre.db import SPOOL_SIZE, FTSQueryError from calibre.db.annotations import annot_db_data, unicode_normalize from calibre.db.constants import ( - BOOK_ID_PATH_TEMPLATE, COVER_FILE_NAME, DEFAULT_TRASH_EXPIRY_TIME_SECONDS, - METADATA_FILE_NAME, NOTES_DIR_NAME, TRASH_DIR_NAME, TrashEntry, + BOOK_ID_PATH_TEMPLATE, + COVER_FILE_NAME, + DEFAULT_TRASH_EXPIRY_TIME_SECONDS, + METADATA_FILE_NAME, + NOTES_DIR_NAME, + TRASH_DIR_NAME, + TrashEntry, ) from calibre.db.errors import NoSuchFormat from calibre.db.schema_upgrades import SchemaUpgrade from calibre.db.tables import ( - AuthorsTable, CompositeTable, FormatsTable, IdentifiersTable, ManyToManyTable, - ManyToOneTable, OneToOneTable, PathTable, RatingTable, SizeTable, UUIDTable, + AuthorsTable, + CompositeTable, + FormatsTable, + IdentifiersTable, + ManyToManyTable, + ManyToOneTable, + OneToOneTable, + PathTable, + RatingTable, + SizeTable, + UUIDTable, ) from calibre.ebooks.metadata import author_to_author_sort, title_sort from calibre.library.field_metadata import FieldMetadata from calibre.ptempfile import PersistentTemporaryFile, TemporaryFile from calibre.utils import pickle_binary_string, unpickle_binary_string from calibre.utils.config import from_json, prefs, to_json, tweaks -from calibre.utils.copy_files import ( - copy_files, copy_tree, rename_files, windows_check_if_files_in_use, -) +from calibre.utils.copy_files import copy_files, copy_tree, rename_files, windows_check_if_files_in_use from calibre.utils.date import EPOCH, parse_date, utcfromtimestamp, utcnow from calibre.utils.filenames import ( - ascii_filename, atomic_rename, copyfile_using_links, copytree_using_links, - get_long_path_name, hardlink_file, is_case_sensitive, is_fat_filesystem, - make_long_path_useable, remove_dir_if_empty, samefile, + ascii_filename, + atomic_rename, + copyfile_using_links, + copytree_using_links, + get_long_path_name, + hardlink_file, + is_case_sensitive, + is_fat_filesystem, + make_long_path_useable, + remove_dir_if_empty, + samefile, ) -from calibre.utils.formatter_functions import ( - compile_user_template_functions, formatter_functions, load_user_template_functions, - unload_user_template_functions, -) -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.formatter_functions import compile_user_template_functions, formatter_functions, load_user_template_functions, unload_user_template_functions +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from calibre.utils.resources import get_path as P -from polyglot.builtins import ( - cmp, iteritems, itervalues, native_string_type, reraise, string_or_bytes, -) +from polyglot.builtins import cmp, iteritems, itervalues, native_string_type, reraise, string_or_bytes # }}} @@ -1375,6 +1390,7 @@ class DB: def dump_and_restore(self, callback=None, sql=None): import codecs + from apsw import Shell if callback is None: def callback(x): diff --git a/src/calibre/db/backup.py b/src/calibre/db/backup.py index 2437d7169d..23c8429c96 100644 --- a/src/calibre/db/backup.py +++ b/src/calibre/db/backup.py @@ -5,8 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import weakref, traceback, sys -from threading import Thread, Event +import sys +import traceback +import weakref +from threading import Event, Thread from calibre.ebooks.metadata.opf2 import metadata_to_opf diff --git a/src/calibre/db/cache.py b/src/calibre/db/cache.py index 73a05d493f..a9cd3abebd 100644 --- a/src/calibre/db/cache.py +++ b/src/calibre/db/cache.py @@ -25,10 +25,7 @@ from typing import NamedTuple, Optional, Tuple from calibre import as_unicode, detect_ncpus, isbytestring from calibre.constants import iswindows, preferred_encoding -from calibre.customize.ui import ( - run_plugins_on_import, run_plugins_on_postadd, run_plugins_on_postdelete, - run_plugins_on_postimport, -) +from calibre.customize.ui import run_plugins_on_import, run_plugins_on_postadd, run_plugins_on_postdelete, run_plugins_on_postimport from calibre.db import SPOOL_SIZE, _get_next_series_num_for_list from calibre.db.annotations import merge_annotations from calibre.db.categories import get_categories @@ -37,9 +34,7 @@ from calibre.db.errors import NoSuchBook, NoSuchFormat from calibre.db.fields import IDENTITY, InvalidLinkTable, create_field from calibre.db.lazy import FormatMetadata, FormatsList, ProxyMetadata from calibre.db.listeners import EventDispatcher, EventType -from calibre.db.locking import ( - DowngradeLockError, LockingError, SafeReadLock, create_locks, try_lock, -) +from calibre.db.locking import DowngradeLockError, LockingError, SafeReadLock, create_locks, try_lock from calibre.db.notes.connect import copy_marked_up_text from calibre.db.search import Search from calibre.db.tables import VirtualTable @@ -51,9 +46,11 @@ from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile, base_dir from calibre.utils.config import prefs, tweaks -from calibre.utils.date import UNDEFINED_DATE, now as nowf, utcnow +from calibre.utils.date import UNDEFINED_DATE, utcnow +from calibre.utils.date import now as nowf from calibre.utils.filenames import make_long_path_useable -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from calibre.utils.localization import canonicalize_lang from polyglot.builtins import cmp, iteritems, itervalues, string_or_bytes diff --git a/src/calibre/db/categories.py b/src/calibre/db/categories.py index dd1edefafb..b8e3f5d913 100644 --- a/src/calibre/db/categories.py +++ b/src/calibre/db/categories.py @@ -11,9 +11,9 @@ from functools import partial from calibre.ebooks.metadata import author_to_author_sort from calibre.utils.config_base import prefs, tweaks -from calibre.utils.icu import ( - collation_order, lower as icu_lower, sort_key, upper as icu_upper, -) +from calibre.utils.icu import collation_order, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper from polyglot.builtins import iteritems, native_string_type CATEGORY_SORTS = ('name', 'popularity', 'rating') # This has to be a tuple not a set diff --git a/src/calibre/db/cli/cmd_add.py b/src/calibre/db/cli/cmd_add.py index 90d4c132ff..3dba096315 100644 --- a/src/calibre/db/cli/cmd_add.py +++ b/src/calibre/db/cli/cmd_add.py @@ -8,10 +8,7 @@ from contextlib import contextmanager from optparse import OptionGroup, OptionValueError from calibre import prints -from calibre.db.adding import ( - cdb_find_in_dir, cdb_recursive_find, compile_rule, create_format_map, - run_import_plugins, run_import_plugins_before_metadata -) +from calibre.db.adding import cdb_find_in_dir, cdb_recursive_find, compile_rule, create_format_map, run_import_plugins, run_import_plugins_before_metadata from calibre.db.utils import find_identical_books from calibre.ebooks.metadata import MetaInformation, string_to_authors from calibre.ebooks.metadata.book.serialize import read_cover, serialize_cover diff --git a/src/calibre/db/cli/cmd_export.py b/src/calibre/db/cli/cmd_export.py index e2ce552daf..a6521caf24 100644 --- a/src/calibre/db/cli/cmd_export.py +++ b/src/calibre/db/cli/cmd_export.py @@ -5,11 +5,9 @@ import os from calibre.db.cli import integers_from_string -from calibre.db.errors import NoSuchFormat from calibre.db.constants import DATA_FILE_PATTERN -from calibre.library.save_to_disk import ( - config, do_save_book_to_disk, get_formats, sanitize_args -) +from calibre.db.errors import NoSuchFormat +from calibre.library.save_to_disk import config, do_save_book_to_disk, get_formats, sanitize_args from calibre.utils.formatter_functions import load_user_template_functions readonly = True diff --git a/src/calibre/db/cli/cmd_fts_search.py b/src/calibre/db/cli/cmd_fts_search.py index 27d6011be9..46b5b9cd12 100644 --- a/src/calibre/db/cli/cmd_fts_search.py +++ b/src/calibre/db/cli/cmd_fts_search.py @@ -102,8 +102,8 @@ Do a full text search on the entire library or a subset of it. def output_results_as_text(results, metadata_cache, include_snippets): - from calibre.utils.terminal import geometry from calibre.ebooks.metadata import authors_to_string + from calibre.utils.terminal import geometry width = max(5, geometry()[0]) separator = '─' * width if not include_snippets: diff --git a/src/calibre/db/cli/cmd_list_categories.py b/src/calibre/db/cli/cmd_list_categories.py index 351d452fb4..fe9822cd31 100644 --- a/src/calibre/db/cli/cmd_list_categories.py +++ b/src/calibre/db/cli/cmd_list_categories.py @@ -71,7 +71,7 @@ information is the equivalent of what is shown in the Tag browser. def do_list(fields, data, opts): - from calibre.utils.terminal import geometry, ColoredStream + from calibre.utils.terminal import ColoredStream, geometry separator = ' ' widths = list(map(lambda x: 0, fields)) diff --git a/src/calibre/db/cli/cmd_remove_custom_column.py b/src/calibre/db/cli/cmd_remove_custom_column.py index 6d2f605894..9558521424 100644 --- a/src/calibre/db/cli/cmd_remove_custom_column.py +++ b/src/calibre/db/cli/cmd_remove_custom_column.py @@ -3,6 +3,7 @@ import sys + from calibre import prints from calibre.db.legacy import LibraryDatabase diff --git a/src/calibre/db/cli/main.py b/src/calibre/db/cli/main.py index 0aaaeecb0a..012e3b098f 100644 --- a/src/calibre/db/cli/main.py +++ b/src/calibre/db/cli/main.py @@ -195,7 +195,8 @@ class DBCtx: def remote_run(self, name, m, *args): from mechanize import HTTPError, Request - from calibre.utils.serialize import msgpack_loads, msgpack_dumps + + from calibre.utils.serialize import msgpack_dumps, msgpack_loads url = self.url + '/cdb/cmd/{}/{}'.format(name, getattr(m, 'version', 0)) if self.library_id: url += '?' + urlencode({'library_id':self.library_id}) diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index a6a443efd9..54ab05132f 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -6,21 +6,20 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' import sys -from threading import Lock -from collections import defaultdict, Counter +from collections import Counter, defaultdict from functools import partial +from threading import Lock -from calibre.db.tables import ONE_ONE, MANY_ONE, MANY_MANY, null +from calibre.db.tables import MANY_MANY, MANY_ONE, ONE_ONE, null +from calibre.db.utils import atof, force_to_bool from calibre.db.write import Writer -from calibre.db.utils import force_to_bool, atof -from calibre.ebooks.metadata import title_sort, author_to_author_sort, rating_to_stars +from calibre.ebooks.metadata import author_to_author_sort, rating_to_stars, title_sort from calibre.utils.config_base import tweaks -from calibre.utils.icu import sort_key from calibre.utils.date import UNDEFINED_DATE, clean_date_for_sort, parse_date +from calibre.utils.icu import sort_key from calibre.utils.localization import calibre_langcode_to_name from polyglot.builtins import iteritems - rendering_composite_name = '__rendering_composite__' diff --git a/src/calibre/db/fts/connect.py b/src/calibre/db/fts/connect.py index e47cbc5f42..d5ebfe3aea 100644 --- a/src/calibre/db/fts/connect.py +++ b/src/calibre/db/fts/connect.py @@ -2,14 +2,15 @@ # License: GPL v3 Copyright: 2022, Kovid Goyal -import apsw import builtins import hashlib import os import sys from contextlib import suppress -from threading import Lock from itertools import count +from threading import Lock + +import apsw from calibre.db import FTSQueryError from calibre.db.annotations import unicode_normalize diff --git a/src/calibre/db/lazy.py b/src/calibre/db/lazy.py index c9a96fd9ec..33594767e6 100644 --- a/src/calibre/db/lazy.py +++ b/src/calibre/db/lazy.py @@ -6,11 +6,11 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' import weakref -from functools import wraps from collections.abc import MutableMapping, MutableSequence from copy import deepcopy +from functools import wraps -from calibre.ebooks.metadata.book.base import Metadata, SIMPLE_GET, TOP_LEVEL_IDENTIFIERS, NULL_VALUES, ALL_METADATA_FIELDS +from calibre.ebooks.metadata.book.base import ALL_METADATA_FIELDS, NULL_VALUES, SIMPLE_GET, TOP_LEVEL_IDENTIFIERS, Metadata from calibre.ebooks.metadata.book.formatter import SafeFormat from calibre.utils.date import utcnow from polyglot.builtins import native_string_type diff --git a/src/calibre/db/legacy.py b/src/calibre/db/legacy.py index a333bb3d6c..b8a9ff5d11 100644 --- a/src/calibre/db/legacy.py +++ b/src/calibre/db/legacy.py @@ -11,14 +11,10 @@ from collections.abc import MutableMapping from calibre import force_unicode, isbytestring from calibre.constants import preferred_encoding -from calibre.db import ( - _get_next_series_num_for_list, _get_series_values, get_data_as_dict, -) -from calibre.db.adding import ( - add_catalog, add_news, find_books_in_directory, import_book_directory, - import_book_directory_multiple, recursive_import, -) -from calibre.db.backend import DB, set_global_state as backend_set_global_state +from calibre.db import _get_next_series_num_for_list, _get_series_values, get_data_as_dict +from calibre.db.adding import add_catalog, add_news, find_books_in_directory, import_book_directory, import_book_directory_multiple, recursive_import +from calibre.db.backend import DB +from calibre.db.backend import set_global_state as backend_set_global_state from calibre.db.cache import Cache from calibre.db.categories import CATEGORY_SORTS from calibre.db.errors import NoSuchFormat diff --git a/src/calibre/db/listeners.py b/src/calibre/db/listeners.py index f8d2f4a151..b6e2fb2850 100644 --- a/src/calibre/db/listeners.py +++ b/src/calibre/db/listeners.py @@ -3,9 +3,9 @@ import weakref from contextlib import suppress +from enum import Enum, auto from queue import Queue from threading import Thread -from enum import Enum, auto class EventType(Enum): diff --git a/src/calibre/db/locking.py b/src/calibre/db/locking.py index 224e509cde..6b9d1fedf3 100644 --- a/src/calibre/db/locking.py +++ b/src/calibre/db/locking.py @@ -5,9 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import traceback, sys, os -from threading import Lock, Condition, current_thread +import os +import sys +import traceback from contextlib import contextmanager +from threading import Condition, Lock, current_thread @contextmanager diff --git a/src/calibre/db/notes/connect.py b/src/calibre/db/notes/connect.py index 6d984f9835..c0f0a68b72 100644 --- a/src/calibre/db/notes/connect.py +++ b/src/calibre/db/notes/connect.py @@ -1,17 +1,18 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2023, Kovid Goyal -import apsw import json import os import shutil import time -import xxhash +from collections import defaultdict from contextlib import suppress from itertools import count, repeat -from collections import defaultdict from typing import Optional +import apsw +import xxhash + from calibre import sanitize_file_name from calibre.constants import iswindows from calibre.db import FTSQueryError @@ -20,8 +21,8 @@ from calibre.utils.copy_files import WINDOWS_SLEEP_FOR_RETRY_TIME from calibre.utils.filenames import copyfile_using_links, make_long_path_useable from calibre.utils.icu import lower as icu_lower -from ..constants import NOTES_DB_NAME, NOTES_DIR_NAME from .schema_upgrade import SchemaUpgrade +from ..constants import NOTES_DB_NAME, NOTES_DIR_NAME if iswindows: from calibre_extensions import winutil diff --git a/src/calibre/db/notes/exim.py b/src/calibre/db/notes/exim.py index c55854b536..b5516ab774 100644 --- a/src/calibre/db/notes/exim.py +++ b/src/calibre/db/notes/exim.py @@ -3,9 +3,10 @@ import base64 import os +from urllib.parse import unquote, urlparse + from html5_parser import parse from lxml import html -from urllib.parse import unquote, urlparse from calibre import guess_extension, guess_type from calibre.db.constants import RESOURCE_URL_SCHEME diff --git a/src/calibre/db/restore.py b/src/calibre/db/restore.py index 1025697e4a..7ba72f8950 100644 --- a/src/calibre/db/restore.py +++ b/src/calibre/db/restore.py @@ -18,8 +18,8 @@ from threading import Thread from calibre import force_unicode, isbytestring from calibre.constants import filesystem_encoding, iswindows from calibre.db.backend import DB, DBPrefs -from calibre.db.constants import METADATA_FILE_NAME, TRASH_DIR_NAME, NOTES_DIR_NAME, NOTES_DB_NAME from calibre.db.cache import Cache +from calibre.db.constants import METADATA_FILE_NAME, NOTES_DB_NAME, NOTES_DIR_NAME, TRASH_DIR_NAME from calibre.ebooks.metadata.opf2 import OPF from calibre.ptempfile import TemporaryDirectory from calibre.utils.date import utcfromtimestamp diff --git a/src/calibre/db/schema_upgrades.py b/src/calibre/db/schema_upgrades.py index 4c395a8d3f..6e9a9ef318 100644 --- a/src/calibre/db/schema_upgrades.py +++ b/src/calibre/db/schema_upgrades.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import os from calibre import prints -from calibre.utils.date import isoformat, DEFAULT_DATE +from calibre.utils.date import DEFAULT_DATE, isoformat from polyglot.builtins import itervalues @@ -590,8 +590,7 @@ class SchemaUpgrade: def upgrade_version_19(self): recipes = self.db.get('SELECT id,title,script FROM feeds') if recipes: - from calibre.web.feeds.recipes import (custom_recipes, - custom_recipe_filename) + from calibre.web.feeds.recipes import custom_recipe_filename, custom_recipes bdir = os.path.dirname(custom_recipes.file_path) for id_, title, script in recipes: existing = frozenset(map(int, custom_recipes)) diff --git a/src/calibre/db/search.py b/src/calibre/db/search.py index 1153139791..ee3ed6edd0 100644 --- a/src/calibre/db/search.py +++ b/src/calibre/db/search.py @@ -6,19 +6,19 @@ __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' import operator -import regex import weakref from collections import OrderedDict, deque from datetime import timedelta from functools import partial +import regex + from calibre.constants import DEBUG, preferred_encoding from calibre.db.utils import force_to_bool from calibre.utils.config_base import prefs from calibre.utils.date import UNDEFINED_DATE, dt_as_local, now, parse_date -from calibre.utils.icu import ( - lower as icu_lower, primary_contains, primary_no_punc_contains, sort_key, -) +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import primary_contains, primary_no_punc_contains, sort_key from calibre.utils.localization import canonicalize_lang, lang_map from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import iteritems, string_or_bytes diff --git a/src/calibre/db/tests/filesystem.py b/src/calibre/db/tests/filesystem.py index cea9c5d795..2cae7f0c35 100644 --- a/src/calibre/db/tests/filesystem.py +++ b/src/calibre/db/tests/filesystem.py @@ -5,7 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import unittest, os, time +import os +import time +import unittest from io import BytesIO from calibre.constants import iswindows @@ -174,7 +176,7 @@ class FilesystemTest(BaseTest): # Test on folder with hardlinks from calibre.ptempfile import TemporaryDirectory - from calibre.utils.filenames import hardlink_file, WindowsAtomicFolderMove + from calibre.utils.filenames import WindowsAtomicFolderMove, hardlink_file raw = b'xxx' with TemporaryDirectory() as tdir1, TemporaryDirectory() as tdir2: a, b = os.path.join(tdir1, 'a'), os.path.join(tdir1, 'b') @@ -296,7 +298,7 @@ class FilesystemTest(BaseTest): self.assertLess(abs(at-bt), 2) def test_find_books_in_directory(self): - from calibre.db.adding import find_books_in_directory, compile_rule + from calibre.db.adding import compile_rule, find_books_in_directory def strip(files): return frozenset({os.path.basename(x) for x in files}) diff --git a/src/calibre/db/tests/fts.py b/src/calibre/db/tests/fts.py index 36983ed9ef..b607be21ba 100644 --- a/src/calibre/db/tests/fts.py +++ b/src/calibre/db/tests/fts.py @@ -6,6 +6,7 @@ import builtins import os import sys import tempfile + from apsw import Connection from calibre.constants import plugins @@ -71,7 +72,7 @@ class FTSTest(BaseTest): set_ui_language('en') def test_fts_tokenize(self): # {{{ - from calibre_extensions.sqlite_extension import set_ui_language, FTS5_TOKENIZE_QUERY, FTS5_TOKENIZE_DOCUMENT + from calibre_extensions.sqlite_extension import FTS5_TOKENIZE_DOCUMENT, FTS5_TOKENIZE_QUERY, set_ui_language def t(x, s, e, f=0): return {'text': x, 'start': s, 'end': e, 'flags': f} diff --git a/src/calibre/db/tests/fts_api.py b/src/calibre/db/tests/fts_api.py index e482c3ade9..42ae209537 100644 --- a/src/calibre/db/tests/fts_api.py +++ b/src/calibre/db/tests/fts_api.py @@ -8,8 +8,8 @@ import shutil import sys import time from io import BytesIO, StringIO -from zipfile import ZipFile from unittest.mock import patch +from zipfile import ZipFile from calibre.db.fts.text import html_to_text from calibre.db.tests.base import BaseTest @@ -25,8 +25,8 @@ class FTSAPITest(BaseTest): def setUp(self): super().setUp() - from calibre_extensions.sqlite_extension import set_ui_language from calibre.db.cache import Cache + from calibre_extensions.sqlite_extension import set_ui_language self.orig_sleep_time = Cache.fts_indexing_sleep_time Cache.fts_indexing_sleep_time = 0 set_ui_language('en') @@ -35,8 +35,8 @@ class FTSAPITest(BaseTest): def tearDown(self): [c.close() for c in self.libraries_to_close] super().tearDown() - from calibre_extensions.sqlite_extension import set_ui_language from calibre.db.cache import Cache + from calibre_extensions.sqlite_extension import set_ui_language Cache.fts_indexing_sleep_time = self.orig_sleep_time set_ui_language('en') diff --git a/src/calibre/db/tests/locking.py b/src/calibre/db/tests/locking.py index c568a7ac3e..56eaf7c52c 100644 --- a/src/calibre/db/tests/locking.py +++ b/src/calibre/db/tests/locking.py @@ -4,10 +4,12 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import time, random +import random +import time from threading import Thread + +from calibre.db.locking import LockingError, RWLockWrapper, SHLock from calibre.db.tests.base import BaseTest -from calibre.db.locking import SHLock, RWLockWrapper, LockingError def wait_for(period): diff --git a/src/calibre/db/tests/profiling.py b/src/calibre/db/tests/profiling.py index 122b89a516..3732c8ec47 100644 --- a/src/calibre/db/tests/profiling.py +++ b/src/calibre/db/tests/profiling.py @@ -4,7 +4,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import os, cProfile +import cProfile +import os from tempfile import gettempdir from calibre.db.legacy import LibraryDatabase diff --git a/src/calibre/db/tests/reading.py b/src/calibre/db/tests/reading.py index 3f3f6acfb8..411f05fe7c 100644 --- a/src/calibre/db/tests/reading.py +++ b/src/calibre/db/tests/reading.py @@ -5,13 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import datetime, os +import datetime +import os from io import BytesIO from time import time +from calibre.db.tests.base import BaseTest from calibre.utils.date import utc_tz from calibre.utils.localization import calibre_langcode_to_name -from calibre.db.tests.base import BaseTest from polyglot.builtins import iteritems, itervalues @@ -244,8 +245,8 @@ class ReadingTest(BaseTest): # }}} def test_serialize_metadata(self): # {{{ - from calibre.utils.serialize import json_dumps, json_loads, msgpack_dumps, msgpack_loads from calibre.library.field_metadata import fm_as_dict + from calibre.utils.serialize import json_dumps, json_loads, msgpack_dumps, msgpack_loads cache = self.init_cache(self.library_path) fm = cache.field_metadata for d, l in ((json_dumps, json_loads), (msgpack_dumps, msgpack_loads)): @@ -427,8 +428,8 @@ class ReadingTest(BaseTest): def test_get_formats(self): # {{{ 'Test reading ebook formats using the format() method' - from calibre.library.database2 import LibraryDatabase2 from calibre.db.cache import NoSuchFormat + from calibre.library.database2 import LibraryDatabase2 old = LibraryDatabase2(self.library_path) ids = old.all_ids() lf = {i:set(old.formats(i, index_is_id=True).split(',')) if old.formats( @@ -515,8 +516,8 @@ class ReadingTest(BaseTest): def test_datetime(self): # {{{ ' Test the reading of datetimes stored in the db ' + from calibre.db.tables import UNDEFINED_DATE, _c_speedup, c_parse from calibre.utils.date import parse_date - from calibre.db.tables import c_parse, UNDEFINED_DATE, _c_speedup # First test parsing of string to UTC time for raw in ('2013-07-22 15:18:29+05:30', ' 2013-07-22 15:18:29+00:00', '2013-07-22 15:18:29', '2003-09-21 23:30:00-06:00'): @@ -775,8 +776,8 @@ class ReadingTest(BaseTest): def test_find_identical_books(self): # {{{ ' Test find_identical_books ' - from calibre.ebooks.metadata.book.base import Metadata from calibre.db.utils import find_identical_books + from calibre.ebooks.metadata.book.base import Metadata # 'find_identical_books': [(,), (Metadata('unknown'),), (Metadata('xxxx'),)], cache = self.init_cache(self.library_path) cache.set_field('languages', {1: ('fra', 'deu')}) @@ -941,8 +942,7 @@ def evaluate(book, ctx): self.assertEqual(set(v.split(',')), {'Tag One', 'News', 'Tag Two'}) # test calling a python stored template from a GPM template - from calibre.utils.formatter_functions import ( - load_user_template_functions, unload_user_template_functions) + from calibre.utils.formatter_functions import load_user_template_functions, unload_user_template_functions load_user_template_functions('aaaaa', [['python_stored_template', "", diff --git a/src/calibre/db/utils.py b/src/calibre/db/utils.py index 6b29971301..1442253ebf 100644 --- a/src/calibre/db/utils.py +++ b/src/calibre/db/utils.py @@ -15,9 +15,7 @@ from locale import localeconv from threading import Lock from calibre import as_unicode, prints -from calibre.constants import ( - cache_dir, get_windows_number_formats, iswindows, preferred_encoding, -) +from calibre.constants import cache_dir, get_windows_number_formats, iswindows, preferred_encoding from calibre.utils.icu import lower as icu_lower from calibre.utils.localization import canonicalize_lang from polyglot.builtins import iteritems, itervalues, string_or_bytes diff --git a/src/calibre/db/view.py b/src/calibre/db/view.py index f42ab82ae7..8f28c6a9b6 100644 --- a/src/calibre/db/view.py +++ b/src/calibre/db/view.py @@ -5,13 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import weakref, operator, numbers, sys +import numbers +import operator +import sys +import weakref from functools import partial -from polyglot.builtins import iteritems, itervalues -from calibre.ebooks.metadata import title_sort -from calibre.utils.config_base import tweaks, prefs from calibre.db.write import uniq +from calibre.ebooks.metadata import title_sort +from calibre.utils.config_base import prefs, tweaks +from polyglot.builtins import iteritems, itervalues def sanitize_sort_field_name(field_metadata, field): diff --git a/src/calibre/db/write.py b/src/calibre/db/write.py index af5d1b9a14..61319fef4b 100644 --- a/src/calibre/db/write.py +++ b/src/calibre/db/write.py @@ -11,10 +11,9 @@ from functools import partial from calibre.constants import preferred_encoding from calibre.ebooks.metadata import author_to_author_sort, title_sort -from calibre.utils.date import ( - UNDEFINED_DATE, is_date_undefined, isoformat, parse_date, parse_only_date, -) -from calibre.utils.icu import lower as icu_lower, strcmp +from calibre.utils.date import UNDEFINED_DATE, is_date_undefined, isoformat, parse_date, parse_only_date +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import strcmp from calibre.utils.localization import canonicalize_lang from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/debug.py b/src/calibre/debug.py index f44c80e6dd..36310bfe28 100644 --- a/src/calibre/debug.py +++ b/src/calibre/debug.py @@ -7,11 +7,14 @@ __copyright__ = '2008, Kovid Goyal ' Embedded console for debugging. ''' -import sys, os, functools -from calibre.utils.config import OptionParser -from calibre.constants import iswindows +import functools +import os +import sys + from calibre import prints +from calibre.constants import iswindows from calibre.startup import get_debug_executable +from calibre.utils.config import OptionParser from polyglot.builtins import exec_path @@ -132,7 +135,9 @@ def debug_device_driver(): def add_simple_plugin(path_to_plugin): - import tempfile, zipfile, shutil + import shutil + import tempfile + import zipfile tdir = tempfile.mkdtemp() open(os.path.join(tdir, 'custom_plugin.py'), 'wb').write(open(path_to_plugin, 'rb').read()) @@ -152,8 +157,8 @@ def print_basic_debug_info(out=None): out = sys.stdout out = functools.partial(prints, file=out) import platform - from calibre.constants import (__appname__, get_version, isportable, ismacos, - isfrozen) + + from calibre.constants import __appname__, get_version, isfrozen, ismacos, isportable from calibre.utils.localization import set_translators out(__appname__, get_version(), 'Portable' if isportable else '', 'embedded-python:', isfrozen) diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index d1427d1ad7..be170ca627 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -5,7 +5,9 @@ __copyright__ = '2008, Kovid Goyal ' Device drivers. ''' -import sys, time, pprint +import pprint +import sys +import time from functools import partial DAY_MAP = dict(Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6) @@ -67,11 +69,12 @@ def debug(ioreg_to_tmp=False, buf=None, plugins=None, device plugins as the plugins parameter. ''' import textwrap + + from calibre import prints + from calibre.constants import debug, is_debugging, ismacos, iswindows from calibre.customize.ui import device_plugins, disabled_device_plugins from calibre.debug import print_basic_debug_info from calibre.devices.scanner import DeviceScanner - from calibre.constants import iswindows, ismacos, debug, is_debugging - from calibre import prints from polyglot.io import PolyglotStringIO oldo, olde = sys.stdout, sys.stderr diff --git a/src/calibre/devices/cli.py b/src/calibre/devices/cli.py index 1fb276d728..3a3fd2387b 100755 --- a/src/calibre/devices/cli.py +++ b/src/calibre/devices/cli.py @@ -9,12 +9,14 @@ Provides a command-line interface to ebook devices. For usage information run the script. """ -import sys, time, os +import os +import sys +import time from optparse import OptionParser -from calibre import __version__, __appname__, human_readable, fsync, prints -from calibre.devices.errors import ArgumentError, DeviceError, DeviceLocked +from calibre import __appname__, __version__, fsync, human_readable, prints from calibre.customize.ui import device_plugins +from calibre.devices.errors import ArgumentError, DeviceError, DeviceLocked from calibre.devices.scanner import DeviceScanner from calibre.utils.config import device_prefs from polyglot.io import PolyglotStringIO diff --git a/src/calibre/devices/cybook/driver.py b/src/calibre/devices/cybook/driver.py index c0e12261d2..61ba5c7018 100644 --- a/src/calibre/devices/cybook/driver.py +++ b/src/calibre/devices/cybook/driver.py @@ -9,11 +9,11 @@ Device driver for Bookeen's Cybook Gen 3 and Opus and Orizon import os import re +import calibre.devices.cybook.t2b as t2b +import calibre.devices.cybook.t4b as t4b from calibre import fsync from calibre.constants import isunix from calibre.devices.usbms.driver import USBMS -import calibre.devices.cybook.t2b as t2b -import calibre.devices.cybook.t4b as t4b class CYBOOK(USBMS): diff --git a/src/calibre/devices/cybook/t2b.py b/src/calibre/devices/cybook/t2b.py index 2aab959e2e..aa33eb7577 100644 --- a/src/calibre/devices/cybook/t2b.py +++ b/src/calibre/devices/cybook/t2b.py @@ -5,6 +5,7 @@ Write a t2b file to disk. ''' import io + from polyglot.builtins import int_to_byte DEFAULT_T2B_DATA = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x0f\xff\xff\xff\xf0\xff\x0f\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\xff\xff\xff\xf0\xff\x0f\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\xff\xf0\xff\xff\xff\xf0\xff\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\xff\xff\xff\xff\xff\xf0\xff\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\xff\xff\xfc\x00?\xf0\xff\x0f\xc3\x00?\xf0\xc0\xfe\x00?\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xf0<\x0f\xf0\xff\x0f\xc0,\x0f\xf0\x0e\xf0,\x0f\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\xff\xc3\xf0\xff\x0f\xc0\xff\x0f\xf0\xff\xf0\xff\xc7\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xc3\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xff\x00\x03\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xc3\xff\xff\xff\xff\xff\xff\xff\x0f\xff\xff\xf0\x1f\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc0\x00\x03\xff\xff\xff\xff\xff\xff\xff\x0b\xff\xff\xf0\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\xff\xff\xf3\xff\xc3\xf0\xff\x0f\xc3\xff\xc3\xf0\xff\xc3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\xff\xfc\xf0\xff\x03\xf0\xff\x0f\xc0\xff\x0f\xf0\xff\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x0f\x00\xf08\x03\xf0\xff\x0f\xc0,\x0f\xf0\xff\xf0\x1f\x03\xff\xff\xff\xff\xff\xff\xff\xff\x00\x0f\xfc\x00\xc3\xf0\xff\x0f\xc3\x00?\xf0\xff\xff\x00\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xfe\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xfc\x7f\xfe\x94\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x0f\xff\xfe\xa9@\xff\xff\xff\xff\xff\xff\xfc?\xfe\xa4\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xe9P\xff\xff\xff\xff\xff\xff\xfe/\xfe\xa8\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xf9T\xff\xff\xff\xff\xf0@\x00+\xfa\xa8?\xff\xff\xff\xff\xff\xff\xff\xfc\xbf\xff\xff\xf9T\xff\xff\xff\xff\xcb\xe4}*\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfc\xbf\xff\xff\xe9T\xff\xff\xff\xff\xc7\xe4\xfd\x1a\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfc\xaf\xea\xaa\xa6\xa4\xff@\x00\x0f\xc3\xe8\xfe\x1a\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4\x00\x7f\xfe\x90\x03\xe8\xfe\n\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4?\xff\xff\xa5C\xe8\xfe\x06\xaa\xaa?\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4?\xff\xff\xeaC\xe8\xbe\x06\xaa\xaa\x0f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4/\xff\xff\xea\x82\xe8j\x06\xaa\xaa\x0f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4/\xff\xff\xaa\x82\xe8*F\xaa\xaa\x8f\xff\xff\xff\xff\xff\xff\xff\xfcj\x95UZ\xa4+\xff\xfe\xaa\x82\xe8*\x86\xaa\xaa\x8f\xff\xff\x80\xff\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x86\xaa\xaa\x8f\xf0\x00T?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x8c\x03\xff\x95?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x80\xbf\xff\x95?\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8*\x81\xaa\xaa\x9b\xff\xff\x95\x0f\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8\x1a\x81\xaa\xaa\x9a\xff\xfe\x95\x0f\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xe8\n\x81\xaa\xaa\xa6\xbf\xfeUO\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xa8\n\x91j\xaa\xa5\xaa\xa9ZO\xff\xff\xff\xfcj\x95UV\xa4\x1a\xfa\xaa\xaa\x82\xa8\n\xa0j\xaa\xa5Z\x95ZO\xff\xff\xff\xfcj\x95UV\xa4*\xfa\xaa\xaa\x82\xa9\n\xa0j\xaa\xa5UUZC\xff\xff\xff\xfcj\x95UV\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa4UUZS\xff\xff\xff\xfcZ\x95UV\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa4UUZS\xff\xff\xff\xfcZ\x95UU\xa4*\xfa\xaa\xaa\x82\xaa\n\xa0j\xaa\xa8UUVS\xff\xff\xff\xfcZ\x95UU\xa4*\xea\xaa\xaa\x82\xaa\x06\xa0Z\xaa\xa8UUV\x93\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x81\xaa\x02\xa0\x1a\xaa\xa8UUV\x90\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa\x02\xa0\x1a\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa"\xa0\x1a\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa4\x16\xaa\xa8\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa8\x16\xa6\xa9\x15UU\x94\xff\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x80\xaa2\xa8\x16\xa6\xa9\x05UUT?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x84\xaa2\xa8\x16\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x88\xaa2\xa8\x06\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa1\xa8\xc5\xaa\xaa\x05UUU?\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa0\xa8E\xa9\xaa\x05UUU/\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa8\x05\xa9\xaaAUUU\x0f\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa8\x05\xa9\xaaAUUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa<\xa9\x05\xaa\xaaAUUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x1c\xaa\x01\xaa\xaa\x81UUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c\xaa\x01\xaa\xaa\x81UUUO\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c\xaa1j\xaa\x80UUUC\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0cj1jj\x90UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x0c*1jj\x90UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaaL*1jj\xa0UUUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f* j\xaa\xa0\x15UUS\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f*@j\xaa\xa0\x15UUP\xff\xff\xfcZ\x95UU\xa4*\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\xaa\xa1\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\x9a\xa0\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f*\x8cZ\x9a\xa0\x15UUT\xff\xff\xfcZ\x95UU\xa4j\xaa\xaa\xaa\x8c\xaa\x8f\x1a\x8cZ\x9a\xa4\x15UUT?\xff\xfcZ\x95UU\x94j\xaa\xaa\xaa\x8cj\x8f\n\x8cVj\xa4\x05UU\xa4?\xff\xfcVUUU\xa4j\xaa\xaa\xaa\x8cj\x8fJ\x8c\x16\xaa\xa8\xc5UZ\xa5?\xff\xfcUUUV\xa4j\xaa\xaa\xaa\x8cj\x8f\xca\x8f\x16\xaa\xa8\xc5V\xaa\xa5?\xff\xfcUj\xaa\xaa\xa4j\xaa\xaa\xaa\x8cj\x8f\xca\x8f\x1a\xaa\xa8\x05Z\xaaU?\xff\xfcV\xaa\xaa\xaa\xa5j\xaa\xaa\xaa\x8e*\x8f\xca\x83\x1a\xaa\xa4\x01eUU?\xff\xfcZ\xaa\xaa\xaa\xa5j\xaa\xaa\xaa\x8f*\x8f\xca\x83\x1a\xa5U\x01U\x00\x00\x0f\xff\xfcUUUUUZ\xaa\xaa\xaaO%\x8f\xc6\x93\x15\x00\x001@\x0f\xff\xff\xff\xfcP\x00\x00\x00\x15\x00\x00\x00\x00\x0f\x00\x07\xc0\x03\x00\xff\xff0\x1f\xff\xff\xff\xff\xfc\x00\xff\xff\xf8\x00?\xff\xff\xff\x0f?\xc7\xc3\xf7\x0f\xff\xff\xf1\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xf4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' # noqa diff --git a/src/calibre/devices/hanvon/driver.py b/src/calibre/devices/hanvon/driver.py index acb2977b05..e55b3fe80d 100644 --- a/src/calibre/devices/hanvon/driver.py +++ b/src/calibre/devices/hanvon/driver.py @@ -5,7 +5,8 @@ __docformat__ = 'restructuredtext en' ''' Device driver for Hanvon devices ''' -import re, os +import os +import re from calibre import fsync from calibre.devices.usbms.driver import USBMS diff --git a/src/calibre/devices/kindle/apnx.py b/src/calibre/devices/kindle/apnx.py index 2f80656f34..8dd285eb01 100644 --- a/src/calibre/devices/kindle/apnx.py +++ b/src/calibre/devices/kindle/apnx.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, John Schember , refactored: 2022, Vaso Peras-Likodric ' __docformat__ = 'restructuredtext en' -from typing import Optional, Dict +from typing import Dict, Optional ''' Generates and writes an APNX page mapping file. @@ -10,19 +10,18 @@ Generates and writes an APNX page mapping file. import struct -from calibre.ebooks.pdb.header import PdbHeaderReader -from calibre.ebooks.mobi.reader.headers import MetadataHeader -from calibre.utils.logging import default_log -from calibre import prints, fsync +from calibre import fsync, prints from calibre.constants import DEBUG -from polyglot.builtins import as_unicode, as_bytes - from calibre.devices.kindle.apnx_page_generator.generators.accurate_page_generator import AccuratePageGenerator -from calibre.devices.kindle.apnx_page_generator.generators.pagebreak_page_generator import PagebreakPageGenerator from calibre.devices.kindle.apnx_page_generator.generators.exact_page_generator import ExactPageGenerator from calibre.devices.kindle.apnx_page_generator.generators.fast_page_generator import FastPageGenerator +from calibre.devices.kindle.apnx_page_generator.generators.pagebreak_page_generator import PagebreakPageGenerator from calibre.devices.kindle.apnx_page_generator.i_page_generator import IPageGenerator from calibre.devices.kindle.apnx_page_generator.pages import Pages +from calibre.ebooks.mobi.reader.headers import MetadataHeader +from calibre.ebooks.pdb.header import PdbHeaderReader +from calibre.utils.logging import default_log +from polyglot.builtins import as_bytes, as_unicode class APNXBuilder: diff --git a/src/calibre/devices/kindle/apnx_page_generator/generators/pagebreak_page_generator.py b/src/calibre/devices/kindle/apnx_page_generator/generators/pagebreak_page_generator.py index f80b131556..f9a098f971 100644 --- a/src/calibre/devices/kindle/apnx_page_generator/generators/pagebreak_page_generator.py +++ b/src/calibre/devices/kindle/apnx_page_generator/generators/pagebreak_page_generator.py @@ -2,12 +2,12 @@ __license__ = 'GPL v3' __copyright__ = '2022, Vaso Peras-Likodric ' __docformat__ = 'restructuredtext en' +import re from typing import Optional from calibre.devices.kindle.apnx_page_generator.generators.fast_page_generator import FastPageGenerator from calibre.devices.kindle.apnx_page_generator.i_page_generator import IPageGenerator, mobi_html from calibre.devices.kindle.apnx_page_generator.pages import Pages -import re class PagebreakPageGenerator(IPageGenerator): diff --git a/src/calibre/devices/kindle/apnx_page_generator/i_page_generator.py b/src/calibre/devices/kindle/apnx_page_generator/i_page_generator.py index e815c904df..63349edbee 100644 --- a/src/calibre/devices/kindle/apnx_page_generator/i_page_generator.py +++ b/src/calibre/devices/kindle/apnx_page_generator/i_page_generator.py @@ -3,13 +3,13 @@ __copyright__ = '2022, Vaso Peras-Likodric ' __docformat__ = 'restructuredtext en' import struct -from abc import abstractmethod, ABCMeta +from abc import ABCMeta, abstractmethod from typing import Optional from calibre.devices.kindle.apnx_page_generator.pages import Pages +from calibre.ebooks.pdb.header import PdbHeaderReader from calibre.utils.logging import default_log from polyglot.builtins import as_bytes -from calibre.ebooks.pdb.header import PdbHeaderReader class IPageGenerator(metaclass=ABCMeta): diff --git a/src/calibre/devices/kindle/apnx_page_generator/page_group.py b/src/calibre/devices/kindle/apnx_page_generator/page_group.py index edcf384d3f..9eb8590476 100644 --- a/src/calibre/devices/kindle/apnx_page_generator/page_group.py +++ b/src/calibre/devices/kindle/apnx_page_generator/page_group.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2022, Vaso Peras-Likodric ' __docformat__ = 'restructuredtext en' -from typing import Union, List, Tuple +from typing import List, Tuple, Union from calibre.devices.kindle.apnx_page_generator.page_number_type import PageNumberTypes diff --git a/src/calibre/devices/kindle/apnx_page_generator/pages.py b/src/calibre/devices/kindle/apnx_page_generator/pages.py index 6edeeb875a..3588a46304 100644 --- a/src/calibre/devices/kindle/apnx_page_generator/pages.py +++ b/src/calibre/devices/kindle/apnx_page_generator/pages.py @@ -3,7 +3,7 @@ __copyright__ = '2022, Vaso Peras-Likodric ' __docformat__ = 'restructuredtext en' import itertools -from typing import Optional, List +from typing import List, Optional from calibre.devices.kindle.apnx_page_generator.page_group import PageGroup from calibre.devices.kindle.apnx_page_generator.page_number_type import PageNumberTypes diff --git a/src/calibre/devices/kindle/bookmark.py b/src/calibre/devices/kindle/bookmark.py index 6c2196bd53..b794c963e5 100644 --- a/src/calibre/devices/kindle/bookmark.py +++ b/src/calibre/devices/kindle/bookmark.py @@ -1,8 +1,8 @@ __license__ = 'GPL v3' __docformat__ = 'restructuredtext en' -import os import io +import os from struct import unpack diff --git a/src/calibre/devices/kindle/driver.py b/src/calibre/devices/kindle/driver.py index 93fa1bd0bf..21bce1ea12 100644 --- a/src/calibre/devices/kindle/driver.py +++ b/src/calibre/devices/kindle/driver.py @@ -8,14 +8,18 @@ from calibre.devices.kindle.apnx import APNXBuilder Device driver for Amazon's Kindle ''' -import os, re, json, hashlib, errno +import errno +import hashlib +import json +import os +import re +from calibre import fsync, prints, strftime from calibre.constants import DEBUG, filesystem_encoding -from calibre.utils.date import utcfromtimestamp from calibre.devices.interface import OpenPopupMessage from calibre.devices.kindle.bookmark import Bookmark from calibre.devices.usbms.driver import USBMS -from calibre import strftime, fsync, prints +from calibre.utils.date import utcfromtimestamp from polyglot.builtins import as_bytes, as_unicode ''' @@ -292,8 +296,8 @@ class KINDLE(USBMS): return ka_soup def add_annotation_to_library(self, db, db_id, annotation): - from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.BeautifulSoup import prettify + from calibre.ebooks.metadata import MetaInformation bm = annotation ignore_tags = {'Catalog', 'Clippings'} @@ -498,7 +502,7 @@ class KINDLE2(KINDLE): return os.path.join(self._main_prefix, 'system', 'thumbnails') def thumbpath_from_filepath(self, filepath): - from calibre.ebooks.metadata.kfx import (CONTAINER_MAGIC, read_book_key_kfx) + from calibre.ebooks.metadata.kfx import CONTAINER_MAGIC, read_book_key_kfx from calibre.ebooks.mobi.reader.headers import MetadataHeader from calibre.utils.logging import default_log thumb_dir = self.amazon_system_thumbnails_dir() diff --git a/src/calibre/devices/kobo/books.py b/src/calibre/devices/kobo/books.py index 9e450bc845..6fe5e24bba 100644 --- a/src/calibre/devices/kobo/books.py +++ b/src/calibre/devices/kobo/books.py @@ -2,17 +2,18 @@ __license__ = 'GPL v3' __copyright__ = '2010-2012, , Timothy Legge and David Forrester ' __docformat__ = 'restructuredtext en' -import os, time +import os +import time -from calibre.constants import preferred_encoding, DEBUG from calibre import isbytestring - -from calibre.ebooks.metadata.book.base import Metadata -from calibre.ebooks.metadata.book.formatter import SafeFormat -from calibre.devices.usbms.books import Book as Book_, CollectionsBookList -from calibre.utils.config_base import prefs +from calibre.constants import DEBUG, preferred_encoding +from calibre.devices.usbms.books import Book as Book_ +from calibre.devices.usbms.books import CollectionsBookList from calibre.devices.usbms.driver import debug_print from calibre.ebooks.metadata import author_to_author_sort +from calibre.ebooks.metadata.book.base import Metadata +from calibre.ebooks.metadata.book.formatter import SafeFormat +from calibre.utils.config_base import prefs class Book(Book_): diff --git a/src/calibre/devices/kobo/driver.py b/src/calibre/devices/kobo/driver.py index 0dff8de229..94f3001256 100644 --- a/src/calibre/devices/kobo/driver.py +++ b/src/calibre/devices/kobo/driver.py @@ -13,26 +13,25 @@ Extended to support Touch firmware 2.0.0 and later and newer devices by David Fo Additional maintenance performed by Peter Thomas ''' -import os, time, shutil, re - +import os +import re +import shutil +import time from contextlib import closing from datetime import datetime -from calibre import strftime -from calibre.utils.date import parse_date -from calibre.devices.usbms.books import BookList -from calibre.devices.usbms.books import CollectionsBookList -from calibre.devices.kobo.books import KTCollectionsBookList + +from calibre import fsync, prints, strftime +from calibre.constants import DEBUG +from calibre.devices.kobo.books import Book, ImageWrapper, KTCollectionsBookList +from calibre.devices.mime import mime_type_ext +from calibre.devices.usbms.books import BookList, CollectionsBookList +from calibre.devices.usbms.driver import USBMS, debug_print from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.utils import normalize_languages -from calibre.devices.kobo.books import Book -from calibre.devices.kobo.books import ImageWrapper -from calibre.devices.mime import mime_type_ext -from calibre.devices.usbms.driver import USBMS, debug_print -from calibre import prints, fsync from calibre.ptempfile import PersistentTemporaryFile, better_mktemp -from calibre.constants import DEBUG from calibre.utils.config_base import prefs +from calibre.utils.date import parse_date from polyglot.builtins import iteritems, itervalues, string_or_bytes EPUB_EXT = '.epub' @@ -1231,6 +1230,7 @@ class KOBO(USBMS): def generate_annotation_html(self, bookmark): import calendar + from calibre.ebooks.BeautifulSoup import BeautifulSoup # Returns
...
# last_read_location = bookmark.last_read_location @@ -2795,8 +2795,8 @@ class KOBOTOUCH(KOBO): dithered_covers=False, keep_cover_aspect=False, letterbox_fs_covers=False, png_covers=False, letterbox_color=DEFAULT_COVER_LETTERBOX_COLOR ): - from calibre.utils.imghdr import identify from calibre.utils.img import optimize_png + from calibre.utils.imghdr import identify debug_print("KoboTouch:_upload_cover - filename='%s' upload_grayscale='%s' dithered_covers='%s' "%(filename, upload_grayscale, dithered_covers)) if not metadata.cover: diff --git a/src/calibre/devices/kobo/kobotouch_config.py b/src/calibre/devices/kobo/kobotouch_config.py index a65eb5c815..878ad70e46 100644 --- a/src/calibre/devices/kobo/kobotouch_config.py +++ b/src/calibre/devices/kobo/kobotouch_config.py @@ -6,15 +6,14 @@ __docformat__ = 'restructuredtext en' import textwrap -from qt.core import (QWidget, QLabel, QGridLayout, QLineEdit, QVBoxLayout, QDialog, - QDialogButtonBox, QCheckBox, QPushButton) +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QLabel, QLineEdit, QPushButton, QVBoxLayout, QWidget -from calibre.gui2.device_drivers.tabbed_device_config import TabbedDeviceConfig, DeviceConfigTab, DeviceOptionsGroupBox from calibre.devices.usbms.driver import debug_print from calibre.gui2 import error_dialog -from calibre.gui2.widgets2 import ColorButton +from calibre.gui2.device_drivers.tabbed_device_config import DeviceConfigTab, DeviceOptionsGroupBox, TabbedDeviceConfig from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor +from calibre.gui2.widgets2 import ColorButton def wrap_msg(msg): @@ -808,9 +807,9 @@ class TemplateConfig(QWidget): # {{{ if __name__ == '__main__': - from calibre.gui2 import Application from calibre.devices.kobo.driver import KOBOTOUCH from calibre.devices.scanner import DeviceScanner + from calibre.gui2 import Application s = DeviceScanner() s.scan() app = Application([]) diff --git a/src/calibre/devices/misc.py b/src/calibre/devices/misc.py index 4cd63e2d1e..770cb39fc5 100644 --- a/src/calibre/devices/misc.py +++ b/src/calibre/devices/misc.py @@ -7,8 +7,8 @@ __docformat__ = 'restructuredtext en' import os -from calibre.devices.usbms.driver import USBMS from calibre import fsync +from calibre.devices.usbms.driver import USBMS class PALMPRE(USBMS): diff --git a/src/calibre/devices/mtp/defaults.py b/src/calibre/devices/mtp/defaults.py index 274e5ca4d7..db3c9400e0 100644 --- a/src/calibre/devices/mtp/defaults.py +++ b/src/calibre/devices/mtp/defaults.py @@ -5,12 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import traceback, re +import re +import traceback from calibre.constants import iswindows from polyglot.builtins import iteritems - supernote_settings = { 'calibre_file_paths': {'metadata':'Document/metadata.calibre', 'driveinfo':'Document/driveinfo.calibre'}, 'send_to': ['Document', 'Documents'], diff --git a/src/calibre/devices/mtp/filesystem_cache.py b/src/calibre/devices/mtp/filesystem_cache.py index 14b031bc6b..bdac9e14a0 100644 --- a/src/calibre/devices/mtp/filesystem_cache.py +++ b/src/calibre/devices/mtp/filesystem_cache.py @@ -5,16 +5,18 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import weakref, sys, json +import json +import sys +import weakref from collections import deque -from operator import attrgetter -from polyglot.builtins import itervalues from datetime import datetime +from operator import attrgetter -from calibre import human_readable, prints, force_unicode -from calibre.utils.date import local_tz, as_utc -from calibre.utils.icu import sort_key, lower +from calibre import force_unicode, human_readable, prints from calibre.ebooks import BOOK_EXTENSIONS +from calibre.utils.date import as_utc, local_tz +from calibre.utils.icu import lower, sort_key +from polyglot.builtins import itervalues bexts = frozenset(BOOK_EXTENSIONS) - {'mbp', 'tan', 'rar', 'zip', 'xml'} diff --git a/src/calibre/devices/mtp/test.py b/src/calibre/devices/mtp/test.py index 5e62e3ceb5..4fe57e6bd7 100644 --- a/src/calibre/devices/mtp/test.py +++ b/src/calibre/devices/mtp/test.py @@ -5,12 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import unittest, gc, io +import gc +import io +import unittest -from calibre.constants import iswindows, islinux -from calibre.utils.icu import lower +from calibre.constants import islinux, iswindows from calibre.devices.mtp.driver import MTP_DEVICE from calibre.devices.scanner import DeviceScanner +from calibre.utils.icu import lower class ProgressCallback: diff --git a/src/calibre/devices/mtp/unix/driver.py b/src/calibre/devices/mtp/unix/driver.py index 611879e1b7..d3ea7b7490 100644 --- a/src/calibre/devices/mtp/unix/driver.py +++ b/src/calibre/devices/mtp/unix/driver.py @@ -4,16 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import operator, traceback, pprint, sys, time -from threading import RLock +import operator +import pprint +import sys +import time +import traceback from collections import namedtuple from functools import partial +from threading import RLock -from calibre import prints, as_unicode, force_unicode +from calibre import as_unicode, force_unicode, prints from calibre.constants import islinux, ismacos +from calibre.devices.errors import BlacklistedDevice, DeviceError, OpenActionNeeded, OpenFailed +from calibre.devices.mtp.base import MTPDeviceBase, debug, synchronous from calibre.ptempfile import SpooledTemporaryFile -from calibre.devices.errors import OpenFailed, DeviceError, BlacklistedDevice, OpenActionNeeded -from calibre.devices.mtp.base import MTPDeviceBase, synchronous, debug MTPDevice = namedtuple('MTPDevice', 'busnum devnum vendor_id product_id ' 'bcd serial manufacturer product') diff --git a/src/calibre/devices/mtp/unix/sysfs.py b/src/calibre/devices/mtp/unix/sysfs.py index 95159069ea..12f3c1299c 100644 --- a/src/calibre/devices/mtp/unix/sysfs.py +++ b/src/calibre/devices/mtp/unix/sysfs.py @@ -5,7 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, glob +import glob +import os class MTPDetect: diff --git a/src/calibre/devices/mtp/unix/upstream/update.py b/src/calibre/devices/mtp/unix/upstream/update.py index c43d90cbc8..ae32f3e75d 100755 --- a/src/calibre/devices/mtp/unix/upstream/update.py +++ b/src/calibre/devices/mtp/unix/upstream/update.py @@ -5,7 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, subprocess +import os +import shutil +import subprocess base = os.path.dirname(os.path.abspath(__file__)) diff --git a/src/calibre/devices/mtp/windows/driver.py b/src/calibre/devices/mtp/windows/driver.py index a30fd0d17f..b83df4d653 100644 --- a/src/calibre/devices/mtp/windows/driver.py +++ b/src/calibre/devices/mtp/windows/driver.py @@ -5,16 +5,18 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import time, threading, traceback -from functools import wraps, partial -from polyglot.builtins import iteritems, itervalues +import threading +import time +import traceback +from functools import partial, wraps from itertools import chain -from calibre import as_unicode, prints, force_unicode -from calibre.constants import __appname__, numeric_version, isxp -from calibre.ptempfile import SpooledTemporaryFile -from calibre.devices.errors import OpenFailed, DeviceError, BlacklistedDevice +from calibre import as_unicode, force_unicode, prints +from calibre.constants import __appname__, isxp, numeric_version +from calibre.devices.errors import BlacklistedDevice, DeviceError, OpenFailed from calibre.devices.mtp.base import MTPDeviceBase, debug +from calibre.ptempfile import SpooledTemporaryFile +from polyglot.builtins import iteritems, itervalues null = object() diff --git a/src/calibre/devices/paladin/driver.py b/src/calibre/devices/paladin/driver.py index 1ddec6b72c..30f610a787 100644 --- a/src/calibre/devices/paladin/driver.py +++ b/src/calibre/devices/paladin/driver.py @@ -6,13 +6,15 @@ Device driver for the Paladin devices ''' -import os, time, sys +import os +import sys +import time from contextlib import closing -from calibre.devices.mime import mime_type_ext from calibre.devices.errors import DeviceError +from calibre.devices.mime import mime_type_ext +from calibre.devices.usbms.books import BookList, CollectionsBookList from calibre.devices.usbms.driver import USBMS, debug_print -from calibre.devices.usbms.books import CollectionsBookList, BookList DBPATH = 'paladin/database/books.db' @@ -306,8 +308,8 @@ class PALADIN(USBMS): def update_device_books(self, connection, booklist, source_id, plugboard, dbpath): - from calibre.ebooks.metadata.meta import path_to_ext from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string + from calibre.ebooks.metadata.meta import path_to_ext opts = self.settings() db_books = self.read_device_books(connection, source_id, dbpath) diff --git a/src/calibre/devices/prs505/driver.py b/src/calibre/devices/prs505/driver.py index 8ae6ee8922..dffda59e58 100644 --- a/src/calibre/devices/prs505/driver.py +++ b/src/calibre/devices/prs505/driver.py @@ -6,14 +6,14 @@ __docformat__ = 'restructuredtext en' Device driver for the SONY devices ''' -import os, time, re +import os +import re +import time -from calibre import fsync -from calibre.devices.usbms.driver import USBMS, debug_print -from calibre.devices.prs505 import MEDIA_XML, MEDIA_EXT, CACHE_XML, CACHE_EXT, \ - MEDIA_THUMBNAIL, CACHE_THUMBNAIL -from calibre import __appname__, prints +from calibre import __appname__, fsync, prints +from calibre.devices.prs505 import CACHE_EXT, CACHE_THUMBNAIL, CACHE_XML, MEDIA_EXT, MEDIA_THUMBNAIL, MEDIA_XML from calibre.devices.usbms.books import CollectionsBookList +from calibre.devices.usbms.driver import USBMS, debug_print class PRS505(USBMS): diff --git a/src/calibre/devices/prs505/sony_cache.py b/src/calibre/devices/prs505/sony_cache.py index c40de0dc46..71462e3b2a 100644 --- a/src/calibre/devices/prs505/sony_cache.py +++ b/src/calibre/devices/prs505/sony_cache.py @@ -5,16 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, time +import os +import time from datetime import date -from calibre import prints, guess_type, isbytestring, fsync +from calibre import fsync, guess_type, isbytestring, prints +from calibre.constants import DEBUG, preferred_encoding from calibre.devices.errors import DeviceError from calibre.devices.usbms.driver import debug_print -from calibre.constants import DEBUG, preferred_encoding from calibre.ebooks.chardet import xml_to_unicode -from calibre.ebooks.metadata import authors_to_string, title_sort, \ - authors_to_sort_string +from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string, title_sort from polyglot.binary import from_base64_bytes ''' diff --git a/src/calibre/devices/prst1/driver.py b/src/calibre/devices/prst1/driver.py index 0c74864763..6a30657da3 100644 --- a/src/calibre/devices/prst1/driver.py +++ b/src/calibre/devices/prst1/driver.py @@ -9,19 +9,20 @@ __docformat__ = 'restructuredtext en' Device driver for the SONY T1 devices ''' -import os, time, re +import os +import re +import time from contextlib import closing from datetime import date from calibre import fsync -from calibre.devices.mime import mime_type_ext -from calibre.devices.errors import DeviceError -from calibre.devices.usbms.driver import USBMS, debug_print -from calibre.devices.usbms.device import USBDevice -from calibre.devices.usbms.books import CollectionsBookList -from calibre.devices.usbms.books import BookList -from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string from calibre.constants import islinux +from calibre.devices.errors import DeviceError +from calibre.devices.mime import mime_type_ext +from calibre.devices.usbms.books import BookList, CollectionsBookList +from calibre.devices.usbms.device import USBDevice +from calibre.devices.usbms.driver import USBMS, debug_print +from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string from polyglot.builtins import long_type DBPATH = 'Sony_Reader/database/books.db' diff --git a/src/calibre/devices/scanner.py b/src/calibre/devices/scanner.py index b8f340a893..3191b69052 100644 --- a/src/calibre/devices/scanner.py +++ b/src/calibre/devices/scanner.py @@ -5,13 +5,14 @@ Device scanner that fetches list of devices on system ina platform dependent manner. ''' -import sys, os, time +import os +import sys +import time from collections import namedtuple from threading import Lock -from calibre import prints, as_unicode -from calibre.constants import (iswindows, ismacos, islinux, isfreebsd, - isnetbsd) +from calibre import as_unicode, prints +from calibre.constants import isfreebsd, islinux, ismacos, isnetbsd, iswindows osx_scanner = linux_scanner = freebsd_scanner = netbsd_scanner = None @@ -79,6 +80,7 @@ class LibUSBScanner: def check_for_mem_leak(self): import gc + from calibre.utils.mem import memory memory() for num in (1, 10, 100): @@ -199,8 +201,9 @@ class DeviceScanner: def test_for_mem_leak(): - from calibre.utils.mem import memory, gc_histogram, diff_hists import gc + + from calibre.utils.mem import diff_hists, gc_histogram, memory gc.disable() scanner = DeviceScanner() scanner.scan() diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index 170ddb896d..f512914853 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -23,10 +23,7 @@ from threading import Thread from calibre import prints from calibre.constants import DEBUG, cache_dir, numeric_version -from calibre.devices.errors import ( - ControlError, InitialConnectionError, OpenFailed, OpenFeedback, PacketError, - TimeoutError, UserFeedback -) +from calibre.devices.errors import ControlError, InitialConnectionError, OpenFailed, OpenFeedback, PacketError, TimeoutError, UserFeedback from calibre.devices.interface import DevicePlugin, currently_connected_device from calibre.devices.usbms.books import Book, CollectionsBookList from calibre.devices.usbms.deviceconfig import DeviceConfig @@ -39,11 +36,12 @@ from calibre.ebooks.metadata.book.json_codec import JsonCodec from calibre.library import current_library_name from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config_base import tweaks -from calibre.utils.filenames import ascii_filename as sanitize, shorten_components_to +from calibre.utils.filenames import ascii_filename as sanitize +from calibre.utils.filenames import shorten_components_to from calibre.utils.ipc import eintr_retry_call -from calibre.utils.mdns import ( - get_all_ips, publish as publish_zeroconf, unpublish as unpublish_zeroconf -) +from calibre.utils.mdns import get_all_ips +from calibre.utils.mdns import publish as publish_zeroconf +from calibre.utils.mdns import unpublish as unpublish_zeroconf from calibre.utils.socket_inheritance import set_socket_inherit from polyglot import queue from polyglot.builtins import as_bytes, iteritems, itervalues diff --git a/src/calibre/devices/usbms/books.py b/src/calibre/devices/usbms/books.py index 173475f8ee..4092d7d991 100644 --- a/src/calibre/devices/usbms/books.py +++ b/src/calibre/devices/usbms/books.py @@ -2,18 +2,21 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -import os, re, time, sys +import os +import re +import sys +import time from functools import cmp_to_key +from calibre import force_unicode, isbytestring +from calibre.constants import preferred_encoding +from calibre.devices.interface import BookList as _BookList +from calibre.devices.mime import mime_type_ext from calibre.ebooks.metadata import title_sort from calibre.ebooks.metadata.book.base import Metadata -from calibre.devices.mime import mime_type_ext -from calibre.devices.interface import BookList as _BookList -from calibre.constants import preferred_encoding -from calibre import isbytestring, force_unicode from calibre.utils.config_base import tweaks from calibre.utils.icu import sort_key -from polyglot.builtins import string_or_bytes, iteritems, itervalues, cmp +from polyglot.builtins import cmp, iteritems, itervalues, string_or_bytes def none_cmp(xx, yy): diff --git a/src/calibre/devices/usbms/cli.py b/src/calibre/devices/usbms/cli.py index 6ad4ce6592..d1d1571167 100644 --- a/src/calibre/devices/usbms/cli.py +++ b/src/calibre/devices/usbms/cli.py @@ -2,7 +2,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -import os, shutil, time +import os +import shutil +import time from calibre import fsync from calibre.devices.errors import PathError diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index c398aaad8c..db09fbd8b3 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -8,15 +8,17 @@ driver. It is intended to be subclassed with the relevant parts implemented for a particular device. ''' -import os, time, json, shutil +import json +import os +import shutil +import time from itertools import cycle -from calibre.constants import numeric_version, ismacos -from calibre import prints, isbytestring, fsync -from calibre.constants import filesystem_encoding, is_debugging +from calibre import fsync, isbytestring, prints +from calibre.constants import filesystem_encoding, is_debugging, ismacos, numeric_version +from calibre.devices.usbms.books import Book, BookList from calibre.devices.usbms.cli import CLI from calibre.devices.usbms.device import Device -from calibre.devices.usbms.books import BookList, Book from calibre.ebooks.metadata.book.json_codec import JsonCodec from polyglot.builtins import itervalues, string_or_bytes @@ -98,8 +100,9 @@ class USBMS(CLI, Device): SCAN_FROM_ROOT = False def _update_driveinfo_record(self, dinfo, prefix, location_code, name=None): - from calibre.utils.date import now, isoformat import uuid + + from calibre.utils.date import isoformat, now if not isinstance(dinfo, dict): dinfo = {} if dinfo.get('device_store_uuid', None) is None: @@ -537,8 +540,8 @@ class USBMS(CLI, Device): @classmethod def metadata_from_formats(cls, fmts): - from calibre.ebooks.metadata.meta import metadata_from_formats from calibre.customize.ui import quick_metadata + from calibre.ebooks.metadata.meta import metadata_from_formats with quick_metadata: return metadata_from_formats(fmts, force_read_metadata=True, pattern=cls.build_template_regexp()) diff --git a/src/calibre/devices/usbms/hal.py b/src/calibre/devices/usbms/hal.py index 1478f3b904..898206add1 100644 --- a/src/calibre/devices/usbms/hal.py +++ b/src/calibre/devices/usbms/hal.py @@ -2,10 +2,10 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal import time -from jeepney import ( - DBusAddress, DBusErrorResponse, MessageType, Properties, new_method_call -) + +from jeepney import DBusAddress, DBusErrorResponse, MessageType, Properties, new_method_call from jeepney.io.blocking import open_dbus_connection + from calibre.constants import DEBUG diff --git a/src/calibre/devices/utils.py b/src/calibre/devices/utils.py index 77f31cfa8b..071c3be9b6 100644 --- a/src/calibre/devices/utils.py +++ b/src/calibre/devices/utils.py @@ -5,10 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, time, re +import os +import re +import time from functools import partial -from calibre.devices.errors import DeviceError, WrongDestinationError, FreeSpaceError +from calibre.devices.errors import DeviceError, FreeSpaceError, WrongDestinationError def sanity_check(on_card, files, card_prefixes, free_space): @@ -72,7 +74,7 @@ def create_upload_path(mdata, fname, template, sanitize, filename_callback=lambda x, y:x, sanitize_path_components=lambda x: x ): - from calibre.library.save_to_disk import get_components, config + from calibre.library.save_to_disk import config, get_components from calibre.utils.filenames import shorten_components_to special_tag = None diff --git a/src/calibre/devices/winusb.py b/src/calibre/devices/winusb.py index ecb16d3097..9e453bf3dd 100644 --- a/src/calibre/devices/winusb.py +++ b/src/calibre/devices/winusb.py @@ -2,19 +2,39 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, string, re, errno -from collections import namedtuple, defaultdict -from operator import itemgetter +import errno +import os +import re +import string +from collections import defaultdict, namedtuple from ctypes import ( - Structure, POINTER, c_ubyte, windll, byref, c_void_p, WINFUNCTYPE, c_uint, - WinError, get_last_error, sizeof, c_wchar, create_string_buffer, cast, - memset, wstring_at, addressof, create_unicode_buffer, string_at, c_uint64 as QWORD + POINTER, + WINFUNCTYPE, + Structure, + WinError, + addressof, + byref, + c_ubyte, + c_uint, + c_void_p, + c_wchar, + cast, + create_string_buffer, + create_unicode_buffer, + get_last_error, + memset, + sizeof, + string_at, + windll, + wstring_at, ) -from ctypes.wintypes import DWORD, WORD, ULONG, LPCWSTR, HWND, BOOL, LPWSTR, UINT, BYTE, HANDLE, USHORT -from pprint import pprint, pformat -from polyglot.builtins import iteritems, itervalues +from ctypes import c_uint64 as QWORD +from ctypes.wintypes import BOOL, BYTE, DWORD, HANDLE, HWND, LPCWSTR, LPWSTR, UINT, ULONG, USHORT, WORD +from operator import itemgetter +from pprint import pformat, pprint -from calibre import prints, as_unicode +from calibre import as_unicode, prints +from polyglot.builtins import iteritems, itervalues try: import winreg diff --git a/src/calibre/ebooks/BeautifulSoup.py b/src/calibre/ebooks/BeautifulSoup.py index c4f7e1a24d..8f9d951f73 100644 --- a/src/calibre/ebooks/BeautifulSoup.py +++ b/src/calibre/ebooks/BeautifulSoup.py @@ -3,14 +3,11 @@ import bs4 -from bs4 import ( # noqa - CData, Comment, Declaration, NavigableString, ProcessingInstruction, - SoupStrainer, Tag, __version__ -) +from bs4 import CData, Comment, Declaration, NavigableString, ProcessingInstruction, SoupStrainer, Tag, __version__ # noqa def parse_html(markup): - from calibre.ebooks.chardet import strip_encoding_declarations, xml_to_unicode, substitute_entites + from calibre.ebooks.chardet import strip_encoding_declarations, substitute_entites, xml_to_unicode from calibre.utils.cleantext import clean_xml_chars if isinstance(markup, str): markup = strip_encoding_declarations(markup) diff --git a/src/calibre/ebooks/chardet.py b/src/calibre/ebooks/chardet.py index 01bc822dda..52f4824528 100644 --- a/src/calibre/ebooks/chardet.py +++ b/src/calibre/ebooks/chardet.py @@ -5,7 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, codecs, sys +import codecs +import re +import sys _encoding_pats = ( # XML declaration diff --git a/src/calibre/ebooks/chm/metadata.py b/src/calibre/ebooks/chm/metadata.py index 502a5a0f96..18736d2ecc 100644 --- a/src/calibre/ebooks/chm/metadata.py +++ b/src/calibre/ebooks/chm/metadata.py @@ -5,14 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, codecs +import codecs +import re +from calibre import force_unicode from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.ebooks.chardet import xml_to_unicode -from calibre.ebooks.metadata import string_to_authors, MetaInformation -from calibre.utils.logging import default_log +from calibre.ebooks.metadata import MetaInformation, string_to_authors from calibre.ptempfile import TemporaryFile -from calibre import force_unicode +from calibre.utils.logging import default_log from polyglot.builtins import iterkeys @@ -124,8 +125,9 @@ def _get_cover(soup, rdr): except: ans = None if ans is not None: - from PIL import Image import io + + from PIL import Image buf = io.BytesIO() try: Image.open(io.BytesIO(ans)).convert('RGB').save(buf, 'JPEG') diff --git a/src/calibre/ebooks/chm/reader.py b/src/calibre/ebooks/chm/reader.py index 7da8e4efe6..9bdd1a1c99 100644 --- a/src/calibre/ebooks/chm/reader.py +++ b/src/calibre/ebooks/chm/reader.py @@ -7,6 +7,7 @@ import codecs import os import re import struct + from chm.chm import CHMFile, chmlib from calibre import guess_type as guess_mimetype diff --git a/src/calibre/ebooks/comic/input.py b/src/calibre/ebooks/comic/input.py index 87c7832f05..76951d0883 100644 --- a/src/calibre/ebooks/comic/input.py +++ b/src/calibre/ebooks/comic/input.py @@ -114,8 +114,8 @@ class PageProcessor(list): # {{{ def render(self): from qt.core import QImage - from calibre.utils.img import crop_image, image_from_data, scale_image from calibre.utils.filenames import make_long_path_useable + from calibre.utils.img import crop_image, image_from_data, scale_image with open(make_long_path_useable(self.path_to_page), 'rb') as f: img = image_from_data(f.read()) width, height = img.width(), img.height() @@ -140,9 +140,15 @@ class PageProcessor(list): # {{{ from qt.core import QImage from calibre.utils.img import ( - add_borders_to_image, despeckle_image, gaussian_sharpen_image, - image_to_data, normalize_image, quantize_image, remove_borders_from_image, - resize_image, rotate_image, + add_borders_to_image, + despeckle_image, + gaussian_sharpen_image, + image_to_data, + normalize_image, + quantize_image, + remove_borders_from_image, + resize_image, + rotate_image, ) for i, img in enumerate(self.pages): if self.rotate: diff --git a/src/calibre/ebooks/compression/tcr.py b/src/calibre/ebooks/compression/tcr.py index aa72bec8a9..76e63e958e 100644 --- a/src/calibre/ebooks/compression/tcr.py +++ b/src/calibre/ebooks/compression/tcr.py @@ -3,6 +3,7 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' import re + from polyglot.builtins import int_to_byte diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index b7c5cdfd7b..3a9d18ed60 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -6,16 +6,18 @@ __docformat__ = 'restructuredtext en' Command line interface to conversion sub-system ''' -import sys, os, numbers -from optparse import OptionGroup, Option +import numbers +import os +import sys from collections import OrderedDict +from optparse import Option, OptionGroup -from calibre.utils.config import OptionParser -from calibre.utils.logging import Log -from calibre.customize.conversion import OptionRecommendation from calibre import patheq +from calibre.customize.conversion import OptionRecommendation from calibre.ebooks.conversion import ConversionUserFeedBack +from calibre.utils.config import OptionParser from calibre.utils.localization import localize_user_manual_link +from calibre.utils.logging import Log from polyglot.builtins import iteritems USAGE = '%prog ' + _('''\ @@ -297,7 +299,7 @@ class ProgressBar: def create_option_parser(args, log): if '--version' in args: - from calibre.constants import __appname__, __version__, __author__ + from calibre.constants import __appname__, __author__, __version__ log(os.path.basename(args[0]), '('+__appname__, __version__+')') log('Created by:', __author__) raise SystemExit(0) @@ -347,7 +349,8 @@ def escape_sr_pattern(exp): def read_sr_patterns(path, log=None): - import json, re + import json + import re pats = [] with open(path, 'rb') as f: lines = f.read().decode('utf-8').splitlines() diff --git a/src/calibre/ebooks/conversion/config.py b/src/calibre/ebooks/conversion/config.py index 6ce9ad52a5..0fff29dea5 100644 --- a/src/calibre/ebooks/conversion/config.py +++ b/src/calibre/ebooks/conversion/config.py @@ -5,14 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, ast, json +import ast +import json +import os -from calibre.utils.config import config_dir, prefs, tweaks -from calibre.utils.lock import ExclusiveFile from calibre import sanitize_file_name from calibre.customize.conversion import OptionRecommendation from calibre.customize.ui import available_output_formats - +from calibre.utils.config import config_dir, prefs, tweaks +from calibre.utils.lock import ExclusiveFile config_dir = os.path.join(config_dir, 'conversion') diff --git a/src/calibre/ebooks/conversion/plugins/azw4_input.py b/src/calibre/ebooks/conversion/plugins/azw4_input.py index 0658b01d10..95a1db72d8 100644 --- a/src/calibre/ebooks/conversion/plugins/azw4_input.py +++ b/src/calibre/ebooks/conversion/plugins/azw4_input.py @@ -17,8 +17,8 @@ class AZW4Input(InputFormatPlugin): def convert(self, stream, options, file_ext, log, accelerators): - from calibre.ebooks.pdb.header import PdbHeaderReader from calibre.ebooks.azw4.reader import Reader + from calibre.ebooks.pdb.header import PdbHeaderReader header = PdbHeaderReader(stream) reader = Reader(header, stream, log, options) diff --git a/src/calibre/ebooks/conversion/plugins/chm_input.py b/src/calibre/ebooks/conversion/plugins/chm_input.py index ce42ebcaa6..4fc30bf8de 100644 --- a/src/calibre/ebooks/conversion/plugins/chm_input.py +++ b/src/calibre/ebooks/conversion/plugins/chm_input.py @@ -5,9 +5,9 @@ __copyright__ = '2008, Kovid Goyal ,' \ import os +from calibre.constants import filesystem_encoding from calibre.customize.conversion import InputFormatPlugin from calibre.ptempfile import TemporaryDirectory -from calibre.constants import filesystem_encoding from polyglot.builtins import as_bytes @@ -29,8 +29,8 @@ class CHMInput(InputFormatPlugin): return rdr.hhc_path def convert(self, stream, options, file_ext, log, accelerators): - from calibre.ebooks.chm.metadata import get_metadata_from_reader from calibre.customize.ui import plugin_for_input_format + from calibre.ebooks.chm.metadata import get_metadata_from_reader self.opts = options log.debug('Processing CHM...') @@ -112,9 +112,10 @@ class CHMInput(InputFormatPlugin): def _create_html_root(self, hhcpath, log, encoding): from lxml import html - from polyglot.urllib import unquote as _unquote - from calibre.ebooks.oeb.base import urlquote + from calibre.ebooks.chardet import xml_to_unicode + from calibre.ebooks.oeb.base import urlquote + from polyglot.urllib import unquote as _unquote try: hhcdata = self._read_file(hhcpath) except FileNotFoundError: @@ -170,7 +171,7 @@ class CHMInput(InputFormatPlugin): with open(htmlpath, 'wb') as f: if toc.count() > 1: - from lxml.html.builder import HTML, BODY, DIV, A + from lxml.html.builder import BODY, DIV, HTML, A path0 = toc[0].href path0 = unquote_path(path0)[0] subpath = os.path.dirname(path0) diff --git a/src/calibre/ebooks/conversion/plugins/docx_output.py b/src/calibre/ebooks/conversion/plugins/docx_output.py index 7ed0ccff6d..0cf5ddcbb0 100644 --- a/src/calibre/ebooks/conversion/plugins/docx_output.py +++ b/src/calibre/ebooks/conversion/plugins/docx_output.py @@ -4,7 +4,7 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from calibre.customize.conversion import OutputFormatPlugin, OptionRecommendation +from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin PAGE_SIZES = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'legal', 'letter'] @@ -72,10 +72,12 @@ class DOCXOutput(OutputFormatPlugin): } def convert_metadata(self, oeb): - from lxml import etree - from calibre.ebooks.oeb.base import OPF, OPF2_NS - from calibre.ebooks.metadata.opf2 import OPF as ReadOPF from io import BytesIO + + from lxml import etree + + from calibre.ebooks.metadata.opf2 import OPF as ReadOPF + from calibre.ebooks.oeb.base import OPF, OPF2_NS package = etree.Element(OPF('package'), attrib={'version': '2.0'}, nsmap={None: OPF2_NS}) oeb.metadata.to_opf2(package) self.mi = ReadOPF(BytesIO(etree.tostring(package, encoding='utf-8')), populate_spine=False, try_to_guess_cover=False).to_book_metadata() diff --git a/src/calibre/ebooks/conversion/plugins/epub_input.py b/src/calibre/ebooks/conversion/plugins/epub_input.py index cace939d0e..f919e64e34 100644 --- a/src/calibre/ebooks/conversion/plugins/epub_input.py +++ b/src/calibre/ebooks/conversion/plugins/epub_input.py @@ -2,7 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re, posixpath +import os +import posixpath +import re from itertools import cycle from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation @@ -38,8 +40,10 @@ class EPUBInput(InputFormatPlugin): recommendations = {('page_breaks_before', '/', OptionRecommendation.MED)} def process_encryption(self, encfile, opf, log): + import hashlib + import uuid + from lxml import etree - import uuid, hashlib idpf_key = opf.raw_unique_identifier if idpf_key: idpf_key = re.sub('[\u0020\u0009\u000d\u000a]', '', idpf_key) @@ -148,8 +152,8 @@ class EPUBInput(InputFormatPlugin): means, at most one entry with type="cover" that points to a raster cover and at most one entry with type="titlepage" that points to an HTML titlepage. ''' - from calibre.utils.localization import __ from calibre.ebooks.oeb.base import OPF + from calibre.utils.localization import __ removed = None from lxml import etree guide_cover, guide_elem = None, None @@ -253,10 +257,10 @@ class EPUBInput(InputFormatPlugin): traceback.print_exc() def convert(self, stream, options, file_ext, log, accelerators): - from calibre.utils.zipfile import ZipFile from calibre import walk from calibre.ebooks import DRMError from calibre.ebooks.metadata.opf2 import OPF + from calibre.utils.zipfile import ZipFile try: zf = ZipFile(stream) zf.extractall(os.getcwd()) @@ -350,13 +354,15 @@ class EPUBInput(InputFormatPlugin): return os.path.abspath('content.opf') def convert_epub3_nav(self, nav_path, opf, log, opts): + from tempfile import NamedTemporaryFile + from lxml import etree + from calibre.ebooks.chardet import xml_to_unicode + from calibre.ebooks.oeb.base import EPUB_NS, NCX, NCX_MIME, XHTML, serialize, urlnormalize, urlunquote from calibre.ebooks.oeb.polish.parsing import parse - from calibre.ebooks.oeb.base import EPUB_NS, XHTML, NCX_MIME, NCX, urlnormalize, urlunquote, serialize from calibre.ebooks.oeb.polish.toc import first_child from calibre.utils.xml_parse import safe_xml_fromstring - from tempfile import NamedTemporaryFile with open(nav_path, 'rb') as f: raw = f.read() raw = xml_to_unicode(raw, strip_encoding_pats=True, assume_utf8=True)[0] diff --git a/src/calibre/ebooks/conversion/plugins/epub_output.py b/src/calibre/ebooks/conversion/plugins/epub_output.py index a6ed8e0b51..5eaa9f26dc 100644 --- a/src/calibre/ebooks/conversion/plugins/epub_output.py +++ b/src/calibre/ebooks/conversion/plugins/epub_output.py @@ -5,12 +5,13 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, re +import os +import re +import shutil -from calibre.customize.conversion import (OutputFormatPlugin, - OptionRecommendation) -from calibre.ptempfile import TemporaryDirectory from calibre import CurrentDir +from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin +from calibre.ptempfile import TemporaryDirectory from polyglot.builtins import as_bytes block_level_tags = ( @@ -157,7 +158,7 @@ class EPUBOutput(OutputFormatPlugin): def upshift_markup(self): # {{{ 'Upgrade markup to comply with XHTML 1.1 where possible' - from calibre.ebooks.oeb.base import XPath, XML + from calibre.ebooks.oeb.base import XML, XPath for x in self.oeb.spine: root = x.data if (not root.get(XML('lang'))) and (root.get('lang')): @@ -394,7 +395,7 @@ class EPUBOutput(OutputFormatPlugin): Perform various markup transforms to get the output to render correctly in the quirky ADE. ''' - from calibre.ebooks.oeb.base import XPath, XHTML, barename, urlunquote + from calibre.ebooks.oeb.base import XHTML, XPath, barename, urlunquote stylesheet = self.oeb.manifest.main_stylesheet # ADE cries big wet tears when it encounters an invalid fragment @@ -534,7 +535,7 @@ class EPUBOutput(OutputFormatPlugin): ''' Perform toc link transforms to alleviate slow loading. ''' - from calibre.ebooks.oeb.base import urldefrag, XPath + from calibre.ebooks.oeb.base import XPath, urldefrag from calibre.ebooks.oeb.polish.toc import item_at_top def frag_is_at_top(root, frag): diff --git a/src/calibre/ebooks/conversion/plugins/fb2_input.py b/src/calibre/ebooks/conversion/plugins/fb2_input.py index 017137b65c..e192c58071 100644 --- a/src/calibre/ebooks/conversion/plugins/fb2_input.py +++ b/src/calibre/ebooks/conversion/plugins/fb2_input.py @@ -71,8 +71,9 @@ class FB2Input(InputFormatPlugin): css += etree.tostring(s, encoding='unicode', method='text', with_tail=False) + '\n\n' if css: - import css_parser import logging + + import css_parser parser = css_parser.CSSParser(fetcher=None, log=logging.getLogger('calibre.css')) diff --git a/src/calibre/ebooks/conversion/plugins/fb2_output.py b/src/calibre/ebooks/conversion/plugins/fb2_output.py index f4e052ba67..14ae59f1f3 100644 --- a/src/calibre/ebooks/conversion/plugins/fb2_output.py +++ b/src/calibre/ebooks/conversion/plugins/fb2_output.py @@ -4,7 +4,7 @@ __docformat__ = 'restructuredtext en' import os -from calibre.customize.conversion import OutputFormatPlugin, OptionRecommendation +from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin class FB2Output(OutputFormatPlugin): @@ -168,9 +168,9 @@ class FB2Output(OutputFormatPlugin): } def convert(self, oeb_book, output_path, input_plugin, opts, log): + from calibre.ebooks.fb2.fb2ml import FB2MLizer from calibre.ebooks.oeb.transforms.jacket import linearize_jacket from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer, Unavailable - from calibre.ebooks.fb2.fb2ml import FB2MLizer try: rasterizer = SVGRasterizer() diff --git a/src/calibre/ebooks/conversion/plugins/html_input.py b/src/calibre/ebooks/conversion/plugins/html_input.py index 3ab35fea0d..7700c65cde 100644 --- a/src/calibre/ebooks/conversion/plugins/html_input.py +++ b/src/calibre/ebooks/conversion/plugins/html_input.py @@ -14,9 +14,7 @@ from urllib.parse import quote from calibre.constants import filesystem_encoding, isbsd, islinux from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation -from calibre.utils.filenames import ( - ascii_filename, case_ignoring_open_file, get_long_path_name, -) +from calibre.utils.filenames import ascii_filename, case_ignoring_open_file, get_long_path_name from calibre.utils.imghdr import what from calibre.utils.localization import __, get_lang from polyglot.builtins import as_unicode @@ -124,18 +122,16 @@ class HTMLInput(InputFormatPlugin): return self._is_case_sensitive def create_oebbook(self, htmlpath, basedir, opts, log, mi): - import css_parser import logging import uuid + import css_parser + from calibre import guess_type from calibre.ebooks.conversion.plumber import create_oebbook from calibre.ebooks.html.input import get_filelist from calibre.ebooks.metadata import string_to_authors - from calibre.ebooks.oeb.base import ( - BINARY_MIME, OEB_STYLES, DirContainer, rewrite_links, urldefrag, - urlnormalize, urlquote, xpath, - ) + from calibre.ebooks.oeb.base import BINARY_MIME, OEB_STYLES, DirContainer, rewrite_links, urldefrag, urlnormalize, urlquote, xpath from calibre.ebooks.oeb.transforms.metadata import meta_info_to_oeb_metadata from calibre.utils.localization import canonicalize_lang self.opts = opts diff --git a/src/calibre/ebooks/conversion/plugins/html_output.py b/src/calibre/ebooks/conversion/plugins/html_output.py index d8e2f1880e..9a0a61ee85 100644 --- a/src/calibre/ebooks/conversion/plugins/html_output.py +++ b/src/calibre/ebooks/conversion/plugins/html_output.py @@ -5,7 +5,8 @@ __docformat__ = 'restructuredtext en' import os import re import shutil -from os.path import abspath, basename, dirname, exists, relpath as _relpath +from os.path import abspath, basename, dirname, exists +from os.path import relpath as _relpath from calibre import CurrentDir from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin @@ -85,11 +86,11 @@ class HTMLOutput(OutputFormatPlugin): def convert(self, oeb_book, output_path, input_plugin, opts, log): from lxml import etree + from templite import Templite from calibre.ebooks.html.meta import EasyMeta from calibre.utils import zipfile from polyglot.urllib import unquote - from templite import Templite # read template files if opts.template_html_index is not None: diff --git a/src/calibre/ebooks/conversion/plugins/htmlz_output.py b/src/calibre/ebooks/conversion/plugins/htmlz_output.py index bb11d1ec6f..3c87c57492 100644 --- a/src/calibre/ebooks/conversion/plugins/htmlz_output.py +++ b/src/calibre/ebooks/conversion/plugins/htmlz_output.py @@ -5,8 +5,7 @@ __docformat__ = 'restructuredtext en' import io import os -from calibre.customize.conversion import OutputFormatPlugin, \ - OptionRecommendation +from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin from calibre.ptempfile import TemporaryDirectory @@ -54,10 +53,11 @@ class HTMLZOutput(OutputFormatPlugin): def convert(self, oeb_book, output_path, input_plugin, opts, log): from lxml import etree - from calibre.ebooks.oeb.base import OEB_IMAGES, SVG_MIME + from calibre.ebooks.metadata.opf2 import OPF, metadata_to_opf - from calibre.utils.zipfile import ZipFile + from calibre.ebooks.oeb.base import OEB_IMAGES, SVG_MIME from calibre.utils.filenames import ascii_filename + from calibre.utils.zipfile import ZipFile # HTML if opts.htmlz_css_type == 'inline': diff --git a/src/calibre/ebooks/conversion/plugins/lit_input.py b/src/calibre/ebooks/conversion/plugins/lit_input.py index 8c5fe7d58f..d18cded888 100644 --- a/src/calibre/ebooks/conversion/plugins/lit_input.py +++ b/src/calibre/ebooks/conversion/plugins/lit_input.py @@ -18,13 +18,13 @@ class LITInput(InputFormatPlugin): def convert(self, stream, options, file_ext, log, accelerators): - from calibre.ebooks.lit.reader import LitReader from calibre.ebooks.conversion.plumber import create_oebbook + from calibre.ebooks.lit.reader import LitReader self.log = log return create_oebbook(log, stream, options, reader=LitReader) def postprocess_book(self, oeb, opts, log): - from calibre.ebooks.oeb.base import XHTML_NS, XPath, XHTML + from calibre.ebooks.oeb.base import XHTML, XHTML_NS, XPath for item in oeb.spine: root = item.data if not hasattr(root, 'xpath'): @@ -39,11 +39,11 @@ class LITInput(InputFormatPlugin): body = body[0] if len(body) == 1 and body[0].tag == XHTML('pre'): pre = body[0] - from calibre.ebooks.txt.processor import convert_basic, \ - separate_paragraphs_single_line - from calibre.ebooks.chardet import xml_to_unicode - from calibre.utils.xml_parse import safe_xml_fromstring import copy + + from calibre.ebooks.chardet import xml_to_unicode + from calibre.ebooks.txt.processor import convert_basic, separate_paragraphs_single_line + from calibre.utils.xml_parse import safe_xml_fromstring self.log('LIT file with all text in single
 tag detected')
                     html = separate_paragraphs_single_line(pre.text)
                     html = convert_basic(html).replace('',
diff --git a/src/calibre/ebooks/conversion/plugins/lit_output.py b/src/calibre/ebooks/conversion/plugins/lit_output.py
index cfb72a6037..06230aee07 100644
--- a/src/calibre/ebooks/conversion/plugins/lit_output.py
+++ b/src/calibre/ebooks/conversion/plugins/lit_output.py
@@ -18,10 +18,10 @@ class LITOutput(OutputFormatPlugin):
 
     def convert(self, oeb, output_path, input_plugin, opts, log):
         self.log, self.opts, self.oeb = log, opts, oeb
+        from calibre.ebooks.lit.writer import LitWriter
+        from calibre.ebooks.oeb.transforms.htmltoc import HTMLTOCAdder
         from calibre.ebooks.oeb.transforms.manglecase import CaseMangler
         from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer
-        from calibre.ebooks.oeb.transforms.htmltoc import HTMLTOCAdder
-        from calibre.ebooks.lit.writer import LitWriter
         from calibre.ebooks.oeb.transforms.split import Split
         split = Split(split_on_page_breaks=True, max_flow_size=0,
                 remove_css_pagebreaks=False)
diff --git a/src/calibre/ebooks/conversion/plugins/lrf_input.py b/src/calibre/ebooks/conversion/plugins/lrf_input.py
index 650a105171..b357fa4f7f 100644
--- a/src/calibre/ebooks/conversion/plugins/lrf_input.py
+++ b/src/calibre/ebooks/conversion/plugins/lrf_input.py
@@ -5,7 +5,9 @@ __license__   = 'GPL v3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import os, sys
+import os
+import sys
+
 from calibre.customize.conversion import InputFormatPlugin
 from calibre.utils.resources import get_path as P
 
@@ -20,13 +22,13 @@ class LRFInput(InputFormatPlugin):
 
     def convert(self, stream, options, file_ext, log,
                 accelerators):
-        from calibre.ebooks.lrf.input import (MediaType, Styles, TextBlock,
-                Canvas, ImageBlock, RuledLine)
+        from calibre.ebooks.lrf.input import Canvas, ImageBlock, MediaType, RuledLine, Styles, TextBlock
         self.log = log
         self.log('Generating XML')
+        from lxml import etree
+
         from calibre.ebooks.lrf.lrfparser import LRFDocument
         from calibre.utils.xml_parse import safe_xml_fromstring
-        from lxml import etree
         d = LRFDocument(stream)
         d.parse()
         xml = d.to_xml(write_files=True)
diff --git a/src/calibre/ebooks/conversion/plugins/lrf_output.py b/src/calibre/ebooks/conversion/plugins/lrf_output.py
index bfbd07aee4..b3d11d52a3 100644
--- a/src/calibre/ebooks/conversion/plugins/lrf_output.py
+++ b/src/calibre/ebooks/conversion/plugins/lrf_output.py
@@ -5,10 +5,10 @@ __license__   = 'GPL v3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import sys, os
+import os
+import sys
 
-from calibre.customize.conversion import OutputFormatPlugin
-from calibre.customize.conversion import OptionRecommendation
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 
 
 class LRFOptions:
@@ -138,9 +138,10 @@ class LRFOutput(OutputFormatPlugin):
         ('change_justification', 'original', OptionRecommendation.HIGH)}
 
     def convert_images(self, pages, opts, wide):
-        from calibre.ebooks.lrf.pylrs.pylrs import Book, BookSetting, ImageStream, ImageBlock
         from uuid import uuid4
+
         from calibre.constants import __appname__, __version__
+        from calibre.ebooks.lrf.pylrs.pylrs import Book, BookSetting, ImageBlock, ImageStream
 
         width, height = (784, 1012) if wide else (584, 754)
 
diff --git a/src/calibre/ebooks/conversion/plugins/mobi_input.py b/src/calibre/ebooks/conversion/plugins/mobi_input.py
index 5af56b6591..d0a1fd74ed 100644
--- a/src/calibre/ebooks/conversion/plugins/mobi_input.py
+++ b/src/calibre/ebooks/conversion/plugins/mobi_input.py
@@ -20,8 +20,9 @@ class MOBIInput(InputFormatPlugin):
         self.is_kf8 = False
         self.mobi_is_joint = False
 
-        from calibre.ebooks.mobi.reader.mobi6 import MobiReader
         from lxml import html
+
+        from calibre.ebooks.mobi.reader.mobi6 import MobiReader
         parse_cache = {}
         try:
             mr = MobiReader(stream, log, options.input_encoding,
diff --git a/src/calibre/ebooks/conversion/plugins/mobi_output.py b/src/calibre/ebooks/conversion/plugins/mobi_output.py
index c31350b052..0a562cc7cb 100644
--- a/src/calibre/ebooks/conversion/plugins/mobi_output.py
+++ b/src/calibre/ebooks/conversion/plugins/mobi_output.py
@@ -5,8 +5,7 @@ __license__   = 'GPL v3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-from calibre.customize.conversion import (OutputFormatPlugin,
-        OptionRecommendation)
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 
 
 def remove_html_cover(oeb, log):
@@ -217,11 +216,11 @@ class MOBIOutput(OutputFormatPlugin):
                 for_joint=for_joint)
 
     def write_mobi(self, input_plugin, output_path, kf8, resources):
+        from calibre.customize.ui import plugin_for_input_format
         from calibre.ebooks.mobi.mobiml import MobiMLizer
+        from calibre.ebooks.oeb.transforms.htmltoc import HTMLTOCAdder
         from calibre.ebooks.oeb.transforms.manglecase import CaseMangler
         from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer, Unavailable
-        from calibre.ebooks.oeb.transforms.htmltoc import HTMLTOCAdder
-        from calibre.customize.ui import plugin_for_input_format
 
         opts, oeb = self.opts, self.oeb
         if not opts.no_inline_toc:
@@ -308,8 +307,8 @@ class AZW3Output(OutputFormatPlugin):
 
     def convert(self, oeb, output_path, input_plugin, opts, log):
         from calibre.ebooks.mobi.writer2.resources import Resources
-        from calibre.ebooks.mobi.writer8.main import create_kf8_book
         from calibre.ebooks.mobi.writer8.cleanup import remove_duplicate_anchors
+        from calibre.ebooks.mobi.writer8.main import create_kf8_book
 
         self.oeb, self.opts, self.log = oeb, opts, log
         opts.mobi_periodical = self.is_periodical
diff --git a/src/calibre/ebooks/conversion/plugins/oeb_output.py b/src/calibre/ebooks/conversion/plugins/oeb_output.py
index 2e74faca36..e037b91292 100644
--- a/src/calibre/ebooks/conversion/plugins/oeb_output.py
+++ b/src/calibre/ebooks/conversion/plugins/oeb_output.py
@@ -2,12 +2,11 @@ __license__ = 'GPL 3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import os, re
+import os
+import re
 
-
-from calibre.customize.conversion import (OutputFormatPlugin,
-        OptionRecommendation)
 from calibre import CurrentDir
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 
 
 class OEBOutput(OutputFormatPlugin):
@@ -20,13 +19,14 @@ class OEBOutput(OutputFormatPlugin):
     recommendations = {('pretty_print', True, OptionRecommendation.HIGH)}
 
     def convert(self, oeb_book, output_path, input_plugin, opts, log):
-        from polyglot.urllib import unquote
         from lxml import etree
 
+        from polyglot.urllib import unquote
+
         self.log, self.opts = log, opts
         if not os.path.exists(output_path):
             os.makedirs(output_path)
-        from calibre.ebooks.oeb.base import OPF_MIME, NCX_MIME, PAGE_MAP_MIME, OEB_STYLES
+        from calibre.ebooks.oeb.base import NCX_MIME, OEB_STYLES, OPF_MIME, PAGE_MAP_MIME
         from calibre.ebooks.oeb.normalize_css import condense_sheet
         with CurrentDir(output_path):
             results = oeb_book.to_opf2(page_map=True)
diff --git a/src/calibre/ebooks/conversion/plugins/pdb_input.py b/src/calibre/ebooks/conversion/plugins/pdb_input.py
index b661826058..1e6442dfcf 100644
--- a/src/calibre/ebooks/conversion/plugins/pdb_input.py
+++ b/src/calibre/ebooks/conversion/plugins/pdb_input.py
@@ -17,8 +17,8 @@ class PDBInput(InputFormatPlugin):
 
     def convert(self, stream, options, file_ext, log,
                 accelerators):
+        from calibre.ebooks.pdb import IDENTITY_TO_NAME, PDBError, get_reader
         from calibre.ebooks.pdb.header import PdbHeaderReader
-        from calibre.ebooks.pdb import PDBError, IDENTITY_TO_NAME, get_reader
 
         header = PdbHeaderReader(stream)
         Reader = get_reader(header.ident)
diff --git a/src/calibre/ebooks/conversion/plugins/pdb_output.py b/src/calibre/ebooks/conversion/plugins/pdb_output.py
index 724092eb18..43354afa4d 100644
--- a/src/calibre/ebooks/conversion/plugins/pdb_output.py
+++ b/src/calibre/ebooks/conversion/plugins/pdb_output.py
@@ -4,9 +4,8 @@ __docformat__ = 'restructuredtext en'
 
 import os
 
-from calibre.customize.conversion import OutputFormatPlugin, \
-    OptionRecommendation
-from calibre.ebooks.pdb import PDBError, get_writer, ALL_FORMAT_WRITERS
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
+from calibre.ebooks.pdb import ALL_FORMAT_WRITERS, PDBError, get_writer
 
 
 class PDBOutput(OutputFormatPlugin):
diff --git a/src/calibre/ebooks/conversion/plugins/pdf_input.py b/src/calibre/ebooks/conversion/plugins/pdf_input.py
index bd934869e8..42840b10db 100644
--- a/src/calibre/ebooks/conversion/plugins/pdf_input.py
+++ b/src/calibre/ebooks/conversion/plugins/pdf_input.py
@@ -29,8 +29,8 @@ class PDFInput(InputFormatPlugin):
 
     def convert_new(self, stream, accelerators):
         from calibre.ebooks.pdf.pdftohtml import pdftohtml
-        from calibre.utils.cleantext import clean_ascii_chars
         from calibre.ebooks.pdf.reflow import PDFDocument
+        from calibre.utils.cleantext import clean_ascii_chars
 
         pdftohtml(os.getcwd(), stream.name, self.opts.no_images, as_xml=True)
         with open('index.xml', 'rb') as f:
diff --git a/src/calibre/ebooks/conversion/plugins/pdf_output.py b/src/calibre/ebooks/conversion/plugins/pdf_output.py
index 52389d7ed3..54458f299b 100644
--- a/src/calibre/ebooks/conversion/plugins/pdf_output.py
+++ b/src/calibre/ebooks/conversion/plugins/pdf_output.py
@@ -6,10 +6,10 @@ __docformat__ = 'restructuredtext en'
 Convert OEB ebook format to PDF.
 '''
 
-import glob, os
+import glob
+import os
 
-from calibre.customize.conversion import (OutputFormatPlugin,
-    OptionRecommendation)
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 from calibre.ptempfile import TemporaryDirectory
 from polyglot.builtins import iteritems
 
@@ -169,9 +169,11 @@ class PDFOutput(OutputFormatPlugin):
         self.oeb = oeb_book
         self.input_plugin, self.opts, self.log = input_plugin, opts, log
         self.output_path = output_path
-        from calibre.ebooks.oeb.base import OPF, OPF2_NS
-        from lxml import etree
         from io import BytesIO
+
+        from lxml import etree
+
+        from calibre.ebooks.oeb.base import OPF, OPF2_NS
         package = etree.Element(OPF('package'),
             attrib={'version': '2.0', 'unique-identifier': 'dummy'},
             nsmap={None: OPF2_NS})
@@ -233,6 +235,7 @@ class PDFOutput(OutputFormatPlugin):
 
     def convert_text(self, oeb_book):
         import json
+
         from calibre.ebooks.pdf.html_writer import convert
         if not self.opts.pdf_no_cover:
             self.get_cover_data()
diff --git a/src/calibre/ebooks/conversion/plugins/pml_input.py b/src/calibre/ebooks/conversion/plugins/pml_input.py
index 49f8d2c98c..c4d241f965 100644
--- a/src/calibre/ebooks/conversion/plugins/pml_input.py
+++ b/src/calibre/ebooks/conversion/plugins/pml_input.py
@@ -85,8 +85,8 @@ class PMLInput(InputFormatPlugin):
 
     def convert(self, stream, options, file_ext, log,
                 accelerators):
-        from calibre.ebooks.metadata.toc import TOC
         from calibre.ebooks.metadata.opf2 import OPFCreator
+        from calibre.ebooks.metadata.toc import TOC
         from calibre.utils.zipfile import ZipFile
 
         self.options = options
diff --git a/src/calibre/ebooks/conversion/plugins/pml_output.py b/src/calibre/ebooks/conversion/plugins/pml_output.py
index b1a6a09a40..6ee8a133a2 100644
--- a/src/calibre/ebooks/conversion/plugins/pml_output.py
+++ b/src/calibre/ebooks/conversion/plugins/pml_output.py
@@ -2,10 +2,10 @@ __license__ = 'GPL 3'
 __copyright__ = '2009, John Schember '
 __docformat__ = 'restructuredtext en'
 
-import os, io
+import io
+import os
 
-from calibre.customize.conversion import (OutputFormatPlugin,
-        OptionRecommendation)
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 from calibre.ptempfile import TemporaryDirectory
 
 
diff --git a/src/calibre/ebooks/conversion/plugins/rb_output.py b/src/calibre/ebooks/conversion/plugins/rb_output.py
index 6a40d4dfa7..c793ba07e1 100644
--- a/src/calibre/ebooks/conversion/plugins/rb_output.py
+++ b/src/calibre/ebooks/conversion/plugins/rb_output.py
@@ -4,7 +4,7 @@ __docformat__ = 'restructuredtext en'
 
 import os
 
-from calibre.customize.conversion import OutputFormatPlugin, OptionRecommendation
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 
 
 class RBOutput(OutputFormatPlugin):
diff --git a/src/calibre/ebooks/conversion/plugins/recipe_input.py b/src/calibre/ebooks/conversion/plugins/recipe_input.py
index 9466250e20..9adbe045ab 100644
--- a/src/calibre/ebooks/conversion/plugins/recipe_input.py
+++ b/src/calibre/ebooks/conversion/plugins/recipe_input.py
@@ -7,9 +7,9 @@ __docformat__ = 'restructuredtext en'
 
 import os
 
-from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation
-from calibre.constants import numeric_version
 from calibre import walk
+from calibre.constants import numeric_version
+from calibre.customize.conversion import InputFormatPlugin, OptionRecommendation
 
 
 class RecipeDisabled(Exception):
@@ -71,7 +71,7 @@ class RecipeInput(InputFormatPlugin):
             self.recipe_object = recipe(opts, log, self.report_progress)
         else:
             if os.environ.get('CALIBRE_RECIPE_URN'):
-                from calibre.web.feeds.recipes.collection import get_custom_recipe, get_builtin_recipe_by_id
+                from calibre.web.feeds.recipes.collection import get_builtin_recipe_by_id, get_custom_recipe
                 urn = os.environ['CALIBRE_RECIPE_URN']
                 log('Downloading recipe urn: ' + urn)
                 rtype, recipe_id = urn.partition(':')[::2]
@@ -92,8 +92,7 @@ class RecipeInput(InputFormatPlugin):
                 recipe = compile_recipe(self.recipe_source)
                 log('Using custom recipe')
             else:
-                from calibre.web.feeds.recipes.collection import (
-                        get_builtin_recipe_by_title, get_builtin_recipe_titles)
+                from calibre.web.feeds.recipes.collection import get_builtin_recipe_by_title, get_builtin_recipe_titles
                 title = getattr(opts, 'original_recipe_input_arg', recipe_or_file)
                 title = os.path.basename(title).rpartition('.')[0]
                 titles = frozenset(get_builtin_recipe_titles())
diff --git a/src/calibre/ebooks/conversion/plugins/rtf_input.py b/src/calibre/ebooks/conversion/plugins/rtf_input.py
index 4651bfe89a..5f5d8f206d 100644
--- a/src/calibre/ebooks/conversion/plugins/rtf_input.py
+++ b/src/calibre/ebooks/conversion/plugins/rtf_input.py
@@ -254,8 +254,8 @@ class RTFInput(InputFormatPlugin):
 
         from calibre.ebooks.metadata.meta import get_metadata
         from calibre.ebooks.metadata.opf2 import OPFCreator
-        from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
         from calibre.ebooks.rtf.input import InlineClass
+        from calibre.ebooks.rtf2xml.ParseRtf import RtfInvalidCodeException
         from calibre.utils.xml_parse import safe_xml_fromstring
         self.opts = options
         self.log = log
diff --git a/src/calibre/ebooks/conversion/plugins/snb_output.py b/src/calibre/ebooks/conversion/plugins/snb_output.py
index 363a6b93fd..3a74b634f9 100644
--- a/src/calibre/ebooks/conversion/plugins/snb_output.py
+++ b/src/calibre/ebooks/conversion/plugins/snb_output.py
@@ -4,9 +4,9 @@ __docformat__ = 'restructuredtext en'
 
 import os
 
-from calibre.customize.conversion import OutputFormatPlugin, OptionRecommendation
-from calibre.ptempfile import TemporaryDirectory
 from calibre.constants import __appname__, __version__
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
+from calibre.ptempfile import TemporaryDirectory
 
 
 class SNBOutput(OutputFormatPlugin):
@@ -47,8 +47,9 @@ class SNBOutput(OutputFormatPlugin):
 
     def convert(self, oeb_book, output_path, input_plugin, opts, log):
         from lxml import etree
+
         from calibre.ebooks.snb.snbfile import SNBFile
-        from calibre.ebooks.snb.snbml import SNBMLizer, ProcessFileName
+        from calibre.ebooks.snb.snbml import ProcessFileName, SNBMLizer
 
         self.opts = opts
         from calibre.ebooks.oeb.transforms.rasterize import SVGRasterizer, Unavailable
@@ -221,7 +222,7 @@ class SNBOutput(OutputFormatPlugin):
             snbFile.Output(output_path)
 
     def HandleImage(self, imageData, imagePath):
-        from calibre.utils.img import image_from_data, resize_image, image_to_data
+        from calibre.utils.img import image_from_data, image_to_data, resize_image
         img = image_from_data(imageData)
         x, y = img.width(), img.height()
         if self.opts:
@@ -246,10 +247,10 @@ class SNBOutput(OutputFormatPlugin):
 
 
 if __name__ == '__main__':
-    from calibre.ebooks.oeb.reader import OEBReader
-    from calibre.ebooks.oeb.base import OEBBook
-    from calibre.ebooks.conversion.preprocess import HTMLPreProcessor
     from calibre.customize.profiles import HanlinV3Output
+    from calibre.ebooks.conversion.preprocess import HTMLPreProcessor
+    from calibre.ebooks.oeb.base import OEBBook
+    from calibre.ebooks.oeb.reader import OEBReader
 
     class OptionValues:
         pass
diff --git a/src/calibre/ebooks/conversion/plugins/tcr_output.py b/src/calibre/ebooks/conversion/plugins/tcr_output.py
index 208d8d4fdb..b4e2cdce6e 100644
--- a/src/calibre/ebooks/conversion/plugins/tcr_output.py
+++ b/src/calibre/ebooks/conversion/plugins/tcr_output.py
@@ -4,8 +4,7 @@ __docformat__ = 'restructuredtext en'
 
 import os
 
-from calibre.customize.conversion import OutputFormatPlugin, \
-    OptionRecommendation
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 
 
 class TCROutput(OutputFormatPlugin):
@@ -22,8 +21,8 @@ class TCROutput(OutputFormatPlugin):
             'The default is utf-8.'))}
 
     def convert(self, oeb_book, output_path, input_plugin, opts, log):
-        from calibre.ebooks.txt.txtml import TXTMLizer
         from calibre.ebooks.compression.tcr import compress
+        from calibre.ebooks.txt.txtml import TXTMLizer
 
         close = False
         if not hasattr(output_path, 'write'):
diff --git a/src/calibre/ebooks/conversion/plugins/txt_input.py b/src/calibre/ebooks/conversion/plugins/txt_input.py
index e4d05d1592..692b8c7e67 100644
--- a/src/calibre/ebooks/conversion/plugins/txt_input.py
+++ b/src/calibre/ebooks/conversion/plugins/txt_input.py
@@ -129,10 +129,17 @@ class TXTInput(InputFormatPlugin):
         from calibre.ebooks.chardet import detect
         from calibre.ebooks.conversion.preprocess import Dehyphenator, DocAnalysis
         from calibre.ebooks.txt.processor import (
-            block_to_single_line, convert_basic, convert_markdown_with_metadata,
-            convert_textile, detect_formatting_type, detect_paragraph_type,
-            normalize_line_endings, preserve_spaces, remove_indents,
-            separate_hard_scene_breaks, separate_paragraphs_print_formatted,
+            block_to_single_line,
+            convert_basic,
+            convert_markdown_with_metadata,
+            convert_textile,
+            detect_formatting_type,
+            detect_paragraph_type,
+            normalize_line_endings,
+            preserve_spaces,
+            remove_indents,
+            separate_hard_scene_breaks,
+            separate_paragraphs_print_formatted,
             separate_paragraphs_single_line,
         )
         from calibre.utils.zipfile import ZipFile
diff --git a/src/calibre/ebooks/conversion/plugins/txt_output.py b/src/calibre/ebooks/conversion/plugins/txt_output.py
index 0de608f34a..d90ff6d802 100644
--- a/src/calibre/ebooks/conversion/plugins/txt_output.py
+++ b/src/calibre/ebooks/conversion/plugins/txt_output.py
@@ -5,9 +5,7 @@ __docformat__ = 'restructuredtext en'
 import os
 import shutil
 
-
-from calibre.customize.conversion import OutputFormatPlugin, \
-    OptionRecommendation
+from calibre.customize.conversion import OptionRecommendation, OutputFormatPlugin
 from calibre.ptempfile import TemporaryDirectory, TemporaryFile
 
 NEWLINE_TYPES = ['system', 'unix', 'old_mac', 'windows']
@@ -81,9 +79,9 @@ class TXTOutput(OutputFormatPlugin):
      }
 
     def convert(self, oeb_book, output_path, input_plugin, opts, log):
+        from calibre.ebooks.txt.newlines import TxtNewlines, specified_newlines
         from calibre.ebooks.txt.txtml import TXTMLizer
         from calibre.utils.cleantext import clean_ascii_chars
-        from calibre.ebooks.txt.newlines import specified_newlines, TxtNewlines
 
         if opts.txt_output_formatting.lower() == 'markdown':
             from calibre.ebooks.txt.markdownml import MarkdownMLizer
diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py
index b3a6945bad..adbfbb540a 100644
--- a/src/calibre/ebooks/conversion/plumber.py
+++ b/src/calibre/ebooks/conversion/plumber.py
@@ -2,21 +2,31 @@ __license__ = 'GPL 3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import os, re, sys, shutil, pprint, json
+import json
+import os
+import pprint
+import re
+import shutil
+import sys
 from functools import partial
 
-from calibre.customize.conversion import OptionRecommendation, DummyReporter
-from calibre.customize.ui import input_profiles, output_profiles, \
-        plugin_for_input_format, plugin_for_output_format, \
-        available_input_formats, available_output_formats, \
-        run_plugins_on_preprocess, run_plugins_on_postprocess
+from calibre import extract, filesystem_encoding, get_types_map, isbytestring, walk
+from calibre.constants import __version__
+from calibre.customize.conversion import DummyReporter, OptionRecommendation
+from calibre.customize.ui import (
+    available_input_formats,
+    available_output_formats,
+    input_profiles,
+    output_profiles,
+    plugin_for_input_format,
+    plugin_for_output_format,
+    run_plugins_on_postprocess,
+    run_plugins_on_preprocess,
+)
 from calibre.ebooks.conversion.preprocess import HTMLPreProcessor
 from calibre.ptempfile import PersistentTemporaryDirectory
 from calibre.utils.date import parse_date
 from calibre.utils.zipfile import ZipFile
-from calibre import (extract, walk, isbytestring, filesystem_encoding,
-        get_types_map)
-from calibre.constants import __version__
 from polyglot.builtins import string_or_bytes
 
 DEBUG_README=b'''
@@ -923,9 +933,11 @@ OptionRecommendation(name='search_replace',
                 setattr(mi, x, val)
 
     def download_cover(self, url):
-        from calibre import browser
-        from PIL import Image
         import io
+
+        from PIL import Image
+
+        from calibre import browser
         from calibre.ptempfile import PersistentTemporaryFile
         self.log('Downloading cover from %r'%url)
         br = browser()
@@ -1055,7 +1067,9 @@ OptionRecommendation(name='search_replace',
         if self.opts.embed_all_fonts or self.opts.embed_font_family:
             # Start the threaded font scanner now, for performance
             from calibre.utils.fonts.scanner import font_scanner  # noqa
-        import css_parser, logging
+        import logging
+
+        import css_parser
         css_parser.log.setLevel(logging.WARN)
         get_types_map()  # Ensure the mimetypes module is initialized
 
@@ -1242,8 +1256,7 @@ OptionRecommendation(name='search_replace',
         self.opts.insert_blank_line = oibl
         self.opts.remove_paragraph_spacing = orps
 
-        from calibre.ebooks.oeb.transforms.page_margin import \
-            RemoveFakeMargins, RemoveAdobeMargins
+        from calibre.ebooks.oeb.transforms.page_margin import RemoveAdobeMargins, RemoveFakeMargins
         RemoveFakeMargins()(self.oeb, self.log, self.opts)
         RemoveAdobeMargins()(self.oeb, self.log, self.opts)
 
diff --git a/src/calibre/ebooks/conversion/preprocess.py b/src/calibre/ebooks/conversion/preprocess.py
index a7782eae65..4f0856f529 100644
--- a/src/calibre/ebooks/conversion/preprocess.py
+++ b/src/calibre/ebooks/conversion/preprocess.py
@@ -5,10 +5,12 @@ __license__   = 'GPL v3'
 __copyright__ = '2009, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import functools, re, json
+import functools
+import json
+import re
 from math import ceil
 
-from calibre import entity_to_unicode, as_unicode
+from calibre import as_unicode, entity_to_unicode
 
 XMLDECL_RE    = re.compile(r'^\s*<[?]xml.*?[?]>')
 SVG_NS       = 'http://www.w3.org/2000/svg'
@@ -68,9 +70,9 @@ def wrap_lines(match):
 
 
 def smarten_punctuation(html, log=None):
-    from calibre.utils.smartypants import smartyPants
     from calibre.ebooks.chardet import substitute_entites
     from calibre.ebooks.conversion.utils import HeuristicProcessor
+    from calibre.utils.smartypants import smartyPants
     preprocessor = HeuristicProcessor(log=log)
     from uuid import uuid4
     start = 'calibre-smartypants-'+str(uuid4())
diff --git a/src/calibre/ebooks/conversion/utils.py b/src/calibre/ebooks/conversion/utils.py
index 86dfdd9018..5c074a69f1 100644
--- a/src/calibre/ebooks/conversion/utils.py
+++ b/src/calibre/ebooks/conversion/utils.py
@@ -7,7 +7,8 @@ __docformat__ = 'restructuredtext en'
 
 import re
 from math import ceil
-from calibre.ebooks.conversion.preprocess import DocAnalysis, Dehyphenator
+
+from calibre.ebooks.conversion.preprocess import Dehyphenator, DocAnalysis
 from calibre.utils.logging import default_log
 from calibre.utils.wordcount import get_wordcount_obj
 
diff --git a/src/calibre/ebooks/covers.py b/src/calibre/ebooks/covers.py
index 9f99489373..048d1f0bef 100644
--- a/src/calibre/ebooks/covers.py
+++ b/src/calibre/ebooks/covers.py
@@ -12,10 +12,26 @@ from collections import namedtuple
 from contextlib import contextmanager
 from itertools import chain
 from math import atan2, ceil, cos, sin, sqrt
+
 from qt.core import (
-    QBrush, QColor, QFont, QFontMetrics, QImage, QLinearGradient, QPainter,
-    QPainterPath, QPen, QPointF, QRadialGradient, QRect, QRectF, Qt, QTextCharFormat,
-    QTextLayout, QTextOption, QTransform,
+    QBrush,
+    QColor,
+    QFont,
+    QFontMetrics,
+    QImage,
+    QLinearGradient,
+    QPainter,
+    QPainterPath,
+    QPen,
+    QPointF,
+    QRadialGradient,
+    QRect,
+    QRectF,
+    Qt,
+    QTextCharFormat,
+    QTextLayout,
+    QTextOption,
+    QTransform,
 )
 
 from calibre import fit_image, force_unicode
diff --git a/src/calibre/ebooks/css_transform_rules.py b/src/calibre/ebooks/css_transform_rules.py
index 712e1253ed..39178789a5 100644
--- a/src/calibre/ebooks/css_transform_rules.py
+++ b/src/calibre/ebooks/css_transform_rules.py
@@ -2,11 +2,12 @@
 # License: GPLv3 Copyright: 2016, Kovid Goyal 
 
 
-from functools import partial
+import numbers
+import operator
 from collections import OrderedDict
-import operator, numbers
+from functools import partial
 
-from css_parser.css import Property, CSSRule
+from css_parser.css import CSSRule, Property
 
 from calibre import force_unicode
 from calibre.ebooks import parse_css_length
diff --git a/src/calibre/ebooks/djvu/djvu.py b/src/calibre/ebooks/djvu/djvu.py
index 967338ac1b..df029e5de9 100644
--- a/src/calibre/ebooks/djvu/djvu.py
+++ b/src/calibre/ebooks/djvu/djvu.py
@@ -9,8 +9,8 @@ __copyright__ = '2011, Anthon van der Neut '
 # DjVu v3
 # November 2005
 
-import sys
 import struct
+import sys
 
 from calibre.ebooks.djvu.djvubzzdec import BZZDecoder
 
diff --git a/src/calibre/ebooks/djvu/djvubzzdec.py b/src/calibre/ebooks/djvu/djvubzzdec.py
index 1e1e9eb3bd..5748af9682 100644
--- a/src/calibre/ebooks/djvu/djvubzzdec.py
+++ b/src/calibre/ebooks/djvu/djvubzzdec.py
@@ -731,6 +731,7 @@ class BZZDecoder():
 # for testing
 def main():
     import sys
+
     from calibre_extensions import bzzdec as d
     with open(sys.argv[1], "rb") as f:
         raw = f.read()
diff --git a/src/calibre/ebooks/docx/block_styles.py b/src/calibre/ebooks/docx/block_styles.py
index 1bd6e856c5..6e5f548cd8 100644
--- a/src/calibre/ebooks/docx/block_styles.py
+++ b/src/calibre/ebooks/docx/block_styles.py
@@ -6,6 +6,7 @@ __copyright__ = '2013, Kovid Goyal '
 
 import numbers
 from collections import OrderedDict
+
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/docx/char_styles.py b/src/calibre/ebooks/docx/char_styles.py
index a651b4349c..1cc7f5ba2a 100644
--- a/src/calibre/ebooks/docx/char_styles.py
+++ b/src/calibre/ebooks/docx/char_styles.py
@@ -5,8 +5,8 @@ __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
 from collections import OrderedDict
-from calibre.ebooks.docx.block_styles import (  # noqa
-    inherit, simple_color, LINE_STYLES, simple_float, binary_property, read_shd)
+
+from calibre.ebooks.docx.block_styles import LINE_STYLES, binary_property, inherit, read_shd, simple_color, simple_float  # noqa
 
 # Read from XML {{{
 
diff --git a/src/calibre/ebooks/docx/cleanup.py b/src/calibre/ebooks/docx/cleanup.py
index 8f9d463c90..322e44ba9a 100644
--- a/src/calibre/ebooks/docx/cleanup.py
+++ b/src/calibre/ebooks/docx/cleanup.py
@@ -5,6 +5,7 @@ __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
 import os
+
 from polyglot.builtins import itervalues
 
 NBSP = '\xa0'
diff --git a/src/calibre/ebooks/docx/container.py b/src/calibre/ebooks/docx/container.py
index c73ad84a21..bdea8cdb25 100644
--- a/src/calibre/ebooks/docx/container.py
+++ b/src/calibre/ebooks/docx/container.py
@@ -4,20 +4,22 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-import os, sys, shutil
+import os
+import shutil
+import sys
 
 from lxml import etree
 
-from calibre import walk, guess_type
-from calibre.ebooks.metadata import string_to_authors, authors_to_sort_string
-from calibre.ebooks.metadata.book.base import Metadata
+from calibre import guess_type, walk
 from calibre.ebooks.docx import InvalidDOCX
 from calibre.ebooks.docx.names import DOCXNamespace
+from calibre.ebooks.metadata import authors_to_sort_string, string_to_authors
+from calibre.ebooks.metadata.book.base import Metadata
 from calibre.ptempfile import PersistentTemporaryDirectory
 from calibre.utils.localization import canonicalize_lang
 from calibre.utils.logging import default_log
-from calibre.utils.zipfile import ZipFile
 from calibre.utils.xml_parse import safe_xml_fromstring
+from calibre.utils.zipfile import ZipFile
 
 
 def fromstring(raw, parser=None):
diff --git a/src/calibre/ebooks/docx/dump.py b/src/calibre/ebooks/docx/dump.py
index e64c4d2136..2e566571dc 100644
--- a/src/calibre/ebooks/docx/dump.py
+++ b/src/calibre/ebooks/docx/dump.py
@@ -4,13 +4,15 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-import sys, os, shutil
+import os
+import shutil
+import sys
 
 from lxml import etree
 
 from calibre import walk
-from calibre.utils.zipfile import ZipFile
 from calibre.utils.xml_parse import safe_xml_fromstring
+from calibre.utils.zipfile import ZipFile
 
 
 def pretty_all_xml_in_dir(path):
diff --git a/src/calibre/ebooks/docx/fields.py b/src/calibre/ebooks/docx/fields.py
index 95012eeb2c..6d931c3013 100644
--- a/src/calibre/ebooks/docx/fields.py
+++ b/src/calibre/ebooks/docx/fields.py
@@ -6,7 +6,7 @@ __copyright__ = '2013, Kovid Goyal '
 
 import re
 
-from calibre.ebooks.docx.index import process_index, polish_index_markup
+from calibre.ebooks.docx.index import polish_index_markup, process_index
 from polyglot.builtins import iteritems, native_string_type
 
 
diff --git a/src/calibre/ebooks/docx/fonts.py b/src/calibre/ebooks/docx/fonts.py
index 951349e521..b6733323f9 100644
--- a/src/calibre/ebooks/docx/fonts.py
+++ b/src/calibre/ebooks/docx/fonts.py
@@ -4,13 +4,14 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-import os, re
+import os
+import re
 from collections import namedtuple
 
 from calibre.ebooks.docx.block_styles import binary_property, inherit
 from calibre.utils.filenames import ascii_filename
-from calibre.utils.fonts.scanner import font_scanner, NoFonts
-from calibre.utils.fonts.utils import panose_to_css_generic_family, is_truetype_font
+from calibre.utils.fonts.scanner import NoFonts, font_scanner
+from calibre.utils.fonts.utils import is_truetype_font, panose_to_css_generic_family
 from calibre.utils.icu import ord_string
 from polyglot.builtins import codepoint_to_chr, iteritems
 
diff --git a/src/calibre/ebooks/docx/images.py b/src/calibre/ebooks/docx/images.py
index c8e1694b94..4e3c8de9ea 100644
--- a/src/calibre/ebooks/docx/images.py
+++ b/src/calibre/ebooks/docx/images.py
@@ -6,6 +6,7 @@ __copyright__ = '2013, Kovid Goyal '
 
 import os
 import re
+
 from lxml.html.builder import HR, IMG
 
 from calibre import sanitize_file_name
diff --git a/src/calibre/ebooks/docx/numbering.py b/src/calibre/ebooks/docx/numbering.py
index 42a41d9717..a7cf7451bf 100644
--- a/src/calibre/ebooks/docx/numbering.py
+++ b/src/calibre/ebooks/docx/numbering.py
@@ -4,11 +4,12 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-import re, string
+import re
+import string
 from collections import Counter, defaultdict
 from functools import partial
 
-from lxml.html.builder import OL, UL, SPAN
+from lxml.html.builder import OL, SPAN, UL
 
 from calibre.ebooks.docx.block_styles import ParagraphStyle
 from calibre.ebooks.docx.char_styles import RunStyle, inherit
diff --git a/src/calibre/ebooks/docx/styles.py b/src/calibre/ebooks/docx/styles.py
index 9df8bebd7d..738d481e92 100644
--- a/src/calibre/ebooks/docx/styles.py
+++ b/src/calibre/ebooks/docx/styles.py
@@ -5,7 +5,7 @@ __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
 import textwrap
-from collections import OrderedDict, Counter
+from collections import Counter, OrderedDict
 
 from calibre.ebooks.docx.block_styles import ParagraphStyle, inherit, twips
 from calibre.ebooks.docx.char_styles import RunStyle
diff --git a/src/calibre/ebooks/docx/tables.py b/src/calibre/ebooks/docx/tables.py
index d3574cd217..11e657e2a9 100644
--- a/src/calibre/ebooks/docx/tables.py
+++ b/src/calibre/ebooks/docx/tables.py
@@ -4,9 +4,10 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-from lxml.html.builder import TABLE, TR, TD
+from lxml.html.builder import TABLE, TD, TR
 
-from calibre.ebooks.docx.block_styles import inherit, read_shd as rs, read_border, binary_property, border_props, ParagraphStyle, border_to_css
+from calibre.ebooks.docx.block_styles import ParagraphStyle, binary_property, border_props, border_to_css, inherit, read_border
+from calibre.ebooks.docx.block_styles import read_shd as rs
 from calibre.ebooks.docx.char_styles import RunStyle
 from polyglot.builtins import iteritems, itervalues
 
diff --git a/src/calibre/ebooks/docx/writer/container.py b/src/calibre/ebooks/docx/writer/container.py
index 2fde66d5bd..0b8bff1917 100644
--- a/src/calibre/ebooks/docx/writer/container.py
+++ b/src/calibre/ebooks/docx/writer/container.py
@@ -4,13 +4,14 @@
 __license__ = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 
-import textwrap, os
+import os
+import textwrap
 
 from lxml import etree
 from lxml.builder import ElementMaker
 
 from calibre import guess_type
-from calibre.constants import numeric_version, __appname__
+from calibre.constants import __appname__, numeric_version
 from calibre.ebooks.docx.names import DOCXNamespace
 from calibre.ebooks.metadata import authors_to_string
 from calibre.ebooks.pdf.render.common import PAPER_SIZES
diff --git a/src/calibre/ebooks/docx/writer/from_html.py b/src/calibre/ebooks/docx/writer/from_html.py
index 92cf5ca72b..b82e6ca7aa 100644
--- a/src/calibre/ebooks/docx/writer/from_html.py
+++ b/src/calibre/ebooks/docx/writer/from_html.py
@@ -7,15 +7,16 @@ __copyright__ = '2013, Kovid Goyal '
 import re
 from collections import Counter
 
-from calibre.ebooks.docx.writer.container import create_skeleton, page_size, page_effective_area
-from calibre.ebooks.docx.writer.styles import StylesManager, FloatSpec
-from calibre.ebooks.docx.writer.links import LinksManager
-from calibre.ebooks.docx.writer.images import ImagesManager
+from calibre.ebooks.docx.writer.container import create_skeleton, page_effective_area, page_size
 from calibre.ebooks.docx.writer.fonts import FontsManager
-from calibre.ebooks.docx.writer.tables import Table
+from calibre.ebooks.docx.writer.images import ImagesManager
+from calibre.ebooks.docx.writer.links import LinksManager
 from calibre.ebooks.docx.writer.lists import ListsManager
-from calibre.ebooks.oeb.stylizer import Stylizer as Sz, Style as St
+from calibre.ebooks.docx.writer.styles import FloatSpec, StylesManager
+from calibre.ebooks.docx.writer.tables import Table
 from calibre.ebooks.oeb.base import XPath, barename
+from calibre.ebooks.oeb.stylizer import Style as St
+from calibre.ebooks.oeb.stylizer import Stylizer as Sz
 from calibre.utils.localization import lang_as_iso639_1
 from polyglot.builtins import string_or_bytes
 
diff --git a/src/calibre/ebooks/docx/writer/images.py b/src/calibre/ebooks/docx/writer/images.py
index 6345733c77..5e4d6d946d 100644
--- a/src/calibre/ebooks/docx/writer/images.py
+++ b/src/calibre/ebooks/docx/writer/images.py
@@ -8,11 +8,12 @@ import os
 import posixpath
 from collections import namedtuple
 from functools import partial
+
 from lxml import etree
 
 from calibre import fit_image
 from calibre.ebooks.docx.images import pt_to_emu
-from calibre.ebooks.docx.names import USE_LOCAL_DPI_URI, SVG_BLIP_URI
+from calibre.ebooks.docx.names import SVG_BLIP_URI, USE_LOCAL_DPI_URI
 from calibre.ebooks.oeb.base import urlquote, urlunquote
 from calibre.utils.filenames import ascii_filename
 from calibre.utils.imghdr import identify
diff --git a/src/calibre/ebooks/docx/writer/styles.py b/src/calibre/ebooks/docx/writer/styles.py
index 56ba08aba7..73f85d49eb 100644
--- a/src/calibre/ebooks/docx/writer/styles.py
+++ b/src/calibre/ebooks/docx/writer/styles.py
@@ -9,12 +9,12 @@ from collections import Counter, defaultdict
 from operator import attrgetter
 
 from lxml import etree
+from tinycss.css21 import CSS21Parser
 
 from calibre.ebooks import parse_css_length
 from calibre.ebooks.docx.writer.utils import convert_color, int_or_zero
 from calibre.utils.localization import lang_as_iso639_1
 from polyglot.builtins import iteritems
-from tinycss.css21 import CSS21Parser
 
 css_parser = CSS21Parser()
 
diff --git a/src/calibre/ebooks/docx/writer/tables.py b/src/calibre/ebooks/docx/writer/tables.py
index 4e95eb6adf..3f65d6a381 100644
--- a/src/calibre/ebooks/docx/writer/tables.py
+++ b/src/calibre/ebooks/docx/writer/tables.py
@@ -6,8 +6,9 @@ __copyright__ = '2015, Kovid Goyal '
 
 from collections import namedtuple
 
+from calibre.ebooks.docx.writer.styles import border_edges
+from calibre.ebooks.docx.writer.styles import read_css_block_borders as rcbb
 from calibre.ebooks.docx.writer.utils import convert_color
-from calibre.ebooks.docx.writer.styles import read_css_block_borders as rcbb, border_edges
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/epub/__init__.py b/src/calibre/ebooks/epub/__init__.py
index 71c1a5f210..a8cd6cec96 100644
--- a/src/calibre/ebooks/epub/__init__.py
+++ b/src/calibre/ebooks/epub/__init__.py
@@ -5,7 +5,7 @@ __docformat__ = 'restructuredtext en'
 '''
 Conversion to EPUB.
 '''
-from calibre.utils.zipfile import ZipFile, ZIP_STORED
+from calibre.utils.zipfile import ZIP_STORED, ZipFile
 
 
 def rules(stylesheets):
diff --git a/src/calibre/ebooks/epub/cfi/tests.py b/src/calibre/ebooks/epub/cfi/tests.py
index 71547176fa..18a4e5dd16 100644
--- a/src/calibre/ebooks/epub/cfi/tests.py
+++ b/src/calibre/ebooks/epub/cfi/tests.py
@@ -4,9 +4,10 @@
 __license__ = 'GPL v3'
 __copyright__ = '2014, Kovid Goyal '
 
-import unittest, numbers
+import numbers
+import unittest
 
-from calibre.ebooks.epub.cfi.parse import parser, cfi_sort_key, decode_cfi
+from calibre.ebooks.epub.cfi.parse import cfi_sort_key, decode_cfi, parser
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/epub/pages.py b/src/calibre/ebooks/epub/pages.py
index da06eef01e..7f58aa728c 100644
--- a/src/calibre/ebooks/epub/pages.py
+++ b/src/calibre/ebooks/epub/pages.py
@@ -9,10 +9,11 @@ __docformat__ = 'restructuredtext en'
 
 import re
 from itertools import count
-from calibre.ebooks.oeb.base import XHTML_NS
-from calibre.ebooks.oeb.base import OEBBook
+
 from lxml.etree import XPath
 
+from calibre.ebooks.oeb.base import XHTML_NS, OEBBook
+
 NSMAP = {'h': XHTML_NS, 'html': XHTML_NS, 'xhtml': XHTML_NS}
 PAGE_RE = re.compile(r'page', re.IGNORECASE)
 ROMAN_RE = re.compile(r'^[ivxlcdm]+$', re.IGNORECASE)
diff --git a/src/calibre/ebooks/epub/periodical.py b/src/calibre/ebooks/epub/periodical.py
index 8b2a661040..80db09a5e9 100644
--- a/src/calibre/ebooks/epub/periodical.py
+++ b/src/calibre/ebooks/epub/periodical.py
@@ -5,11 +5,12 @@ __license__   = 'GPL v3'
 __copyright__ = '2010, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-from uuid import uuid4
 import time
+from uuid import uuid4
 
+from calibre import prepare_string_for_xml as xml
+from calibre import strftime
 from calibre.constants import __appname__, __version__
-from calibre import strftime, prepare_string_for_xml as xml
 from calibre.utils.date import parse_date
 
 SONY_METADATA = '''\
diff --git a/src/calibre/ebooks/fb2/__init__.py b/src/calibre/ebooks/fb2/__init__.py
index 4e93dd8225..3ef0e9b45b 100644
--- a/src/calibre/ebooks/fb2/__init__.py
+++ b/src/calibre/ebooks/fb2/__init__.py
@@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en'
 
 def base64_decode(raw):
     from io import BytesIO
+
     from polyglot.binary import from_base64_bytes
 
     # First try the python implementation as it is faster
diff --git a/src/calibre/ebooks/fb2/fb2ml.py b/src/calibre/ebooks/fb2/fb2ml.py
index 78e369eb86..a24fd2d72c 100644
--- a/src/calibre/ebooks/fb2/fb2ml.py
+++ b/src/calibre/ebooks/fb2/fb2ml.py
@@ -6,19 +6,21 @@ __docformat__ = 'restructuredtext en'
 Transform OEB content into FB2 markup
 '''
 
-import re, textwrap, uuid
+import re
+import textwrap
+import uuid
 from datetime import datetime
 
 from lxml import etree
 
 from calibre import prepare_string_for_xml
 from calibre.constants import __appname__, __version__
+from calibre.ebooks.oeb.base import urlnormalize
+from calibre.utils.img import save_cover_data_to
 from calibre.utils.localization import lang_as_iso639_1
 from calibre.utils.xml_parse import safe_xml_fromstring
-from calibre.utils.img import save_cover_data_to
-from calibre.ebooks.oeb.base import urlnormalize
-from polyglot.builtins import string_or_bytes
 from polyglot.binary import as_base64_unicode
+from polyglot.builtins import string_or_bytes
 from polyglot.urllib import urlparse
 
 
diff --git a/src/calibre/ebooks/html/meta.py b/src/calibre/ebooks/html/meta.py
index cad6cc6c5a..c834364d3a 100644
--- a/src/calibre/ebooks/html/meta.py
+++ b/src/calibre/ebooks/html/meta.py
@@ -9,7 +9,7 @@ class EasyMeta:
         self.meta = meta
 
     def __iter__(self):
-        from calibre.ebooks.oeb.base import namespace, barename, DC11_NS
+        from calibre.ebooks.oeb.base import DC11_NS, barename, namespace
         meta = self.meta
         for item_name in meta.items:
             for item in meta[item_name]:
diff --git a/src/calibre/ebooks/html/to_zip.py b/src/calibre/ebooks/html/to_zip.py
index d70265bb56..8903a995c8 100644
--- a/src/calibre/ebooks/html/to_zip.py
+++ b/src/calibre/ebooks/html/to_zip.py
@@ -5,10 +5,12 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import textwrap, os, glob
+import glob
+import os
+import textwrap
 
-from calibre.customize import FileTypePlugin
 from calibre.constants import numeric_version
+from calibre.customize import FileTypePlugin
 
 
 class HTML2ZIP(FileTypePlugin):
@@ -40,11 +42,12 @@ every time you add an HTML file to the library.\
 
     def run(self, htmlfile):
         import codecs
+
         from calibre import prints
-        from calibre.ptempfile import TemporaryDirectory
-        from calibre.gui2.convert.gui_conversion import gui_convert
         from calibre.customize.conversion import OptionRecommendation
         from calibre.ebooks.epub import initialize_container
+        from calibre.gui2.convert.gui_conversion import gui_convert
+        from calibre.ptempfile import TemporaryDirectory
 
         with TemporaryDirectory('_plugin_html2zip') as tdir:
             recs =[('debug_pipeline', tdir, OptionRecommendation.HIGH)]
@@ -87,8 +90,8 @@ every time you add an HTML file to the library.\
         automatically applied.
         '''
         import json
-        from qt.core import (QDialog, QDialogButtonBox, QVBoxLayout,
-                QLabel, Qt, QLineEdit, QCheckBox)
+
+        from qt.core import QCheckBox, QDialog, QDialogButtonBox, QLabel, QLineEdit, Qt, QVBoxLayout
 
         config_dialog = QDialog(parent)
         button_box = QDialogButtonBox(QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel)
@@ -100,8 +103,7 @@ every time you add an HTML file to the library.\
         button_box.accepted.connect(config_dialog.accept)
         button_box.rejected.connect(config_dialog.reject)
         config_dialog.setWindowTitle(_('Customize') + ' ' + self.name)
-        from calibre.customize.ui import (plugin_customization,
-                customize_plugin)
+        from calibre.customize.ui import customize_plugin, plugin_customization
         help_text = self.customization_help(gui=True)
         help_text = QLabel(help_text, config_dialog)
         help_text.setWordWrap(True)
diff --git a/src/calibre/ebooks/html_entities.py b/src/calibre/ebooks/html_entities.py
index ca2dc2fdf7..7d9bf0d6d7 100644
--- a/src/calibre/ebooks/html_entities.py
+++ b/src/calibre/ebooks/html_entities.py
@@ -2135,6 +2135,7 @@ html5_entities = {
 
 if __name__ == '__main__':
     import re
+
     from html5lib.constants import entities
     entities = {k.replace(';', ''): entities[k] for k in entities}
     lines = []
diff --git a/src/calibre/ebooks/html_transform_rules.py b/src/calibre/ebooks/html_transform_rules.py
index bb48b95d62..f5e2634c88 100644
--- a/src/calibre/ebooks/html_transform_rules.py
+++ b/src/calibre/ebooks/html_transform_rules.py
@@ -4,13 +4,14 @@
 
 import re
 from functools import partial
+
+from css_selectors.select import Select, get_parsed_selector
 from html5_parser import parse
 from lxml import etree
 
-from calibre.ebooks.oeb.parse_utils import XHTML
-from calibre.ebooks.oeb.base import OEB_DOCS, XPath
 from calibre.ebooks.metadata.tag_mapper import uniq
-from css_selectors.select import Select, get_parsed_selector
+from calibre.ebooks.oeb.base import OEB_DOCS, XPath
+from calibre.ebooks.oeb.parse_utils import XHTML
 
 
 def non_empty_validator(label, val):
diff --git a/src/calibre/ebooks/htmlz/oeb2html.py b/src/calibre/ebooks/htmlz/oeb2html.py
index 3ea8c2c952..29eb1ff1f8 100644
--- a/src/calibre/ebooks/htmlz/oeb2html.py
+++ b/src/calibre/ebooks/htmlz/oeb2html.py
@@ -8,15 +8,13 @@ Transform OEB content into a single (more or less) HTML file.
 
 import os
 import re
-from css_parser import replaceUrls
 from functools import partial
+
+from css_parser import replaceUrls
 from lxml import html
 
 from calibre import prepare_string_for_xml
-from calibre.ebooks.oeb.base import (
-    OEB_IMAGES, SVG_NS, XHTML, XHTML_NS, XLINK, barename, namespace, rewrite_links,
-    urlnormalize,
-)
+from calibre.ebooks.oeb.base import OEB_IMAGES, SVG_NS, XHTML, XHTML_NS, XLINK, barename, namespace, rewrite_links, urlnormalize
 from calibre.ebooks.oeb.stylizer import Stylizer
 from calibre.utils.logging import default_log
 from polyglot.builtins import as_unicode, string_or_bytes
diff --git a/src/calibre/ebooks/lit/maps/__init__.py b/src/calibre/ebooks/lit/maps/__init__.py
index b30974ba6b..13114268d9 100644
--- a/src/calibre/ebooks/lit/maps/__init__.py
+++ b/src/calibre/ebooks/lit/maps/__init__.py
@@ -5,7 +5,7 @@ __copyright__ = '2008, Marshall T. Vandegrift '
 Microsoft LIT tag and attribute tables.
 """
 
-from calibre.ebooks.lit.maps.opf import MAP as OPF_MAP
 from calibre.ebooks.lit.maps.html import MAP as HTML_MAP
+from calibre.ebooks.lit.maps.opf import MAP as OPF_MAP
 
 OPF_MAP, HTML_MAP
diff --git a/src/calibre/ebooks/lit/mssha1.py b/src/calibre/ebooks/lit/mssha1.py
index 5ac50ddccf..ccd735cd94 100644
--- a/src/calibre/ebooks/lit/mssha1.py
+++ b/src/calibre/ebooks/lit/mssha1.py
@@ -7,7 +7,9 @@ Adapted from the PyPy pure-Python SHA-1 implementation.
 __license__   = 'GPL v3'
 __copyright__ = '2008, Marshall T. Vandegrift '
 
-import struct, copy
+import copy
+import struct
+
 from polyglot.builtins import long_type
 
 # ======================================================================
diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py
index 9a4cc4604c..a0899a7491 100644
--- a/src/calibre/ebooks/lit/reader.py
+++ b/src/calibre/ebooks/lit/reader.py
@@ -6,19 +6,24 @@ __license__   = 'GPL v3'
 __copyright__ = '2008, Kovid Goyal  ' \
     'and Marshall T. Vandegrift '
 
-import io, struct, os, functools, re
+import functools
+import io
+import os
+import re
+import struct
 
 from lxml import etree
 
-from calibre.ebooks.lit import LitError
-from calibre.ebooks.lit.maps import OPF_MAP, HTML_MAP
 import calibre.ebooks.lit.mssha1 as mssha1
+from calibre.ebooks import DRMError
+from calibre.ebooks.lit import LitError
+from calibre.ebooks.lit.maps import HTML_MAP, OPF_MAP
 from calibre.ebooks.oeb.base import urlnormalize, xpath
 from calibre.ebooks.oeb.reader import OEBReader
-from calibre.ebooks import DRMError
-from polyglot.builtins import codepoint_to_chr, string_or_bytes, itervalues
-from polyglot.urllib import unquote as urlunquote, urldefrag
 from calibre_extensions import lzx, msdes
+from polyglot.builtins import codepoint_to_chr, itervalues, string_or_bytes
+from polyglot.urllib import unquote as urlunquote
+from polyglot.urllib import urldefrag
 
 __all__ = ["LitReader"]
 
diff --git a/src/calibre/ebooks/lit/writer.py b/src/calibre/ebooks/lit/writer.py
index 21af07a400..044f88d340 100644
--- a/src/calibre/ebooks/lit/writer.py
+++ b/src/calibre/ebooks/lit/writer.py
@@ -5,31 +5,30 @@ Basic support for writing LIT files.
 __license__   = 'GPL v3'
 __copyright__ = '2008, Marshall T. Vandegrift '
 
-from struct import pack
-from itertools import count, chain
-from operator import attrgetter
+import copy
+import functools
 import io
-import time
+import numbers
 import os
 import re
-import copy
+import time
 import uuid
-import functools
-import numbers
+from itertools import chain, count
+from operator import attrgetter
+from struct import pack
+
 from lxml import etree
-from calibre.ebooks.lit.reader import DirectoryEntry
-import calibre.ebooks.lit.maps as maps
-from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, OEB_STYLES, \
-    CSS_MIME, OPF_MIME, XML_NS, XML
-from calibre.ebooks.oeb.base import prefixname, \
-    urlnormalize
-from calibre.ebooks.oeb.stylizer import Stylizer
-from calibre.ebooks.lit.lzx import Compressor
+
 import calibre
-from calibre_extensions import msdes
+import calibre.ebooks.lit.maps as maps
 import calibre.ebooks.lit.mssha1 as mssha1
-from polyglot.builtins import codepoint_to_chr, string_or_bytes, native_string_type
-from polyglot.urllib import urldefrag, unquote
+from calibre.ebooks.lit.lzx import Compressor
+from calibre.ebooks.lit.reader import DirectoryEntry
+from calibre.ebooks.oeb.base import CSS_MIME, OEB_DOCS, OEB_STYLES, OPF_MIME, XHTML_MIME, XML, XML_NS, prefixname, urlnormalize
+from calibre.ebooks.oeb.stylizer import Stylizer
+from calibre_extensions import msdes
+from polyglot.builtins import codepoint_to_chr, native_string_type, string_or_bytes
+from polyglot.urllib import unquote, urldefrag
 
 __all__ = ['LitWriter']
 
diff --git a/src/calibre/ebooks/lrf/__init__.py b/src/calibre/ebooks/lrf/__init__.py
index 4f90be7d97..4a324b3f40 100644
--- a/src/calibre/ebooks/lrf/__init__.py
+++ b/src/calibre/ebooks/lrf/__init__.py
@@ -5,11 +5,10 @@ This package contains logic to read and write LRF files.
 The LRF file format is documented at U{http://www.sven.de/librie/Librie/LrfFormat}.
 """
 
-from calibre.ebooks.lrf.pylrs.pylrs import Book as _Book
-from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Header, \
-                                             TextStyle, BlockStyle
-from calibre.ebooks.lrf.fonts import FONT_FILE_MAP
 from calibre.ebooks import ConversionError
+from calibre.ebooks.lrf.fonts import FONT_FILE_MAP
+from calibre.ebooks.lrf.pylrs.pylrs import BlockStyle, Header, TextBlock, TextStyle
+from calibre.ebooks.lrf.pylrs.pylrs import Book as _Book
 
 __docformat__ = "epytext"
 
diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py
index bf6a7263ed..b0c6aa7351 100644
--- a/src/calibre/ebooks/lrf/html/convert_from.py
+++ b/src/calibre/ebooks/lrf/html/convert_from.py
@@ -12,23 +12,36 @@ from functools import partial
 from itertools import chain
 from math import ceil, floor
 
-from calibre import (
-    __appname__, entity_to_unicode, fit_image, force_unicode, preferred_encoding
-)
+from calibre import __appname__, entity_to_unicode, fit_image, force_unicode, preferred_encoding
 from calibre.constants import filesystem_encoding
 from calibre.devices.interface import DevicePlugin as Device
 from calibre.ebooks import ConversionError
-from calibre.ebooks.BeautifulSoup import (
-    BeautifulSoup, Comment, Declaration, NavigableString, ProcessingInstruction, Tag
-)
+from calibre.ebooks.BeautifulSoup import BeautifulSoup, Comment, Declaration, NavigableString, ProcessingInstruction, Tag
 from calibre.ebooks.chardet import xml_to_unicode
 from calibre.ebooks.lrf import Book
 from calibre.ebooks.lrf.html.color_map import lrs_color
 from calibre.ebooks.lrf.html.table import Table
 from calibre.ebooks.lrf.pylrs.pylrs import (
-    CR, BlockSpace, BookSetting, Canvas, CharButton, DropCaps, EmpLine, Image,
-    ImageBlock, ImageStream, Italic, JumpButton, LrsError, Paragraph, Plot,
-    RuledLine, Span, Sub, Sup, TextBlock
+    CR,
+    BlockSpace,
+    BookSetting,
+    Canvas,
+    CharButton,
+    DropCaps,
+    EmpLine,
+    Image,
+    ImageBlock,
+    ImageStream,
+    Italic,
+    JumpButton,
+    LrsError,
+    Paragraph,
+    Plot,
+    RuledLine,
+    Span,
+    Sub,
+    Sup,
+    TextBlock,
 )
 from calibre.ptempfile import PersistentTemporaryFile
 from polyglot.builtins import itervalues, string_or_bytes
diff --git a/src/calibre/ebooks/lrf/html/table.py b/src/calibre/ebooks/lrf/html/table.py
index de8c483830..8cf227c791 100644
--- a/src/calibre/ebooks/lrf/html/table.py
+++ b/src/calibre/ebooks/lrf/html/table.py
@@ -1,12 +1,13 @@
 __license__   = 'GPL v3'
 __copyright__ = '2008, Kovid Goyal '
-import math, sys, re, numbers
+import math
+import numbers
+import re
+import sys
 
 from calibre.ebooks.lrf.fonts import get_font
-from calibre.ebooks.lrf.pylrs.pylrs import TextBlock, Text, CR, Span, \
-                                             CharButton, Plot, Paragraph, \
-                                             LrsTextTag
-from polyglot.builtins import string_or_bytes, native_string_type
+from calibre.ebooks.lrf.pylrs.pylrs import CR, CharButton, LrsTextTag, Paragraph, Plot, Span, Text, TextBlock
+from polyglot.builtins import native_string_type, string_or_bytes
 
 
 def ceil(num):
diff --git a/src/calibre/ebooks/lrf/input.py b/src/calibre/ebooks/lrf/input.py
index d14def7d79..5d46a201be 100644
--- a/src/calibre/ebooks/lrf/input.py
+++ b/src/calibre/ebooks/lrf/input.py
@@ -8,6 +8,7 @@ __docformat__ = 'restructuredtext en'
 import operator
 import textwrap
 from copy import copy, deepcopy
+
 from lxml import etree
 
 from calibre import guess_type
diff --git a/src/calibre/ebooks/lrf/lrfparser.py b/src/calibre/ebooks/lrf/lrfparser.py
index 29675cc08a..44bf1f80f3 100644
--- a/src/calibre/ebooks/lrf/lrfparser.py
+++ b/src/calibre/ebooks/lrf/lrfparser.py
@@ -2,15 +2,19 @@ __license__   = 'GPL v3'
 __copyright__ = '2008, Kovid Goyal '
 ''''''
 
-import sys, array, os, re, codecs, logging
+import array
+import codecs
+import logging
+import os
+import re
+import sys
 from itertools import chain
 
 from calibre import setup_cli_handlers
+from calibre.ebooks.lrf.meta import LRFMetaFile
+from calibre.ebooks.lrf.objects import BookAttr, Font, PageTree, StyleObject, Text, TOCObject, get_object, ruby_tags
 from calibre.utils.config import OptionParser
 from calibre.utils.filenames import ascii_filename
-from calibre.ebooks.lrf.meta import LRFMetaFile
-from calibre.ebooks.lrf.objects import get_object, PageTree, StyleObject, \
-                                         Font, Text, TOCObject, BookAttr, ruby_tags
 from polyglot.builtins import itervalues
 
 
diff --git a/src/calibre/ebooks/lrf/lrs/convert_from.py b/src/calibre/ebooks/lrf/lrs/convert_from.py
index 94d8e215a9..f1fed2806c 100644
--- a/src/calibre/ebooks/lrf/lrs/convert_from.py
+++ b/src/calibre/ebooks/lrf/lrs/convert_from.py
@@ -9,15 +9,37 @@ import os
 import sys
 
 from calibre import setup_cli_handlers
-from calibre.ebooks.BeautifulSoup import (
-    BeautifulStoneSoup, CData, NavigableString, Tag
-)
+from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, CData, NavigableString, Tag
 from calibre.ebooks.chardet import xml_to_unicode
 from calibre.ebooks.lrf.pylrs.pylrs import (
-    CR, BlockStyle, Bold, Book, BookSetting, Canvas, CharButton, DropCaps, EmpLine,
-    Font, Footer, Header, Image, ImageBlock, ImageStream, Italic, JumpButton, Page,
-    PageStyle, Paragraph, Plot, RuledLine, Span, StyleDefault, Sub, Sup, TextBlock,
-    TextStyle
+    CR,
+    BlockStyle,
+    Bold,
+    Book,
+    BookSetting,
+    Canvas,
+    CharButton,
+    DropCaps,
+    EmpLine,
+    Font,
+    Footer,
+    Header,
+    Image,
+    ImageBlock,
+    ImageStream,
+    Italic,
+    JumpButton,
+    Page,
+    PageStyle,
+    Paragraph,
+    Plot,
+    RuledLine,
+    Span,
+    StyleDefault,
+    Sub,
+    Sup,
+    TextBlock,
+    TextStyle,
 )
 from calibre.utils.config import OptionParser
 from polyglot.builtins import string_or_bytes
diff --git a/src/calibre/ebooks/lrf/meta.py b/src/calibre/ebooks/lrf/meta.py
index b85a9dc78b..7893c66fb7 100644
--- a/src/calibre/ebooks/lrf/meta.py
+++ b/src/calibre/ebooks/lrf/meta.py
@@ -12,14 +12,18 @@ to get and set meta information. For example:
 >>> lrf.category = "History"
 """
 
-import io, struct, zlib, sys, os
-from shutil import copyfileobj
+import io
+import os
+import struct
+import sys
 import xml.dom.minidom as dom
+import zlib
 from functools import wraps
+from shutil import copyfileobj
 
 from calibre.ebooks.chardet import xml_to_unicode
-from calibre.utils.cleantext import clean_xml_chars
 from calibre.ebooks.metadata import MetaInformation, string_to_authors
+from calibre.utils.cleantext import clean_xml_chars
 from polyglot.builtins import string_or_bytes
 
 BYTE      = "'
 '''Read meta information from fb2 files'''
 
-import os, random
+import os
+import random
 from functools import partial
 from string import ascii_letters, digits
 
 from lxml import etree
 
-from calibre import strftime
+from calibre import force_unicode, guess_all_extensions, guess_type, prints, strftime
+from calibre.ebooks.chardet import xml_to_unicode
+from calibre.ebooks.metadata import MetaInformation, check_isbn
 from calibre.utils.date import parse_only_date
 from calibre.utils.img import save_cover_data_to
-from calibre.utils.xml_parse import safe_xml_fromstring
 from calibre.utils.imghdr import identify
-from calibre import guess_type, guess_all_extensions, prints, force_unicode
-from calibre.ebooks.metadata import MetaInformation, check_isbn
-from calibre.ebooks.chardet import xml_to_unicode
+from calibre.utils.xml_parse import safe_xml_fromstring
 from polyglot.binary import as_base64_unicode
 
-
 NAMESPACES = {
     'fb2'   :   'http://www.gribuser.ru/xml/fictionbook/2.0',
     'fb21'  :   'http://www.gribuser.ru/xml/fictionbook/2.1',
@@ -89,7 +88,7 @@ class Context:
 
 
 def get_fb2_data(stream):
-    from calibre.utils.zipfile import ZipFile, BadZipfile
+    from calibre.utils.zipfile import BadZipfile, ZipFile
     pos = stream.tell()
     try:
         zf = ZipFile(stream)
diff --git a/src/calibre/ebooks/metadata/haodoo.py b/src/calibre/ebooks/metadata/haodoo.py
index f446bd66ac..e602ebf213 100644
--- a/src/calibre/ebooks/metadata/haodoo.py
+++ b/src/calibre/ebooks/metadata/haodoo.py
@@ -6,8 +6,8 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kan-Ru Chen '
 __docformat__ = 'restructuredtext en'
 
-from calibre.ebooks.pdb.header import PdbHeaderReader
 from calibre.ebooks.pdb.haodoo.reader import Reader
+from calibre.ebooks.pdb.header import PdbHeaderReader
 
 
 def get_metadata(stream, extract_cover=True):
diff --git a/src/calibre/ebooks/metadata/html.py b/src/calibre/ebooks/metadata/html.py
index 14cb98bbce..00a4f40e42 100644
--- a/src/calibre/ebooks/metadata/html.py
+++ b/src/calibre/ebooks/metadata/html.py
@@ -9,16 +9,16 @@ Try to read metadata from an HTML file.
 
 import re
 import unittest
-
 from collections import defaultdict
+
 from html5_parser import parse
 from lxml.etree import Comment
 
-from calibre.ebooks.metadata import string_to_authors, authors_to_string
-from calibre.ebooks.metadata.book.base import Metadata
+from calibre import isbytestring, replace_entities
 from calibre.ebooks.chardet import xml_to_unicode
-from calibre import replace_entities, isbytestring
-from calibre.utils.date import parse_date, is_date_undefined
+from calibre.ebooks.metadata import authors_to_string, string_to_authors
+from calibre.ebooks.metadata.book.base import Metadata
+from calibre.utils.date import is_date_undefined, parse_date
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/metadata/kdl.py b/src/calibre/ebooks/metadata/kdl.py
index 727cb94a81..37acbb60b3 100644
--- a/src/calibre/ebooks/metadata/kdl.py
+++ b/src/calibre/ebooks/metadata/kdl.py
@@ -5,14 +5,15 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import re, socket
+import re
+import socket
 
 from mechanize import URLError
 
-from calibre.ebooks.metadata.book.base import Metadata
 from calibre import browser
 from calibre.ebooks.BeautifulSoup import BeautifulSoup
 from calibre.ebooks.chardet import xml_to_unicode
+from calibre.ebooks.metadata.book.base import Metadata
 from polyglot.builtins import codepoint_to_chr
 from polyglot.urllib import parse_qs, quote_plus
 
diff --git a/src/calibre/ebooks/metadata/kfx.py b/src/calibre/ebooks/metadata/kfx.py
index 1afae122d2..992cd53048 100644
--- a/src/calibre/ebooks/metadata/kfx.py
+++ b/src/calibre/ebooks/metadata/kfx.py
@@ -5,7 +5,9 @@
 # Based on work of John Howell reversing the KFX format
 # https://www.mobileread.com/forums/showpost.php?p=3176029&postcount=89
 
-import struct, sys, re
+import re
+import struct
+import sys
 from collections import defaultdict
 
 from calibre.ebooks.metadata.book.base import Metadata
@@ -13,8 +15,8 @@ from calibre.ebooks.mobi.utils import decint
 from calibre.utils.cleantext import clean_xml_chars
 from calibre.utils.config_base import tweaks
 from calibre.utils.date import parse_only_date
-from calibre.utils.localization import canonicalize_lang
 from calibre.utils.imghdr import identify
+from calibre.utils.localization import canonicalize_lang
 from polyglot.binary import as_base64_bytes, from_base64_bytes
 
 
diff --git a/src/calibre/ebooks/metadata/meta.py b/src/calibre/ebooks/metadata/meta.py
index f7a9cfc412..1499eb69c6 100644
--- a/src/calibre/ebooks/metadata/meta.py
+++ b/src/calibre/ebooks/metadata/meta.py
@@ -1,14 +1,17 @@
 __license__   = 'GPL v3'
 __copyright__ = '2008, Kovid Goyal '
 
-import os, regex, collections
+import collections
+import os
+
+import regex
 
-from calibre.utils.config import prefs
-from calibre.constants import filesystem_encoding
-from calibre.ebooks.metadata.opf2 import OPF
 from calibre import isbytestring
+from calibre.constants import filesystem_encoding
 from calibre.customize.ui import get_file_type_metadata, set_file_type_metadata
 from calibre.ebooks.metadata import MetaInformation, string_to_authors
+from calibre.ebooks.metadata.opf2 import OPF
+from calibre.utils.config import prefs
 
 # The priorities for loading metadata from different file types
 # Higher values should be used to update metadata from lower values
diff --git a/src/calibre/ebooks/metadata/mobi.py b/src/calibre/ebooks/metadata/mobi.py
index 2ca77b77cd..dbba75145a 100644
--- a/src/calibre/ebooks/metadata/mobi.py
+++ b/src/calibre/ebooks/metadata/mobi.py
@@ -16,7 +16,6 @@ from calibre.utils.imghdr import what
 from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
 from polyglot.builtins import codepoint_to_chr
 
-
 '''
 Retrieve and modify in-place Mobipocket book metadata.
 '''
@@ -478,12 +477,12 @@ def set_metadata(stream, mi):
 
 
 def get_metadata(stream):
+    from calibre import CurrentDir
     from calibre.ebooks.metadata import MetaInformation
-    from calibre.ptempfile import TemporaryDirectory
     from calibre.ebooks.mobi.reader.headers import MetadataHeader
     from calibre.ebooks.mobi.reader.mobi6 import MobiReader
+    from calibre.ptempfile import TemporaryDirectory
     from calibre.utils.img import save_cover_data_to
-    from calibre import CurrentDir
 
     stream.seek(0)
     try:
diff --git a/src/calibre/ebooks/metadata/odt.py b/src/calibre/ebooks/metadata/odt.py
index 0b1e3d7ffa..932a088f05 100644
--- a/src/calibre/ebooks/metadata/odt.py
+++ b/src/calibre/ebooks/metadata/odt.py
@@ -25,17 +25,16 @@ import os
 import re
 
 from lxml.etree import fromstring, tostring
+from odf.draw import Frame as odFrame
+from odf.draw import Image as odImage
+from odf.namespaces import DCNS, METANS, OFFICENS
+from odf.opendocument import load as odLoad
 
-from calibre.ebooks.metadata import (
-    MetaInformation, authors_to_string, check_isbn, string_to_authors
-)
+from calibre.ebooks.metadata import MetaInformation, authors_to_string, check_isbn, string_to_authors
 from calibre.utils.date import isoformat, parse_date
 from calibre.utils.imghdr import identify
 from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
 from calibre.utils.zipfile import ZipFile, safe_replace
-from odf.draw import Frame as odFrame, Image as odImage
-from odf.namespaces import DCNS, METANS, OFFICENS
-from odf.opendocument import load as odLoad
 from polyglot.builtins import as_unicode
 
 fields = {
diff --git a/src/calibre/ebooks/metadata/opf.py b/src/calibre/ebooks/metadata/opf.py
index 7e24154ad9..090d966e68 100644
--- a/src/calibre/ebooks/metadata/opf.py
+++ b/src/calibre/ebooks/metadata/opf.py
@@ -4,10 +4,10 @@
 
 from lxml import etree
 
+from calibre.ebooks.metadata import MetaInformation
 from calibre.ebooks.metadata.opf2 import OPF, pretty_print
 from calibre.ebooks.metadata.opf3 import apply_metadata, read_metadata
-from calibre.ebooks.metadata.utils import parse_opf, normalize_languages, create_manifest_item, parse_opf_version
-from calibre.ebooks.metadata import MetaInformation
+from calibre.ebooks.metadata.utils import create_manifest_item, normalize_languages, parse_opf, parse_opf_version
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/metadata/opf2.py b/src/calibre/ebooks/metadata/opf2.py
index 58b9928bf4..6a5eddf387 100644
--- a/src/calibre/ebooks/metadata/opf2.py
+++ b/src/calibre/ebooks/metadata/opf2.py
@@ -18,6 +18,7 @@ import re
 import sys
 import uuid
 from contextlib import suppress
+
 from lxml import etree
 
 from calibre import guess_type, prints
@@ -26,11 +27,13 @@ from calibre.ebooks import escape_xpath_attr
 from calibre.ebooks.metadata import MetaInformation, check_isbn, string_to_authors
 from calibre.ebooks.metadata.book.base import Metadata
 from calibre.ebooks.metadata.toc import TOC
-from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf as _pretty_print
+from calibre.ebooks.metadata.utils import parse_opf
+from calibre.ebooks.metadata.utils import pretty_print_opf as _pretty_print
 from calibre.utils.cleantext import clean_ascii_chars, clean_xml_chars
 from calibre.utils.config import tweaks
 from calibre.utils.date import isoformat, parse_date
-from calibre.utils.icu import lower as icu_lower, upper as icu_upper
+from calibre.utils.icu import lower as icu_lower
+from calibre.utils.icu import upper as icu_upper
 from calibre.utils.localization import canonicalize_lang, get_lang
 from calibre.utils.xml_parse import safe_xml_fromstring
 from polyglot.builtins import iteritems
@@ -520,9 +523,7 @@ class TitleSortField(MetadataField):
 
 
 def serialize_user_metadata(metadata_elem, all_user_metadata, tail='\n'+(' '*8)):
-    from calibre.ebooks.metadata.book.json_codec import (
-        encode_is_multiple, object_to_unicode,
-    )
+    from calibre.ebooks.metadata.book.json_codec import encode_is_multiple, object_to_unicode
     from calibre.utils.config import to_json
 
     for name, fm in all_user_metadata.items():
@@ -1619,6 +1620,7 @@ class OPFCreator(Metadata):
 
 def metadata_to_opf(mi, as_string=True, default_lang=None):
     import textwrap
+
     from lxml import etree
 
     from calibre.ebooks.oeb.base import DC, OPF
diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py
index 98f3f4a31b..1f44642ab7 100644
--- a/src/calibre/ebooks/metadata/opf3.py
+++ b/src/calibre/ebooks/metadata/opf3.py
@@ -7,27 +7,19 @@ import re
 from collections import defaultdict, namedtuple
 from contextlib import suppress
 from functools import wraps
-from lxml import etree
 from operator import attrgetter
 
+from lxml import etree
+
 from calibre import prints
-from calibre.ebooks.metadata import (
-    authors_to_string, check_isbn, fmt_sidx, string_to_authors
-)
+from calibre.ebooks.metadata import authors_to_string, check_isbn, fmt_sidx, string_to_authors
 from calibre.ebooks.metadata.book.base import Metadata
-from calibre.ebooks.metadata.book.json_codec import (
-    decode_is_multiple, encode_is_multiple, object_to_unicode
-)
-from calibre.ebooks.metadata.utils import (
-    create_manifest_item, ensure_unique, normalize_languages, parse_opf,
-    pretty_print_opf
-)
+from calibre.ebooks.metadata.book.json_codec import decode_is_multiple, encode_is_multiple, object_to_unicode
+from calibre.ebooks.metadata.utils import create_manifest_item, ensure_unique, normalize_languages, parse_opf, pretty_print_opf
 from calibre.ebooks.oeb.base import DC, OPF, OPF2_NSMAP
 from calibre.utils.config import from_json, to_json
-from calibre.utils.date import (
-    fix_only_date, is_date_undefined, isoformat, parse_date as parse_date_, utcnow,
-    w3cdtf
-)
+from calibre.utils.date import fix_only_date, is_date_undefined, isoformat, utcnow, w3cdtf
+from calibre.utils.date import parse_date as parse_date_
 from calibre.utils.iso8601 import parse_iso8601
 from calibre.utils.localization import canonicalize_lang
 from polyglot.builtins import iteritems
diff --git a/src/calibre/ebooks/metadata/opf3_test.py b/src/calibre/ebooks/metadata/opf3_test.py
index db06ad5f78..94be1cb287 100644
--- a/src/calibre/ebooks/metadata/opf3_test.py
+++ b/src/calibre/ebooks/metadata/opf3_test.py
@@ -9,15 +9,52 @@ from io import BytesIO
 from calibre.ebooks.metadata.book import ALL_METADATA_FIELDS
 from calibre.ebooks.metadata.opf2 import OPF
 from calibre.ebooks.metadata.opf3 import (
-    CALIBRE_PREFIX, Author, XPath, apply_metadata, ensure_is_only_raster_cover,
-    ensure_prefix, expand_prefix, parse_prefixes, read_authors, read_book_producers,
-    read_comments, read_identifiers, read_languages, read_last_modified, read_link_maps,
-    read_metadata, read_prefixes, read_pubdate, read_publisher, read_raster_cover,
-    read_rating, read_refines, read_series, read_tags, read_timestamp, read_title,
-    read_title_sort, read_user_categories, read_user_metadata, reserved_prefixes,
-    set_application_id, set_authors, set_book_producers, set_comments, set_identifiers,
-    set_languages, set_link_maps, set_pubdate, set_publisher, set_rating, set_series,
-    set_tags, set_timestamp, set_title, set_user_categories, set_user_metadata,
+    CALIBRE_PREFIX,
+    Author,
+    XPath,
+    apply_metadata,
+    ensure_is_only_raster_cover,
+    ensure_prefix,
+    expand_prefix,
+    parse_prefixes,
+    read_authors,
+    read_book_producers,
+    read_comments,
+    read_identifiers,
+    read_languages,
+    read_last_modified,
+    read_link_maps,
+    read_metadata,
+    read_prefixes,
+    read_pubdate,
+    read_publisher,
+    read_raster_cover,
+    read_rating,
+    read_refines,
+    read_series,
+    read_tags,
+    read_timestamp,
+    read_title,
+    read_title_sort,
+    read_user_categories,
+    read_user_metadata,
+    reserved_prefixes,
+    set_application_id,
+    set_authors,
+    set_book_producers,
+    set_comments,
+    set_identifiers,
+    set_languages,
+    set_link_maps,
+    set_pubdate,
+    set_publisher,
+    set_rating,
+    set_series,
+    set_tags,
+    set_timestamp,
+    set_title,
+    set_user_categories,
+    set_user_metadata,
 )
 
 # This import is needed to prevent a test from running slowly
diff --git a/src/calibre/ebooks/metadata/opf_2_to_3.py b/src/calibre/ebooks/metadata/opf_2_to_3.py
index fda4760db8..c51030345a 100644
--- a/src/calibre/ebooks/metadata/opf_2_to_3.py
+++ b/src/calibre/ebooks/metadata/opf_2_to_3.py
@@ -5,10 +5,24 @@
 from lxml import etree
 
 from calibre.ebooks.metadata.opf3 import (
-    DC, OPF, XPath, create_rating, create_series, create_timestamp,
-    encode_is_multiple, ensure_id, normalize_whitespace, parse_date, read_prefixes,
-    read_refines, read_user_metadata2, refdef, remove_element, set_last_modified,
-    set_refines, set_user_metadata3
+    DC,
+    OPF,
+    XPath,
+    create_rating,
+    create_series,
+    create_timestamp,
+    encode_is_multiple,
+    ensure_id,
+    normalize_whitespace,
+    parse_date,
+    read_prefixes,
+    read_refines,
+    read_user_metadata2,
+    refdef,
+    remove_element,
+    set_last_modified,
+    set_refines,
+    set_user_metadata3,
 )
 from calibre.ebooks.metadata.utils import parse_opf, pretty_print_opf
 from polyglot.builtins import itervalues
diff --git a/src/calibre/ebooks/metadata/pdb.py b/src/calibre/ebooks/metadata/pdb.py
index 4ab2130fd1..783cd77bbe 100644
--- a/src/calibre/ebooks/metadata/pdb.py
+++ b/src/calibre/ebooks/metadata/pdb.py
@@ -9,10 +9,10 @@ __docformat__ = 'restructuredtext en'
 import re
 
 from calibre.ebooks.metadata import MetaInformation
-from calibre.ebooks.pdb.header import PdbHeaderReader
 from calibre.ebooks.metadata.ereader import get_metadata as get_eReader
-from calibre.ebooks.metadata.plucker import get_metadata as get_plucker
 from calibre.ebooks.metadata.haodoo import get_metadata as get_Haodoo
+from calibre.ebooks.metadata.plucker import get_metadata as get_plucker
+from calibre.ebooks.pdb.header import PdbHeaderReader
 
 MREADER = {
     'PNPdPPrs' : get_eReader,
diff --git a/src/calibre/ebooks/metadata/pdf.py b/src/calibre/ebooks/metadata/pdf.py
index 93ff67ad8b..e8897e3d8a 100644
--- a/src/calibre/ebooks/metadata/pdf.py
+++ b/src/calibre/ebooks/metadata/pdf.py
@@ -2,15 +2,17 @@ __license__   = 'GPL v3'
 __copyright__ = '2008, Kovid Goyal '
 '''Read meta information from PDF files'''
 
-import os, subprocess, shutil, re
+import os
+import re
+import shutil
+import subprocess
 from functools import partial
 
 from calibre import prints
 from calibre.constants import iswindows
+from calibre.ebooks.metadata import MetaInformation, check_doi, check_isbn, string_to_authors
 from calibre.ptempfile import TemporaryDirectory
-from calibre.ebooks.metadata import (
-    MetaInformation, string_to_authors, check_isbn, check_doi)
-from calibre.utils.ipc.simple_worker import fork_job, WorkerError
+from calibre.utils.ipc.simple_worker import WorkerError, fork_job
 from polyglot.builtins import iteritems
 
 
diff --git a/src/calibre/ebooks/metadata/plucker.py b/src/calibre/ebooks/metadata/plucker.py
index 4fedecb0f4..e478809059 100644
--- a/src/calibre/ebooks/metadata/plucker.py
+++ b/src/calibre/ebooks/metadata/plucker.py
@@ -11,8 +11,7 @@ from datetime import datetime
 
 from calibre.ebooks.metadata import MetaInformation
 from calibre.ebooks.pdb.header import PdbHeaderReader
-from calibre.ebooks.pdb.plucker.reader import SectionHeader, DATATYPE_METADATA, \
-    MIBNUM_TO_NAME
+from calibre.ebooks.pdb.plucker.reader import DATATYPE_METADATA, MIBNUM_TO_NAME, SectionHeader
 
 
 def get_metadata(stream, extract_cover=True):
diff --git a/src/calibre/ebooks/metadata/pml.py b/src/calibre/ebooks/metadata/pml.py
index b9ebb98f8f..db33a946d5 100644
--- a/src/calibre/ebooks/metadata/pml.py
+++ b/src/calibre/ebooks/metadata/pml.py
@@ -7,14 +7,14 @@ Read meta information from TXT files
 '''
 
 
-import os
 import glob
+import os
 import re
 
+from calibre import prepare_string_for_xml
 from calibre.ebooks.metadata import MetaInformation
 from calibre.ptempfile import TemporaryDirectory
 from calibre.utils.zipfile import ZipFile
-from calibre import prepare_string_for_xml
 
 
 def get_metadata(stream, extract_cover=True):
diff --git a/src/calibre/ebooks/metadata/rb.py b/src/calibre/ebooks/metadata/rb.py
index 4140ab3c55..b19a995346 100644
--- a/src/calibre/ebooks/metadata/rb.py
+++ b/src/calibre/ebooks/metadata/rb.py
@@ -2,7 +2,8 @@ __license__   = 'GPL v3'
 __copyright__ = '2008, Ashish Kulkarni '
 '''Read meta information from RB files'''
 
-import sys, struct
+import struct
+import sys
 
 from calibre import prints
 from calibre.ebooks.metadata import MetaInformation, string_to_authors
diff --git a/src/calibre/ebooks/metadata/rtf.py b/src/calibre/ebooks/metadata/rtf.py
index 103bc35746..07af613fa2 100644
--- a/src/calibre/ebooks/metadata/rtf.py
+++ b/src/calibre/ebooks/metadata/rtf.py
@@ -10,7 +10,7 @@ import re
 
 from calibre import force_unicode
 from calibre.ebooks.metadata import MetaInformation
-from polyglot.builtins import codepoint_to_chr, string_or_bytes, int_to_byte
+from polyglot.builtins import codepoint_to_chr, int_to_byte, string_or_bytes
 
 title_pat    = re.compile(br'\{\\info.*?\{\\title(.*?)(?'
 
-import os
 import io
+import os
+
 from calibre.ebooks.metadata import MetaInformation
 from calibre.ebooks.snb.snbfile import SNBFile
 from calibre.utils.xml_parse import safe_xml_fromstring
diff --git a/src/calibre/ebooks/metadata/sources/amazon.py b/src/calibre/ebooks/metadata/sources/amazon.py
index bca6926c8d..4db563e676 100644
--- a/src/calibre/ebooks/metadata/sources/amazon.py
+++ b/src/calibre/ebooks/metadata/sources/amazon.py
@@ -1755,10 +1755,7 @@ class Amazon(Source):
 def manual_tests(domain, **kw):  # {{{
     # To run these test use:
     # calibre-debug -c "from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')"
-    from calibre.ebooks.metadata.sources.test import (
-        authors_test, comments_test, isbn_test, series_test, test_identify_plugin,
-        title_test,
-    )
+    from calibre.ebooks.metadata.sources.test import authors_test, comments_test, isbn_test, series_test, test_identify_plugin, title_test
     all_tests = {}
     all_tests['com'] = [  # {{{
         (   # Paperback with series
diff --git a/src/calibre/ebooks/metadata/sources/base.py b/src/calibre/ebooks/metadata/sources/base.py
index 562d9b7ea6..62148400f8 100644
--- a/src/calibre/ebooks/metadata/sources/base.py
+++ b/src/calibre/ebooks/metadata/sources/base.py
@@ -6,7 +6,8 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import re, threading
+import re
+import threading
 from functools import total_ordering
 
 from calibre import browser, random_user_agent
@@ -14,11 +15,11 @@ from calibre.customize import Plugin
 from calibre.ebooks.metadata import check_isbn
 from calibre.ebooks.metadata.author_mapper import cap_author_token
 from calibre.utils.localization import canonicalize_lang, get_lang
-from polyglot.builtins import iteritems, cmp
+from polyglot.builtins import cmp, iteritems
 
 
 def create_log(ostream=None):
-    from calibre.utils.logging import ThreadSafeLog, FileStream
+    from calibre.utils.logging import FileStream, ThreadSafeLog
     log = ThreadSafeLog(level=ThreadSafeLog.DEBUG)
     log.outputs = [FileStream(ostream)]
     return log
@@ -441,8 +442,8 @@ class Source(Plugin):
         if not urls:
             log('No images found for, title: %r and authors: %r'%(title, authors))
             return
-        from threading import Thread
         import time
+        from threading import Thread
         if prefs_name:
             urls = urls[:self.prefs[prefs_name]]
         if get_best_cover:
diff --git a/src/calibre/ebooks/metadata/sources/big_book_search.py b/src/calibre/ebooks/metadata/sources/big_book_search.py
index 68d5eed464..78305483e7 100644
--- a/src/calibre/ebooks/metadata/sources/big_book_search.py
+++ b/src/calibre/ebooks/metadata/sources/big_book_search.py
@@ -6,11 +6,12 @@ __license__   = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-from calibre.ebooks.metadata.sources.base import Source, Option
+from calibre.ebooks.metadata.sources.base import Option, Source
 
 
 def get_urls(br, tokens):
     from urllib.parse import quote_plus
+
     from html5_parser import parse
     escaped = (quote_plus(x) for x in tokens if x and x.strip())
     q = '+'.join(escaped)
@@ -45,8 +46,9 @@ class BigBookSearch(Source):
 
 
 def test():
-    from calibre import browser
     import pprint
+
+    from calibre import browser
     br = browser()
     urls = get_urls(br, ['consider', 'phlebas', 'banks'])
     pprint.pprint(urls)
diff --git a/src/calibre/ebooks/metadata/sources/cli.py b/src/calibre/ebooks/metadata/sources/cli.py
index bd37f57a2e..8d191209d3 100644
--- a/src/calibre/ebooks/metadata/sources/cli.py
+++ b/src/calibre/ebooks/metadata/sources/cli.py
@@ -11,14 +11,14 @@ from threading import Event
 
 from calibre import prints
 from calibre.customize.ui import all_metadata_plugins
-from calibre.utils.config import OptionParser
-from calibre.utils.img import save_cover_data_to
 from calibre.ebooks.metadata import string_to_authors
 from calibre.ebooks.metadata.opf2 import metadata_to_opf
 from calibre.ebooks.metadata.sources.base import create_log
-from calibre.ebooks.metadata.sources.identify import identify
 from calibre.ebooks.metadata.sources.covers import download_cover
+from calibre.ebooks.metadata.sources.identify import identify
 from calibre.ebooks.metadata.sources.update import patch_plugins
+from calibre.utils.config import OptionParser
+from calibre.utils.img import save_cover_data_to
 
 
 def option_parser():
diff --git a/src/calibre/ebooks/metadata/sources/covers.py b/src/calibre/ebooks/metadata/sources/covers.py
index a7a12d652a..270e09738b 100644
--- a/src/calibre/ebooks/metadata/sources/covers.py
+++ b/src/calibre/ebooks/metadata/sources/covers.py
@@ -7,15 +7,15 @@ __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
 import time
-from threading import Thread, Event
 from io import StringIO
+from threading import Event, Thread
 
 from calibre.customize.ui import metadata_plugins
 from calibre.ebooks.metadata.sources.base import create_log
 from calibre.ebooks.metadata.sources.prefs import msprefs
-from calibre.utils.img import save_cover_data_to, remove_borders_from_image, image_to_data, image_from_data
+from calibre.utils.img import image_from_data, image_to_data, remove_borders_from_image, save_cover_data_to
 from calibre.utils.imghdr import identify
-from polyglot.queue import Queue, Empty
+from polyglot.queue import Empty, Queue
 
 
 class Worker(Thread):
diff --git a/src/calibre/ebooks/metadata/sources/edelweiss.py b/src/calibre/ebooks/metadata/sources/edelweiss.py
index 0d0501daf4..0326e22995 100644
--- a/src/calibre/ebooks/metadata/sources/edelweiss.py
+++ b/src/calibre/ebooks/metadata/sources/edelweiss.py
@@ -6,8 +6,10 @@ __license__   = 'GPL v3'
 __copyright__ = '2013, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import time, re
+import re
+import time
 from threading import Thread
+
 try:
     from queue import Empty, Queue
 except ImportError:
@@ -106,6 +108,7 @@ class Worker(Thread):  # {{{
 
     def render_comments(self, desc):
         from lxml import etree
+
         from calibre.library.comments import sanitize_comments_html
         for c in desc.xpath('descendant::noscript'):
             c.getparent().remove(c)
@@ -126,8 +129,9 @@ class Worker(Thread):  # {{{
 
 
 def get_basic_data(browser, log, *skus):
-    from calibre.utils.date import parse_only_date
     from mechanize import Request
+
+    from calibre.utils.date import parse_only_date
     zeroes = ','.join('0' for sku in skus)
     data = {
             'skus': ','.join(skus),
@@ -377,8 +381,7 @@ class Edelweiss(Source):
 
 
 if __name__ == '__main__':
-    from calibre.ebooks.metadata.sources.test import (
-        test_identify_plugin, title_test, authors_test, comments_test, pubdate_test)
+    from calibre.ebooks.metadata.sources.test import authors_test, comments_test, pubdate_test, test_identify_plugin, title_test
     tests = [
         (  # A title and author search
          {'title': 'The Husband\'s Secret', 'authors':['Liane Moriarty']},
diff --git a/src/calibre/ebooks/metadata/sources/google.py b/src/calibre/ebooks/metadata/sources/google.py
index b9b1c244bc..5dee08e26b 100644
--- a/src/calibre/ebooks/metadata/sources/google.py
+++ b/src/calibre/ebooks/metadata/sources/google.py
@@ -2,20 +2,22 @@
 # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
 # License: GPLv3 Copyright: 2011, Kovid Goyal 
 from __future__ import absolute_import, division, print_function, unicode_literals
+
 import hashlib
 import os
 import re
-import regex
 import sys
 import tempfile
 import time
 
+import regex
+
 try:
     from queue import Empty, Queue
 except ImportError:
     from Queue import Empty, Queue
 
-from calibre import as_unicode, replace_entities, prepare_string_for_xml
+from calibre import as_unicode, prepare_string_for_xml, replace_entities
 from calibre.ebooks.chardet import xml_to_unicode
 from calibre.ebooks.metadata import authors_to_string, check_isbn
 from calibre.ebooks.metadata.book.base import Metadata
@@ -543,9 +545,7 @@ class GoogleBooks(Source):
 if __name__ == '__main__':  # tests {{{
     # To run these test use:
     # calibre-debug src/calibre/ebooks/metadata/sources/google.py
-    from calibre.ebooks.metadata.sources.test import (
-        authors_test, test_identify_plugin, title_test
-    )
+    from calibre.ebooks.metadata.sources.test import authors_test, test_identify_plugin, title_test
     tests = [
     ({
         'identifiers': {'google': 's7NIrgEACAAJ'},
diff --git a/src/calibre/ebooks/metadata/sources/google_images.py b/src/calibre/ebooks/metadata/sources/google_images.py
index 08631e082e..8a9521a272 100644
--- a/src/calibre/ebooks/metadata/sources/google_images.py
+++ b/src/calibre/ebooks/metadata/sources/google_images.py
@@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en'
 from collections import OrderedDict
 
 from calibre import random_user_agent
-from calibre.ebooks.metadata.sources.base import Source, Option
+from calibre.ebooks.metadata.sources.base import Option, Source
 
 
 def parse_html(raw):
@@ -108,8 +108,8 @@ class GoogleImages(Source):
         # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies
         br.set_simple_cookie('CONSENT', 'PENDING+987', '.google.com', path='/')
         template = b'\x08\x01\x128\x08\x14\x12+boq_identityfrontenduiserver_20231107.05_p0\x1a\x05en-US \x03\x1a\x06\x08\x80\xf1\xca\xaa\x06'
-        from datetime import date
         from base64 import standard_b64encode
+        from datetime import date
         template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))
         br.set_simple_cookie('SOCS', standard_b64encode(template).decode('ascii').rstrip('='), '.google.com', path='/')
         # br.set_debug_http(True)
@@ -136,6 +136,7 @@ def test():
     except ImportError:
         from Queue import Queue
     from threading import Event
+
     from calibre.utils.logging import default_log
     p = GoogleImages(None)
     p.log = default_log
diff --git a/src/calibre/ebooks/metadata/sources/identify.py b/src/calibre/ebooks/metadata/sources/identify.py
index d400b25dea..99f82daf11 100644
--- a/src/calibre/ebooks/metadata/sources/identify.py
+++ b/src/calibre/ebooks/metadata/sources/identify.py
@@ -6,8 +6,8 @@ __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
 import re
-import unicodedata
 import time
+import unicodedata
 from datetime import datetime
 from io import StringIO
 from operator import attrgetter
@@ -23,7 +23,7 @@ from calibre.utils.date import UNDEFINED_DATE, as_utc, utc_tz
 from calibre.utils.formatter import EvalFormatter
 from calibre.utils.html2text import html2text
 from calibre.utils.icu import lower, primary_sort_key
-from polyglot.builtins import iteritems, itervalues, as_unicode
+from polyglot.builtins import as_unicode, iteritems, itervalues
 from polyglot.queue import Empty, Queue
 from polyglot.urllib import quote, urlparse
 
@@ -640,9 +640,7 @@ def urls_from_identifiers(identifiers, sort_results=False):  # {{{
 
 def tests(start=0, limit=256):  # tests {{{
     # To run these test use: calibre-debug -c "from calibre.ebooks.metadata.sources.identify import tests; tests()"
-    from calibre.ebooks.metadata.sources.test import (
-        authors_test, test_identify, title_test
-    )
+    from calibre.ebooks.metadata.sources.test import authors_test, test_identify, title_test
     tests = [
             (
                 {'title':'Magykal Papers',
diff --git a/src/calibre/ebooks/metadata/sources/search_engines.py b/src/calibre/ebooks/metadata/sources/search_engines.py
index 765e66bbbd..32a3a22d87 100644
--- a/src/calibre/ebooks/metadata/sources/search_engines.py
+++ b/src/calibre/ebooks/metadata/sources/search_engines.py
@@ -3,25 +3,29 @@
 # License: GPLv3 Copyright: 2017, Kovid Goyal 
 
 from __future__ import absolute_import, division, print_function, unicode_literals
+
 import json
-import sys
 import os
 import re
+import sys
 import time
 from collections import namedtuple
 from contextlib import contextmanager
-from threading import Lock
 from functools import partial
+from threading import Lock
 
 try:
-    from urllib.parse import parse_qs, quote_plus, urlencode, quote, urlparse
+    from urllib.parse import parse_qs, quote, quote_plus, urlencode, urlparse
 except ImportError:
+    from urllib import quote, quote_plus, urlencode
+
     from urlparse import parse_qs, urlparse
-    from urllib import quote_plus, urlencode, quote
 
 from lxml import etree
 
-from calibre import browser as _browser, prints as safe_print, random_user_agent
+from calibre import browser as _browser
+from calibre import prints as safe_print
+from calibre import random_user_agent
 from calibre.constants import cache_dir
 from calibre.ebooks.chardet import xml_to_unicode
 from calibre.utils.lock import ExclusiveFile
@@ -333,8 +337,8 @@ def google_parse_results(root, raw, log=prints, ignore_uncached=True):
 
 def google_consent_cookies():
     # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies
-    from datetime import date
     from base64 import standard_b64encode
+    from datetime import date
     base = {'domain': '.google.com', 'path': '/'}
     b = base.copy()
     b['name'], b['value'] = 'CONSENT', 'PENDING+987'
diff --git a/src/calibre/ebooks/metadata/sources/worker.py b/src/calibre/ebooks/metadata/sources/worker.py
index 98d3ddf686..66d5122ad8 100644
--- a/src/calibre/ebooks/metadata/sources/worker.py
+++ b/src/calibre/ebooks/metadata/sources/worker.py
@@ -3,8 +3,8 @@
 # License: GPLv3 Copyright: 2012, Kovid Goyal 
 import os
 from collections import Counter
-from io import BytesIO
 from functools import wraps
+from io import BytesIO
 from threading import Event, Thread
 
 from calibre.customize.ui import metadata_plugins
diff --git a/src/calibre/ebooks/metadata/tag_mapper.py b/src/calibre/ebooks/metadata/tag_mapper.py
index 5143c7fbcd..904dc0038f 100644
--- a/src/calibre/ebooks/metadata/tag_mapper.py
+++ b/src/calibre/ebooks/metadata/tag_mapper.py
@@ -4,7 +4,8 @@
 
 from collections import deque
 
-from calibre.utils.icu import lower as icu_lower, upper as icu_upper
+from calibre.utils.icu import lower as icu_lower
+from calibre.utils.icu import upper as icu_upper
 from polyglot.builtins import as_unicode
 
 
diff --git a/src/calibre/ebooks/metadata/toc.py b/src/calibre/ebooks/metadata/toc.py
index 68d1ceb164..80956e3ac7 100644
--- a/src/calibre/ebooks/metadata/toc.py
+++ b/src/calibre/ebooks/metadata/toc.py
@@ -4,7 +4,10 @@
 __license__   = 'GPL v3'
 __copyright__ = '2010, Kovid Goyal '
 
-import os, glob, re, functools
+import functools
+import glob
+import os
+import re
 from collections import Counter
 
 from lxml import etree
@@ -12,8 +15,8 @@ from lxml.builder import ElementMaker
 
 from calibre.constants import __appname__, __version__
 from calibre.ebooks.chardet import xml_to_unicode
-from calibre.utils.xml_parse import safe_xml_fromstring
 from calibre.utils.cleantext import clean_xml_chars
+from calibre.utils.xml_parse import safe_xml_fromstring
 from polyglot.urllib import unquote, urlparse
 
 NCX_NS = "http://www.daisy.org/z3986/2005/ncx/"
@@ -25,8 +28,9 @@ C = ElementMaker(namespace=CALIBRE_NS, nsmap=NSMAP)
 
 def parse_html_toc(data):
     from html5_parser import parse
-    from calibre.utils.cleantext import clean_xml_chars
     from lxml import etree
+
+    from calibre.utils.cleantext import clean_xml_chars
     if isinstance(data, bytes):
         data = xml_to_unicode(data, strip_encoding_pats=True, resolve_entities=True)[0]
     root = parse(clean_xml_chars(data), maybe_xhtml=True, keep_doctype=False, sanitize_names=True)
diff --git a/src/calibre/ebooks/metadata/topaz.py b/src/calibre/ebooks/metadata/topaz.py
index df123fa59e..137f750dda 100644
--- a/src/calibre/ebooks/metadata/topaz.py
+++ b/src/calibre/ebooks/metadata/topaz.py
@@ -3,11 +3,13 @@ __copyright__ = '2010, Greg Riker '
 __docformat__ = 'restructuredtext en'
 
 ''' Read/write metadata from Amazon's topaz format '''
-import io, sys, numbers
+import io
+import numbers
+import sys
 from struct import pack
 
-from calibre.ebooks.metadata import MetaInformation
 from calibre import force_unicode
+from calibre.ebooks.metadata import MetaInformation
 from polyglot.builtins import codepoint_to_chr, int_to_byte
 
 
diff --git a/src/calibre/ebooks/metadata/txt.py b/src/calibre/ebooks/metadata/txt.py
index 366fefdc84..496ee9c03f 100644
--- a/src/calibre/ebooks/metadata/txt.py
+++ b/src/calibre/ebooks/metadata/txt.py
@@ -5,7 +5,8 @@ __copyright__ = '2009, John Schember '
 Read meta information from TXT files
 '''
 
-import re, os
+import os
+import re
 
 from calibre.ebooks.metadata import MetaInformation
 
diff --git a/src/calibre/ebooks/metadata/xisbn.py b/src/calibre/ebooks/metadata/xisbn.py
index d97c867549..571e318fa0 100644
--- a/src/calibre/ebooks/metadata/xisbn.py
+++ b/src/calibre/ebooks/metadata/xisbn.py
@@ -5,7 +5,9 @@ __license__   = 'GPL v3'
 __copyright__ = '2010, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import threading, re, json
+import json
+import re
+import threading
 
 from calibre import browser
 
@@ -101,7 +103,8 @@ class xISBN:
 xisbn = xISBN()
 
 if __name__ == '__main__':
-    import sys, pprint
+    import pprint
+    import sys
     isbn = sys.argv[-1]
     print(pprint.pprint(xisbn.get_data(isbn)))
     print()
diff --git a/src/calibre/ebooks/metadata/xmp.py b/src/calibre/ebooks/metadata/xmp.py
index b7c72992d3..1dfabe3194 100644
--- a/src/calibre/ebooks/metadata/xmp.py
+++ b/src/calibre/ebooks/metadata/xmp.py
@@ -4,20 +4,23 @@
 __license__ = 'GPL v3'
 __copyright__ = '2014, Kovid Goyal '
 
-import re, sys, copy, json
-from itertools import repeat
+import copy
+import json
+import re
+import sys
 from collections import defaultdict
+from itertools import repeat
 
 from lxml import etree
 from lxml.builder import ElementMaker
 
 from calibre import prints
-from calibre.ebooks.metadata import string_to_authors, check_isbn, check_doi
-from calibre.utils.xml_parse import safe_xml_fromstring
+from calibre.ebooks.metadata import check_doi, check_isbn, string_to_authors
 from calibre.ebooks.metadata.book.base import Metadata
 from calibre.ebooks.metadata.opf2 import dump_dict
-from calibre.utils.date import parse_date, isoformat, now
+from calibre.utils.date import isoformat, now, parse_date
 from calibre.utils.localization import canonicalize_lang, lang_as_iso639_1
+from calibre.utils.xml_parse import safe_xml_fromstring
 from polyglot.builtins import iteritems, string_or_bytes
 
 _xml_declaration = re.compile(r'<\?xml[^<>]+encoding\s*=\s*[\'"](.*?)[\'"][^<>]*>', re.IGNORECASE)
@@ -172,8 +175,8 @@ def read_series(root):
 
 
 def read_user_metadata(mi, root):
-    from calibre.utils.config import from_json
     from calibre.ebooks.metadata.book.json_codec import decode_is_multiple
+    from calibre.utils.config import from_json
     fields = set()
     for item in XPath('//calibre:custom_metadata')(root):
         for li in XPath('./rdf:Bag/rdf:li')(item):
@@ -442,8 +445,8 @@ def create_series(calibre, series, series_index):
 
 
 def create_user_metadata(calibre, all_user_metadata):
+    from calibre.ebooks.metadata.book.json_codec import encode_is_multiple, object_to_unicode
     from calibre.utils.config import to_json
-    from calibre.ebooks.metadata.book.json_codec import object_to_unicode, encode_is_multiple
 
     s = calibre.makeelement(expand('calibre:custom_metadata'))
     calibre.append(s)
diff --git a/src/calibre/ebooks/metadata/zip.py b/src/calibre/ebooks/metadata/zip.py
index e900c32616..ba91a1a352 100644
--- a/src/calibre/ebooks/metadata/zip.py
+++ b/src/calibre/ebooks/metadata/zip.py
@@ -3,14 +3,14 @@ __copyright__ = '2008, Kovid Goyal '
 
 import os
 
-from calibre.utils.zipfile import ZipFile
-from calibre.ptempfile import TemporaryDirectory
 from calibre import CurrentDir
+from calibre.ptempfile import TemporaryDirectory
+from calibre.utils.zipfile import ZipFile
 
 
 def get_metadata(stream):
-    from calibre.ebooks.metadata.meta import get_metadata
     from calibre.ebooks.metadata.archive import is_comic
+    from calibre.ebooks.metadata.meta import get_metadata
     stream_type = None
     zf = ZipFile(stream, 'r')
     names = zf.namelist()
diff --git a/src/calibre/ebooks/mobi/debug/headers.py b/src/calibre/ebooks/mobi/debug/headers.py
index 59e62f68f0..15677599f6 100644
--- a/src/calibre/ebooks/mobi/debug/headers.py
+++ b/src/calibre/ebooks/mobi/debug/headers.py
@@ -5,13 +5,17 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import struct, datetime, os, numbers, binascii
+import binascii
+import datetime
+import numbers
+import os
+import struct
 
-from calibre.utils.date import utc_tz
-from calibre.ebooks.mobi.reader.headers import NULL_INDEX
-from calibre.ebooks.mobi.langcodes import main_language, sub_language
 from calibre.ebooks.mobi.debug import format_bytes
+from calibre.ebooks.mobi.langcodes import main_language, sub_language
+from calibre.ebooks.mobi.reader.headers import NULL_INDEX
 from calibre.ebooks.mobi.utils import get_trailing_data
+from calibre.utils.date import utc_tz
 from polyglot.builtins import iteritems
 
 # PalmDB {{{
diff --git a/src/calibre/ebooks/mobi/debug/index.py b/src/calibre/ebooks/mobi/debug/index.py
index 7ded8ab4d2..d9369ff5ab 100644
--- a/src/calibre/ebooks/mobi/debug/index.py
+++ b/src/calibre/ebooks/mobi/debug/index.py
@@ -9,10 +9,7 @@ import struct
 from collections import OrderedDict, namedtuple
 
 from calibre.ebooks.mobi.reader.headers import NULL_INDEX
-from calibre.ebooks.mobi.reader.index import (
-    CNCX, INDEX_HEADER_FIELDS, get_tag_section_start, parse_index_record,
-    parse_indx_header, parse_tagx_section
-)
+from calibre.ebooks.mobi.reader.index import CNCX, INDEX_HEADER_FIELDS, get_tag_section_start, parse_index_record, parse_indx_header, parse_tagx_section
 from calibre.ebooks.mobi.reader.ncx import default_entry, tag_fieldname_map
 from polyglot.builtins import iteritems
 
diff --git a/src/calibre/ebooks/mobi/debug/main.py b/src/calibre/ebooks/mobi/debug/main.py
index de7fc6f7d4..b2edacd7d6 100644
--- a/src/calibre/ebooks/mobi/debug/main.py
+++ b/src/calibre/ebooks/mobi/debug/main.py
@@ -5,7 +5,9 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import sys, os, shutil
+import os
+import shutil
+import sys
 
 from calibre.ebooks.mobi.debug.headers import MOBIFile
 from calibre.ebooks.mobi.debug.mobi6 import inspect_mobi as inspect_mobi6
diff --git a/src/calibre/ebooks/mobi/debug/mobi6.py b/src/calibre/ebooks/mobi/debug/mobi6.py
index 32193b9bd2..5cc26b8961 100644
--- a/src/calibre/ebooks/mobi/debug/mobi6.py
+++ b/src/calibre/ebooks/mobi/debug/mobi6.py
@@ -5,20 +5,20 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import struct, sys, os
+import os
+import struct
+import sys
 from collections import OrderedDict, defaultdict
 
 from lxml import html
 
-from calibre.ebooks.mobi.reader.headers import NULL_INDEX
-from calibre.ebooks.mobi.reader.index import (parse_index_record,
-        parse_tagx_section)
-from calibre.ebooks.mobi.utils import (decode_hex_number, decint,
-        decode_tbs, read_font_record)
-from calibre.utils.imghdr import what
 from calibre.ebooks.mobi.debug import format_bytes
 from calibre.ebooks.mobi.debug.headers import TextRecord
-from polyglot.builtins import iteritems, as_bytes, print_to_binary_file
+from calibre.ebooks.mobi.reader.headers import NULL_INDEX
+from calibre.ebooks.mobi.reader.index import parse_index_record, parse_tagx_section
+from calibre.ebooks.mobi.utils import decint, decode_hex_number, decode_tbs, read_font_record
+from calibre.utils.imghdr import what
+from polyglot.builtins import as_bytes, iteritems, print_to_binary_file
 
 
 class TagX:  # {{{
diff --git a/src/calibre/ebooks/mobi/debug/mobi8.py b/src/calibre/ebooks/mobi/debug/mobi8.py
index a9aa0f5fc8..b307caedb3 100644
--- a/src/calibre/ebooks/mobi/debug/mobi8.py
+++ b/src/calibre/ebooks/mobi/debug/mobi8.py
@@ -5,16 +5,18 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import sys, os, struct, textwrap
+import os
+import struct
+import sys
+import textwrap
 
 from calibre import CurrentDir
+from calibre.ebooks.mobi.debug import format_bytes
 from calibre.ebooks.mobi.debug.containers import ContainerHeader
 from calibre.ebooks.mobi.debug.headers import TextRecord
-from calibre.ebooks.mobi.debug.index import (SKELIndex, SECTIndex, NCXIndex,
-        GuideIndex)
-from calibre.ebooks.mobi.utils import read_font_record, decode_tbs, RECORD_SIZE
-from calibre.ebooks.mobi.debug import format_bytes
+from calibre.ebooks.mobi.debug.index import GuideIndex, NCXIndex, SECTIndex, SKELIndex
 from calibre.ebooks.mobi.reader.headers import NULL_INDEX
+from calibre.ebooks.mobi.utils import RECORD_SIZE, decode_tbs, read_font_record
 from calibre.utils.imghdr import what
 from polyglot.builtins import iteritems, itervalues, print_to_binary_file
 
@@ -223,9 +225,15 @@ class MOBIFile:
                 payload))
 
     def read_tbs(self):
-        from calibre.ebooks.mobi.writer8.tbs import (Entry, DOC,
-                collect_indexing_data, encode_strands_as_sequences,
-                sequences_to_bytes, calculate_all_tbs, NegativeStrandIndex)
+        from calibre.ebooks.mobi.writer8.tbs import (
+            DOC,
+            Entry,
+            NegativeStrandIndex,
+            calculate_all_tbs,
+            collect_indexing_data,
+            encode_strands_as_sequences,
+            sequences_to_bytes,
+        )
         entry_map = []
         for index in self.ncx_index:
             vals = list(index)[:-1] + [None, None, None, None]
diff --git a/src/calibre/ebooks/mobi/langcodes.py b/src/calibre/ebooks/mobi/langcodes.py
index 7f027de127..26b22ce847 100644
--- a/src/calibre/ebooks/mobi/langcodes.py
+++ b/src/calibre/ebooks/mobi/langcodes.py
@@ -6,6 +6,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
 __docformat__ = 'restructuredtext en'
 
 from struct import pack
+
 from calibre.utils.localization import lang_as_iso639_1
 
 lang_codes = {
diff --git a/src/calibre/ebooks/mobi/mobiml.py b/src/calibre/ebooks/mobi/mobiml.py
index f9a3b6c195..3d6aa19148 100644
--- a/src/calibre/ebooks/mobi/mobiml.py
+++ b/src/calibre/ebooks/mobi/mobiml.py
@@ -9,12 +9,11 @@ import copy
 import numbers
 import re
 from contextlib import suppress
+
 from lxml import etree
 
 from calibre.ebooks.mobi.utils import convert_color_for_font_tag
-from calibre.ebooks.oeb.base import (
-    XHTML, XHTML_NS, barename, namespace, urlnormalize
-)
+from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, urlnormalize
 from calibre.ebooks.oeb.stylizer import Stylizer
 from calibre.ebooks.oeb.transforms.flatcss import KeyMapper
 from calibre.utils.imghdr import identify
diff --git a/src/calibre/ebooks/mobi/reader/containers.py b/src/calibre/ebooks/mobi/reader/containers.py
index fcdd1120b5..5d367cd823 100644
--- a/src/calibre/ebooks/mobi/reader/containers.py
+++ b/src/calibre/ebooks/mobi/reader/containers.py
@@ -4,7 +4,7 @@
 __license__ = 'GPL v3'
 __copyright__ = '2014, Kovid Goyal '
 
-from struct import unpack_from, error
+from struct import error, unpack_from
 
 from calibre.utils.imghdr import what
 
diff --git a/src/calibre/ebooks/mobi/reader/headers.py b/src/calibre/ebooks/mobi/reader/headers.py
index 1f2419fbcb..9f0021cc43 100644
--- a/src/calibre/ebooks/mobi/reader/headers.py
+++ b/src/calibre/ebooks/mobi/reader/headers.py
@@ -5,16 +5,18 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import struct, re, os
+import os
+import re
+import struct
 
 from calibre import replace_entities
-from calibre.utils.date import parse_date
-from calibre.ebooks.mobi import MobiError
 from calibre.ebooks.metadata import MetaInformation, check_isbn
-from calibre.ebooks.mobi.langcodes import main_language, sub_language, mobi2iana
+from calibre.ebooks.mobi import MobiError
+from calibre.ebooks.mobi.langcodes import main_language, mobi2iana, sub_language
 from calibre.utils.cleantext import clean_ascii_chars, clean_xml_chars
-from calibre.utils.localization import canonicalize_lang
 from calibre.utils.config_base import tweaks
+from calibre.utils.date import parse_date
+from calibre.utils.localization import canonicalize_lang
 
 NULL_INDEX = 0xffffffff
 
diff --git a/src/calibre/ebooks/mobi/reader/index.py b/src/calibre/ebooks/mobi/reader/index.py
index 27f2b06eb1..aeb2f5d1d7 100644
--- a/src/calibre/ebooks/mobi/reader/index.py
+++ b/src/calibre/ebooks/mobi/reader/index.py
@@ -8,8 +8,7 @@ __docformat__ = 'restructuredtext en'
 import struct
 from collections import OrderedDict, namedtuple
 
-from calibre.ebooks.mobi.utils import (decint, count_set_bits,
-        decode_string)
+from calibre.ebooks.mobi.utils import count_set_bits, decint, decode_string
 from polyglot.builtins import iteritems
 
 TagX = namedtuple('TagX', 'tag num_of_values bitmask eof')
diff --git a/src/calibre/ebooks/mobi/reader/markup.py b/src/calibre/ebooks/mobi/reader/markup.py
index 34c54d2ea4..3578d63dcb 100644
--- a/src/calibre/ebooks/mobi/reader/markup.py
+++ b/src/calibre/ebooks/mobi/reader/markup.py
@@ -5,7 +5,8 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import re, os
+import os
+import re
 
 from calibre.ebooks.chardet import strip_encoding_declarations
 
diff --git a/src/calibre/ebooks/mobi/reader/mobi6.py b/src/calibre/ebooks/mobi/reader/mobi6.py
index 75e43a1926..12fc7cd6bf 100644
--- a/src/calibre/ebooks/mobi/reader/mobi6.py
+++ b/src/calibre/ebooks/mobi/reader/mobi6.py
@@ -11,6 +11,7 @@ import re
 import shutil
 import struct
 import textwrap
+
 from lxml import etree, html
 
 from calibre import entity_to_unicode, guess_type, xml_entity_to_unicode
diff --git a/src/calibre/ebooks/mobi/reader/mobi8.py b/src/calibre/ebooks/mobi/reader/mobi8.py
index c1aa6acb0b..558dfb7da0 100644
--- a/src/calibre/ebooks/mobi/reader/mobi8.py
+++ b/src/calibre/ebooks/mobi/reader/mobi8.py
@@ -5,23 +5,25 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import struct, re, os
+import os
+import re
+import struct
 from collections import namedtuple
 from itertools import repeat
 from uuid import uuid4
 
 from lxml import etree
 
-from calibre.ebooks.mobi.reader.headers import NULL_INDEX
-from calibre.ebooks.mobi.reader.index import read_index
-from calibre.ebooks.mobi.reader.ncx import read_ncx, build_toc
-from calibre.ebooks.mobi.reader.markup import expand_mobi8_markup
-from calibre.ebooks.mobi.reader.containers import Container, find_imgtype
 from calibre.ebooks.metadata.opf2 import Guide, OPFCreator
 from calibre.ebooks.metadata.toc import TOC
+from calibre.ebooks.mobi.reader.containers import Container, find_imgtype
+from calibre.ebooks.mobi.reader.headers import NULL_INDEX
+from calibre.ebooks.mobi.reader.index import read_index
+from calibre.ebooks.mobi.reader.markup import expand_mobi8_markup
+from calibre.ebooks.mobi.reader.ncx import build_toc, read_ncx
 from calibre.ebooks.mobi.utils import read_font_record
+from calibre.ebooks.oeb.base import XHTML, XPath, xml2text
 from calibre.ebooks.oeb.parse_utils import parse_html
-from calibre.ebooks.oeb.base import XPath, XHTML, xml2text
 from polyglot.builtins import as_unicode
 from polyglot.urllib import urldefrag
 
diff --git a/src/calibre/ebooks/mobi/tweak.py b/src/calibre/ebooks/mobi/tweak.py
index b51bd4d08f..c38c5ac58a 100644
--- a/src/calibre/ebooks/mobi/tweak.py
+++ b/src/calibre/ebooks/mobi/tweak.py
@@ -5,19 +5,19 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import os, glob
+import glob
+import os
 
 from calibre import CurrentDir
-from calibre.ebooks.mobi import MobiError
-from calibre.ebooks.mobi.reader.mobi6 import MobiReader
-from calibre.ebooks.mobi.reader.headers import MetadataHeader
-from calibre.utils.logging import default_log
+from calibre.customize.ui import plugin_for_input_format, plugin_for_output_format
 from calibre.ebooks import DRMError
-from calibre.ebooks.mobi.reader.mobi8 import Mobi8Reader
 from calibre.ebooks.conversion.plumber import Plumber, create_oebbook
-from calibre.customize.ui import (plugin_for_input_format,
-        plugin_for_output_format)
+from calibre.ebooks.mobi import MobiError
+from calibre.ebooks.mobi.reader.headers import MetadataHeader
+from calibre.ebooks.mobi.reader.mobi6 import MobiReader
+from calibre.ebooks.mobi.reader.mobi8 import Mobi8Reader
 from calibre.utils.ipc.simple_worker import fork_job
+from calibre.utils.logging import default_log
 
 
 class BadFormat(ValueError):
diff --git a/src/calibre/ebooks/mobi/utils.py b/src/calibre/ebooks/mobi/utils.py
index 069a226b2e..59bcc513d1 100644
--- a/src/calibre/ebooks/mobi/utils.py
+++ b/src/calibre/ebooks/mobi/utils.py
@@ -5,16 +5,20 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import struct, string, zlib, os
+import os
+import string
+import struct
+import zlib
 from collections import OrderedDict
 from io import BytesIO
 
-from calibre.utils.img import save_cover_data_to, scale_image, image_to_data, image_from_data, resize_image, png_data_to_gif_data
-from calibre.utils.imghdr import what
-from calibre.ebooks import normalize
-from polyglot.builtins import as_bytes
 from tinycss.color3 import parse_color_string
 
+from calibre.ebooks import normalize
+from calibre.utils.img import image_from_data, image_to_data, png_data_to_gif_data, resize_image, save_cover_data_to, scale_image
+from calibre.utils.imghdr import what
+from polyglot.builtins import as_bytes
+
 IMAGE_MAX_SIZE = 10 * 1024 * 1024
 RECORD_SIZE = 0x1000  # 4096 (Text record size (uncompressed))
 
diff --git a/src/calibre/ebooks/mobi/writer2/indexer.py b/src/calibre/ebooks/mobi/writer2/indexer.py
index 80f337abc1..357b357d52 100644
--- a/src/calibre/ebooks/mobi/writer2/indexer.py
+++ b/src/calibre/ebooks/mobi/writer2/indexer.py
@@ -5,13 +5,13 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import numbers
-from struct import pack
 import io
+import numbers
 from collections import OrderedDict, defaultdict
+from struct import pack
 
-from calibre.ebooks.mobi.utils import (encint, encode_number_as_hex,
-        encode_tbs, align_block, RECORD_SIZE, CNCX as CNCX_)
+from calibre.ebooks.mobi.utils import CNCX as CNCX_
+from calibre.ebooks.mobi.utils import RECORD_SIZE, align_block, encint, encode_number_as_hex, encode_tbs
 from polyglot.builtins import iteritems, itervalues
 
 
diff --git a/src/calibre/ebooks/mobi/writer2/main.py b/src/calibre/ebooks/mobi/writer2/main.py
index 0f09b4e656..022008ed0e 100644
--- a/src/calibre/ebooks/mobi/writer2/main.py
+++ b/src/calibre/ebooks/mobi/writer2/main.py
@@ -5,18 +5,19 @@ __license__   = 'GPL v3'
 __copyright__ = '2011, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import io, random, time
+import io
+import random
+import time
 from struct import pack
 
 from calibre.ebooks import normalize
-from calibre.ebooks.mobi.writer2.serializer import Serializer
 from calibre.ebooks.compression.palmdoc import compress_doc
 from calibre.ebooks.mobi.langcodes import iana2mobi
-from calibre.utils.filenames import ascii_filename
-from calibre.ebooks.mobi.writer2 import (PALMDOC, UNCOMPRESSED)
-from calibre.ebooks.mobi.utils import (encint, encode_trailing_data,
-        align_block, detect_periodical, RECORD_SIZE, create_text_record)
+from calibre.ebooks.mobi.utils import RECORD_SIZE, align_block, create_text_record, detect_periodical, encint, encode_trailing_data
+from calibre.ebooks.mobi.writer2 import PALMDOC, UNCOMPRESSED
 from calibre.ebooks.mobi.writer2.indexer import Indexer
+from calibre.ebooks.mobi.writer2.serializer import Serializer
+from calibre.utils.filenames import ascii_filename
 from polyglot.builtins import iteritems
 
 # Disabled as I dont care about uncrossable breaks
@@ -373,9 +374,8 @@ class MobiWriter:
     # }}}
 
     def generate_joint_record0(self):  # {{{
-        from calibre.ebooks.mobi.writer8.mobi import (MOBIHeader,
-                HEADER_FIELDS)
         from calibre.ebooks.mobi.writer8.exth import build_exth
+        from calibre.ebooks.mobi.writer8.mobi import HEADER_FIELDS, MOBIHeader
 
         # Insert resource records
         first_image_record = None
diff --git a/src/calibre/ebooks/mobi/writer2/resources.py b/src/calibre/ebooks/mobi/writer2/resources.py
index f75ba43aa4..592c1e6077 100644
--- a/src/calibre/ebooks/mobi/writer2/resources.py
+++ b/src/calibre/ebooks/mobi/writer2/resources.py
@@ -6,13 +6,13 @@ __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
 import os
-from PIL import Image, ImageOps
 from io import BytesIO
 
-from calibre.ebooks.mobi import MAX_THUMB_DIMEN, MAX_THUMB_SIZE
-from calibre.ebooks.mobi.utils import (rescale_image, mobify_image,
-        write_font_record)
+from PIL import Image, ImageOps
+
 from calibre.ebooks import generate_masthead
+from calibre.ebooks.mobi import MAX_THUMB_DIMEN, MAX_THUMB_SIZE
+from calibre.ebooks.mobi.utils import mobify_image, rescale_image, write_font_record
 from calibre.ebooks.oeb.base import OEB_RASTER_IMAGES
 from calibre.ptempfile import PersistentTemporaryFile
 from calibre.utils.imghdr import what
diff --git a/src/calibre/ebooks/mobi/writer2/serializer.py b/src/calibre/ebooks/mobi/writer2/serializer.py
index 5d6d3d33a1..fd25a58f39 100644
--- a/src/calibre/ebooks/mobi/writer2/serializer.py
+++ b/src/calibre/ebooks/mobi/writer2/serializer.py
@@ -13,9 +13,7 @@ from io import BytesIO
 
 from calibre.ebooks.mobi.mobiml import MBP_NS
 from calibre.ebooks.mobi.utils import is_guide_ref_start
-from calibre.ebooks.oeb.base import (
-    OEB_DOCS, XHTML, XHTML_NS, XML_NS, namespace, prefixname, urlnormalize
-)
+from calibre.ebooks.oeb.base import OEB_DOCS, XHTML, XHTML_NS, XML_NS, namespace, prefixname, urlnormalize
 from polyglot.builtins import string_or_bytes
 from polyglot.urllib import urldefrag
 
diff --git a/src/calibre/ebooks/mobi/writer8/exth.py b/src/calibre/ebooks/mobi/writer8/exth.py
index a6af8d21fa..ff69a45eef 100644
--- a/src/calibre/ebooks/mobi/writer8/exth.py
+++ b/src/calibre/ebooks/mobi/writer8/exth.py
@@ -6,13 +6,13 @@ __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
 import re
-from struct import pack
 from io import BytesIO
+from struct import pack
 
-from calibre.constants import iswindows, ismacos
-from calibre.ebooks.mobi.utils import (utf8_text, to_base)
-from calibre.utils.localization import lang_as_iso639_1
+from calibre.constants import ismacos, iswindows
 from calibre.ebooks.metadata import authors_to_sort_string
+from calibre.ebooks.mobi.utils import to_base, utf8_text
+from calibre.utils.localization import lang_as_iso639_1
 from polyglot.builtins import iteritems
 
 EXTH_CODES = {
diff --git a/src/calibre/ebooks/mobi/writer8/header.py b/src/calibre/ebooks/mobi/writer8/header.py
index cc539a60f6..839445128e 100644
--- a/src/calibre/ebooks/mobi/writer8/header.py
+++ b/src/calibre/ebooks/mobi/writer8/header.py
@@ -5,13 +5,14 @@ __license__   = 'GPL v3'
 __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
-import random, numbers
-from io import BytesIO
+import numbers
+import random
 from collections import OrderedDict
+from io import BytesIO
 from struct import pack
 
 from calibre.ebooks.mobi.utils import align_block
-from polyglot.builtins import iteritems, as_bytes
+from polyglot.builtins import as_bytes, iteritems
 
 NULL = 0xffffffff
 def zeroes(x):
diff --git a/src/calibre/ebooks/mobi/writer8/index.py b/src/calibre/ebooks/mobi/writer8/index.py
index ef20c8966d..51b73d00e9 100644
--- a/src/calibre/ebooks/mobi/writer8/index.py
+++ b/src/calibre/ebooks/mobi/writer8/index.py
@@ -5,10 +5,10 @@ __copyright__ = '2012, Kovid Goyal '
 __docformat__ = 'restructuredtext en'
 
 from collections import namedtuple
-from struct import pack
 from io import BytesIO
+from struct import pack
 
-from calibre.ebooks.mobi.utils import CNCX, encint, align_block
+from calibre.ebooks.mobi.utils import CNCX, align_block, encint
 from calibre.ebooks.mobi.writer8.header import Header
 
 TagMeta_ = namedtuple('TagMeta',
@@ -374,7 +374,8 @@ class NonLinearNCXIndex(NCXIndex):
 if __name__ == '__main__':
     # Generate a document with a large number of index entries using both
     # calibre and kindlegen and compare the output
-    import os, subprocess
+    import os
+    import subprocess
     os.chdir('/t')
     paras = ['

%d

' % i for i in range(4000)] raw = '' + '\n\n'.join(paras) + '' diff --git a/src/calibre/ebooks/mobi/writer8/main.py b/src/calibre/ebooks/mobi/writer8/main.py index fe056e129a..08f4c560e7 100644 --- a/src/calibre/ebooks/mobi/writer8/main.py +++ b/src/calibre/ebooks/mobi/writer8/main.py @@ -5,9 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import copy, logging -from functools import partial +import copy +import logging from collections import defaultdict, namedtuple +from functools import partial from io import BytesIO from struct import pack @@ -15,20 +16,17 @@ import css_parser from css_parser.css import CSSRule from lxml import etree -from calibre import isbytestring, force_unicode -from calibre.ebooks.mobi.utils import (create_text_record, to_base, - is_guide_ref_start) +from calibre import force_unicode, isbytestring from calibre.ebooks.compression.palmdoc import compress_doc -from calibre.ebooks.oeb.base import (OEB_DOCS, OEB_STYLES, SVG_MIME, XPath, - extract, XHTML, urlnormalize) -from calibre.ebooks.oeb.normalize_css import condense_sheet -from calibre.ebooks.oeb.parse_utils import barename -from calibre.ebooks.mobi.writer8.skeleton import Chunker, aid_able_tags, to_href -from calibre.ebooks.mobi.writer8.index import (NCXIndex, SkelIndex, - ChunkIndex, GuideIndex, NonLinearNCXIndex) +from calibre.ebooks.mobi.utils import create_text_record, is_guide_ref_start, to_base +from calibre.ebooks.mobi.writer8.index import ChunkIndex, GuideIndex, NCXIndex, NonLinearNCXIndex, SkelIndex from calibre.ebooks.mobi.writer8.mobi import KF8Book +from calibre.ebooks.mobi.writer8.skeleton import Chunker, aid_able_tags, to_href from calibre.ebooks.mobi.writer8.tbs import apply_trailing_byte_sequences from calibre.ebooks.mobi.writer8.toc import TOCAdder +from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, SVG_MIME, XHTML, XPath, extract, urlnormalize +from calibre.ebooks.oeb.normalize_css import condense_sheet +from calibre.ebooks.oeb.parse_utils import barename from polyglot.builtins import iteritems XML_DOCS = OEB_DOCS | {SVG_MIME} diff --git a/src/calibre/ebooks/mobi/writer8/mobi.py b/src/calibre/ebooks/mobi/writer8/mobi.py index 58130e4ce3..8aed9c6c06 100644 --- a/src/calibre/ebooks/mobi/writer8/mobi.py +++ b/src/calibre/ebooks/mobi/writer8/mobi.py @@ -5,14 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import time, random +import random +import time from struct import pack -from calibre.ebooks.mobi.utils import RECORD_SIZE, utf8_text -from calibre.ebooks.mobi.writer8.header import Header -from calibre.ebooks.mobi.writer2 import (PALMDOC, UNCOMPRESSED) from calibre.ebooks.mobi.langcodes import iana2mobi +from calibre.ebooks.mobi.utils import RECORD_SIZE, utf8_text +from calibre.ebooks.mobi.writer2 import PALMDOC, UNCOMPRESSED from calibre.ebooks.mobi.writer8.exth import build_exth +from calibre.ebooks.mobi.writer8.header import Header from calibre.utils.filenames import ascii_filename NULL_INDEX = 0xffffffff diff --git a/src/calibre/ebooks/mobi/writer8/skeleton.py b/src/calibre/ebooks/mobi/writer8/skeleton.py index a42ce358fc..fceb018c9d 100644 --- a/src/calibre/ebooks/mobi/writer8/skeleton.py +++ b/src/calibre/ebooks/mobi/writer8/skeleton.py @@ -13,9 +13,9 @@ from xml.sax.saxutils import escape from lxml import etree from calibre import my_unichr +from calibre.ebooks.mobi.utils import PolyglotDict, to_base from calibre.ebooks.oeb.base import XHTML_NS, extract -from calibre.ebooks.mobi.utils import to_base, PolyglotDict -from polyglot.builtins import iteritems, as_bytes +from polyglot.builtins import as_bytes, iteritems CHUNK_SIZE = 8192 @@ -413,7 +413,9 @@ class Chunker: text) def dump(self, orig_dumps): - import tempfile, shutil, os + import os + import shutil + import tempfile tdir = os.path.join(tempfile.gettempdir(), 'skeleton') self.log('Skeletons dumped to:', tdir) if os.path.exists(tdir): diff --git a/src/calibre/ebooks/mobi/writer8/tbs.py b/src/calibre/ebooks/mobi/writer8/tbs.py index 68f1c3c604..ce02158fd8 100644 --- a/src/calibre/ebooks/mobi/writer8/tbs.py +++ b/src/calibre/ebooks/mobi/writer8/tbs.py @@ -16,11 +16,10 @@ For the exact algorithm, see separate_strands(). The strands are then encoded into 'sequences', see encode_strands_as_sequences() and finally the sequences are turned into bytes. ''' -from collections import namedtuple, OrderedDict +from collections import OrderedDict, namedtuple from operator import attrgetter -from calibre.ebooks.mobi.utils import (encode_trailing_data, - encode_tbs) +from calibre.ebooks.mobi.utils import encode_tbs, encode_trailing_data from polyglot.builtins import iteritems, itervalues Entry = namedtuple('IndexEntry', 'index start length depth parent ' diff --git a/src/calibre/ebooks/mobi/writer8/toc.py b/src/calibre/ebooks/mobi/writer8/toc.py index 3ec2e57cf0..2d3e36f80c 100644 --- a/src/calibre/ebooks/mobi/writer8/toc.py +++ b/src/calibre/ebooks/mobi/writer8/toc.py @@ -5,9 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.ebooks.oeb.base import ( - XHTML, XHTML_MIME, XHTML_NS, XPath, css_text, urlnormalize, -) +from calibre.ebooks.oeb.base import XHTML, XHTML_MIME, XHTML_NS, XPath, css_text, urlnormalize from calibre.utils.localization import __ from calibre.utils.xml_parse import safe_xml_fromstring diff --git a/src/calibre/ebooks/odt/input.py b/src/calibre/ebooks/odt/input.py index b90045e8ca..73e0c21e8d 100644 --- a/src/calibre/ebooks/odt/input.py +++ b/src/calibre/ebooks/odt/input.py @@ -5,21 +5,22 @@ __docformat__ = 'restructuredtext en' ''' Convert an ODT file into a Open Ebook ''' -import os, logging +import logging +import os -from lxml import etree from css_parser import CSSParser from css_parser.css import CSSRule - +from lxml import etree +from odf.draw import Frame as odFrame +from odf.draw import Image as odImage +from odf.namespaces import TEXTNS as odTEXTNS from odf.odf2xhtml import ODF2XHTML from odf.opendocument import load as odLoad -from odf.draw import Frame as odFrame, Image as odImage -from odf.namespaces import TEXTNS as odTEXTNS from calibre import CurrentDir, walk from calibre.ebooks.oeb.base import _css_logger from calibre.utils.xml_parse import safe_xml_fromstring -from polyglot.builtins import string_or_bytes, as_bytes +from polyglot.builtins import as_bytes, string_or_bytes class Extract(ODF2XHTML): @@ -87,7 +88,7 @@ class Extract(ODF2XHTML): return rule def epubify_markup(self, root, log): - from calibre.ebooks.oeb.base import XPath, XHTML + from calibre.ebooks.oeb.base import XHTML, XPath # Fix empty title tags for t in XPath('//h:title')(root): if not t.text: @@ -264,9 +265,9 @@ class Extract(ODF2XHTML): self._walknode(self.document.topnode) def __call__(self, stream, odir, log): - from calibre.utils.zipfile import ZipFile from calibre.ebooks.metadata.odt import get_metadata from calibre.ebooks.metadata.opf2 import OPFCreator + from calibre.utils.zipfile import ZipFile if not os.path.exists(odir): os.makedirs(odir) diff --git a/src/calibre/ebooks/oeb/base.py b/src/calibre/ebooks/oeb/base.py index 133dc7ebe1..c2b404ca49 100644 --- a/src/calibre/ebooks/oeb/base.py +++ b/src/calibre/ebooks/oeb/base.py @@ -13,27 +13,26 @@ import re import sys from collections import defaultdict from itertools import count -from lxml import etree, html from operator import attrgetter from typing import Optional +from lxml import etree, html + from calibre import as_unicode, force_unicode, get_types_map, isbytestring from calibre.constants import __version__, filesystem_encoding from calibre.ebooks.chardet import xml_to_unicode from calibre.ebooks.conversion.preprocess import CSSPreProcessor -from calibre.ebooks.oeb.parse_utils import ( - XHTML, XHTML_NS, NotHTML, barename, namespace, parse_html, -) +from calibre.ebooks.oeb.parse_utils import XHTML, XHTML_NS, NotHTML, barename, namespace, parse_html from calibre.translations.dynamic import translate from calibre.utils.cleantext import clean_xml_chars -from calibre.utils.icu import numeric_sort_key, title_case as icu_title +from calibre.utils.icu import numeric_sort_key +from calibre.utils.icu import title_case as icu_title from calibre.utils.localization import __ from calibre.utils.short_uuid import uuid4 from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.builtins import codepoint_to_chr, iteritems, itervalues, string_or_bytes -from polyglot.urllib import ( - unquote as urlunquote, urldefrag, urljoin, urlparse, urlunparse, -) +from polyglot.urllib import unquote as urlunquote +from polyglot.urllib import urldefrag, urljoin, urlparse, urlunparse XML_NS = 'http://www.w3.org/XML/1998/namespace' OEB_DOC_NS = 'http://openebook.org/namespaces/oeb-document/1.0/' diff --git a/src/calibre/ebooks/oeb/display/webview.py b/src/calibre/ebooks/oeb/display/webview.py index ae9ada9517..ad6a64f069 100644 --- a/src/calibre/ebooks/oeb/display/webview.py +++ b/src/calibre/ebooks/oeb/display/webview.py @@ -49,7 +49,7 @@ def load_as_html(html): def load_html(path, view, codec='utf-8', mime_type=None, pre_load_callback=lambda x:None, path_is_html=False, force_as_html=False, loading_url=None): - from qt.core import QUrl, QByteArray + from qt.core import QByteArray, QUrl if mime_type is None: mime_type = guess_type(path)[0] if not mime_type: diff --git a/src/calibre/ebooks/oeb/iterator/__init__.py b/src/calibre/ebooks/oeb/iterator/__init__.py index f821fc427e..fa464f7edc 100644 --- a/src/calibre/ebooks/oeb/iterator/__init__.py +++ b/src/calibre/ebooks/oeb/iterator/__init__.py @@ -5,7 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, re +import os +import re +import sys from calibre.customize.ui import available_input_formats @@ -29,9 +31,9 @@ def EbookIterator(*args, **kwargs): def get_preprocess_html(path_to_ebook, output=None): - from calibre.ebooks.conversion.plumber import set_regex_wizard_callback, Plumber - from calibre.utils.logging import DevNull + from calibre.ebooks.conversion.plumber import Plumber, set_regex_wizard_callback from calibre.ptempfile import TemporaryDirectory + from calibre.utils.logging import DevNull raw = {} set_regex_wizard_callback(raw.__setitem__) with TemporaryDirectory('_regex_wiz') as tdir: diff --git a/src/calibre/ebooks/oeb/iterator/book.py b/src/calibre/ebooks/oeb/iterator/book.py index 3f3ae5edfc..f58a870542 100644 --- a/src/calibre/ebooks/oeb/iterator/book.py +++ b/src/calibre/ebooks/oeb/iterator/book.py @@ -10,19 +10,21 @@ __docformat__ = 'restructuredtext en' Iterate over the HTML files in an ebook. Useful for writing viewers. ''' -import re, os, math +import math +import os +import re from functools import partial +from calibre import guess_type, prepare_string_for_xml from calibre.ebooks.metadata.opf2 import OPF +from calibre.ebooks.oeb.base import urlparse, urlunquote +from calibre.ebooks.oeb.iterator.bookmarks import BookmarksMixin +from calibre.ebooks.oeb.iterator.spine import SpineItem, create_indexing_data +from calibre.ebooks.oeb.transforms.cover import CoverManager from calibre.ptempfile import PersistentTemporaryDirectory, remove_dir from calibre.utils.config import DynamicConfig from calibre.utils.logging import default_log from calibre.utils.tdir_in_cache import tdir_in_cache -from calibre import guess_type, prepare_string_for_xml -from calibre.ebooks.oeb.transforms.cover import CoverManager -from calibre.ebooks.oeb.iterator.spine import (SpineItem, create_indexing_data) -from calibre.ebooks.oeb.iterator.bookmarks import BookmarksMixin -from calibre.ebooks.oeb.base import urlparse, urlunquote TITLEPAGE = CoverManager.SVG_TEMPLATE.replace( '__ar__', 'none').replace('__viewbox__', '0 0 600 800' @@ -37,8 +39,8 @@ class FakeOpts: def write_oebbook(oeb, path): - from calibre.ebooks.oeb.writer import OEBWriter from calibre import walk + from calibre.ebooks.oeb.writer import OEBWriter w = OEBWriter() w(oeb, path) for f in walk(path): diff --git a/src/calibre/ebooks/oeb/iterator/bookmarks.py b/src/calibre/ebooks/oeb/iterator/bookmarks.py index c28d2e5f21..c410da57c3 100644 --- a/src/calibre/ebooks/oeb/iterator/bookmarks.py +++ b/src/calibre/ebooks/oeb/iterator/bookmarks.py @@ -5,7 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, numbers +import numbers +import os from io import BytesIO from calibre.utils.zipfile import safe_replace diff --git a/src/calibre/ebooks/oeb/iterator/spine.py b/src/calibre/ebooks/oeb/iterator/spine.py index 342b63b901..8eca669c07 100644 --- a/src/calibre/ebooks/oeb/iterator/spine.py +++ b/src/calibre/ebooks/oeb/iterator/spine.py @@ -5,10 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, os +import os +import re +from collections import namedtuple from functools import partial from operator import attrgetter -from collections import namedtuple from calibre import guess_type, replace_entities from calibre.ebooks.chardet import xml_to_unicode diff --git a/src/calibre/ebooks/oeb/normalize_css.py b/src/calibre/ebooks/oeb/normalize_css.py index 941d000b6c..aed56f5691 100644 --- a/src/calibre/ebooks/oeb/normalize_css.py +++ b/src/calibre/ebooks/oeb/normalize_css.py @@ -7,9 +7,11 @@ __copyright__ = '2013, Kovid Goyal ' import numbers from functools import wraps +from css_parser import CSSParser +from css_parser import profile as cssprofiles from css_parser.css import PropertyValue -from css_parser import profile as cssprofiles, CSSParser from tinycss.fonts3 import parse_font, serialize_font_family + from calibre.ebooks.oeb.base import css_text from polyglot.builtins import iteritems, string_or_bytes @@ -266,9 +268,10 @@ def condense_sheet(sheet): def test_normalization(return_tests=False): # {{{ import unittest - from css_parser import parseStyle from itertools import product + from css_parser import parseStyle + class TestNormalization(unittest.TestCase): longMessage = True maxDiff = None diff --git a/src/calibre/ebooks/oeb/parse_utils.py b/src/calibre/ebooks/oeb/parse_utils.py index 2d32420441..9b18af37e8 100644 --- a/src/calibre/ebooks/oeb/parse_utils.py +++ b/src/calibre/ebooks/oeb/parse_utils.py @@ -9,10 +9,10 @@ import re from lxml import etree, html -from calibre import xml_replace_entities, force_unicode -from calibre.utils.xml_parse import safe_xml_fromstring +from calibre import force_unicode, xml_replace_entities from calibre.constants import filesystem_encoding -from calibre.ebooks.chardet import xml_to_unicode, strip_encoding_declarations +from calibre.ebooks.chardet import strip_encoding_declarations, xml_to_unicode +from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.builtins import iteritems, itervalues, string_or_bytes RECOVER_PARSER = etree.XMLParser(recover=True, no_network=True, resolve_entities=False) @@ -94,6 +94,7 @@ def node_depth(node): def html5_parse(data, max_nesting_depth=100): from html5_parser import parse + from calibre.utils.cleantext import clean_xml_chars data = parse(clean_xml_chars(data), maybe_xhtml=True, keep_doctype=False, sanitize_names=True) # Check that the asinine HTML 5 algorithm did not result in a tree with diff --git a/src/calibre/ebooks/oeb/polish/cascade.py b/src/calibre/ebooks/oeb/polish/cascade.py index 5f71b31074..c6b6bc97d0 100644 --- a/src/calibre/ebooks/oeb/polish/cascade.py +++ b/src/calibre/ebooks/oeb/polish/cascade.py @@ -4,20 +4,21 @@ import re from collections import defaultdict, namedtuple -from css_parser.css import CSSRule, CSSStyleSheet, Property from functools import partial from itertools import count from operator import itemgetter +from css_parser.css import CSSRule, CSSStyleSheet, Property +from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError +from tinycss.fonts3 import parse_font_family, serialize_font_family + from calibre import as_unicode from calibre.ebooks.css_transform_rules import all_properties from calibre.ebooks.oeb.base import OEB_STYLES, XHTML, css_text from calibre.ebooks.oeb.normalize_css import DEFAULTS, normalizers from calibre.ebooks.oeb.stylizer import INHERITED, media_ok from calibre.utils.resources import get_path as P -from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError from polyglot.builtins import iteritems, itervalues -from tinycss.fonts3 import parse_font_family, serialize_font_family _html_css_stylesheet = None diff --git a/src/calibre/ebooks/oeb/polish/check/base.py b/src/calibre/ebooks/oeb/polish/check/base.py index 0af5d4fe61..76012fdc2f 100644 --- a/src/calibre/ebooks/oeb/polish/check/base.py +++ b/src/calibre/ebooks/oeb/polish/check/base.py @@ -4,9 +4,9 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from multiprocessing.pool import ThreadPool -from functools import partial from contextlib import closing +from functools import partial +from multiprocessing.pool import ThreadPool from calibre import detect_ncpus as cpu_count diff --git a/src/calibre/ebooks/oeb/polish/check/css.py b/src/calibre/ebooks/oeb/polish/check/css.py index df0d621479..dfcb791f52 100644 --- a/src/calibre/ebooks/oeb/polish/check/css.py +++ b/src/calibre/ebooks/oeb/polish/check/css.py @@ -7,10 +7,12 @@ import numbers import sys from collections import namedtuple from itertools import repeat + from qt.core import QApplication, QEventLoop, pyqtSignal, sip from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineScript -from calibre import detect_ncpus as cpu_count, prints +from calibre import detect_ncpus as cpu_count +from calibre import prints from calibre.ebooks.oeb.polish.check.base import ERROR, WARN, BaseError from calibre.gui2 import must_use_qt from calibre.utils.resources import get_path as P diff --git a/src/calibre/ebooks/oeb/polish/check/fonts.py b/src/calibre/ebooks/oeb/polish/check/fonts.py index 7bfb4854be..eb42873ff2 100644 --- a/src/calibre/ebooks/oeb/polish/check/fonts.py +++ b/src/calibre/ebooks/oeb/polish/check/fonts.py @@ -5,15 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from css_parser.css import CSSRule +from tinycss.fonts3 import parse_font_family from calibre import force_unicode from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES -from calibre.ebooks.oeb.polish.check.base import BaseError, WARN -from calibre.ebooks.oeb.polish.utils import OEB_FONTS -from calibre.ebooks.oeb.polish.pretty import pretty_script_or_style +from calibre.ebooks.oeb.polish.check.base import WARN, BaseError from calibre.ebooks.oeb.polish.fonts import change_font_in_declaration -from calibre.utils.fonts.utils import get_all_font_names, is_font_embeddable, UnsupportedFont -from tinycss.fonts3 import parse_font_family +from calibre.ebooks.oeb.polish.pretty import pretty_script_or_style +from calibre.ebooks.oeb.polish.utils import OEB_FONTS +from calibre.utils.fonts.utils import UnsupportedFont, get_all_font_names, is_font_embeddable from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/check/images.py b/src/calibre/ebooks/oeb/polish/check/images.py index 47e82fb153..641f7c903b 100644 --- a/src/calibre/ebooks/oeb/polish/check/images.py +++ b/src/calibre/ebooks/oeb/polish/check/images.py @@ -5,10 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from io import BytesIO + from PIL import Image from calibre import as_unicode -from calibre.ebooks.oeb.polish.check.base import BaseError, WARN +from calibre.ebooks.oeb.polish.check.base import WARN, BaseError from calibre.ebooks.oeb.polish.check.parsing import EmptyFile from polyglot.builtins import error_message @@ -32,6 +33,7 @@ class CMYKImage(BaseError): def __call__(self, container): from qt.core import QImage + from calibre.gui2 import pixmap_to_data ext = container.mime_map[self.name].split('/')[-1].upper() if ext == 'JPG': diff --git a/src/calibre/ebooks/oeb/polish/check/links.py b/src/calibre/ebooks/oeb/polish/check/links.py index 4b48f62eae..de558d997f 100644 --- a/src/calibre/ebooks/oeb/polish/check/links.py +++ b/src/calibre/ebooks/oeb/polish/check/links.py @@ -9,15 +9,15 @@ from collections import defaultdict from threading import Thread from calibre import browser -from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, urlunquote, XHTML_MIME +from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, XHTML_MIME, urlunquote +from calibre.ebooks.oeb.polish.check.base import ERROR, INFO, WARN, BaseError +from calibre.ebooks.oeb.polish.cover import get_raster_cover_name from calibre.ebooks.oeb.polish.parsing import parse_html5 from calibre.ebooks.oeb.polish.replace import remove_links_to -from calibre.ebooks.oeb.polish.cover import get_raster_cover_name -from calibre.ebooks.oeb.polish.utils import guess_type, actual_case_for_name, corrected_case_for_name, OEB_FONTS -from calibre.ebooks.oeb.polish.check.base import BaseError, WARN, INFO, ERROR +from calibre.ebooks.oeb.polish.utils import OEB_FONTS, actual_case_for_name, corrected_case_for_name, guess_type from polyglot.builtins import iteritems, itervalues +from polyglot.queue import Empty, Queue from polyglot.urllib import urlparse -from polyglot.queue import Queue, Empty class BadLink(BaseError): diff --git a/src/calibre/ebooks/oeb/polish/check/main.py b/src/calibre/ebooks/oeb/polish/check/main.py index dd7fdc6092..2aa7ad6095 100644 --- a/src/calibre/ebooks/oeb/polish/check/main.py +++ b/src/calibre/ebooks/oeb/polish/check/main.py @@ -10,13 +10,17 @@ from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES from calibre.ebooks.oeb.polish.check.base import WARN, run_checkers from calibre.ebooks.oeb.polish.check.fonts import check_fonts from calibre.ebooks.oeb.polish.check.images import check_raster_images -from calibre.ebooks.oeb.polish.check.links import ( - check_link_destinations, check_links, check_mimetypes, -) +from calibre.ebooks.oeb.polish.check.links import check_link_destinations, check_links, check_mimetypes from calibre.ebooks.oeb.polish.check.opf import check_opf from calibre.ebooks.oeb.polish.check.parsing import ( - EmptyFile, check_encoding_declarations, check_filenames, check_html_size, check_ids, - check_markup, check_xml_parsing, fix_style_tag, + EmptyFile, + check_encoding_declarations, + check_filenames, + check_html_size, + check_ids, + check_markup, + check_xml_parsing, + fix_style_tag, ) from calibre.ebooks.oeb.polish.cover import is_raster_image from calibre.ebooks.oeb.polish.utils import guess_type diff --git a/src/calibre/ebooks/oeb/polish/check/opf.py b/src/calibre/ebooks/oeb/polish/check/opf.py index 9fc8f32bd1..0c977b75fa 100644 --- a/src/calibre/ebooks/oeb/polish/check/opf.py +++ b/src/calibre/ebooks/oeb/polish/check/opf.py @@ -7,10 +7,10 @@ __copyright__ = '2014, Kovid Goyal ' from lxml import etree from calibre import prepare_string_for_xml as xml -from calibre.ebooks.oeb.polish.check.base import BaseError, WARN +from calibre.ebooks.oeb.base import DC, DC11_NS, OPF, OPF2_NS, XHTML_MIME +from calibre.ebooks.oeb.polish.check.base import WARN, BaseError from calibre.ebooks.oeb.polish.toc import find_existing_nav_toc, parse_nav from calibre.ebooks.oeb.polish.utils import guess_type -from calibre.ebooks.oeb.base import OPF, OPF2_NS, DC, DC11_NS, XHTML_MIME from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/check/parsing.py b/src/calibre/ebooks/oeb/polish/check/parsing.py index 029ca25ff8..0961fb2253 100644 --- a/src/calibre/ebooks/oeb/polish/check/parsing.py +++ b/src/calibre/ebooks/oeb/polish/check/parsing.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import re + from lxml.etree import XMLSyntaxError from calibre import human_readable, prepare_string_for_xml diff --git a/src/calibre/ebooks/oeb/polish/container.py b/src/calibre/ebooks/oeb/polish/container.py index 972bedbee7..fd8204cb8c 100644 --- a/src/calibre/ebooks/oeb/polish/container.py +++ b/src/calibre/ebooks/oeb/polish/container.py @@ -12,37 +12,41 @@ import sys import unicodedata import uuid from collections import defaultdict -from css_parser import getUrls, replaceUrls from io import BytesIO from itertools import count +from css_parser import getUrls, replaceUrls + from calibre import CurrentDir, walk from calibre.constants import iswindows from calibre.customize.ui import plugin_for_input_format, plugin_for_output_format from calibre.ebooks import escape_xpath_attr from calibre.ebooks.chardet import xml_to_unicode -from calibre.ebooks.conversion.plugins.epub_input import ( - ADOBE_OBFUSCATION, IDPF_OBFUSCATION, decrypt_font_data -) -from calibre.ebooks.conversion.preprocess import ( - CSSPreProcessor as cssp, HTMLPreProcessor -) -from calibre.ebooks.metadata.opf3 import ( - CALIBRE_PREFIX, ensure_prefix, items_with_property, read_prefixes -) +from calibre.ebooks.conversion.plugins.epub_input import ADOBE_OBFUSCATION, IDPF_OBFUSCATION, decrypt_font_data +from calibre.ebooks.conversion.preprocess import CSSPreProcessor as cssp +from calibre.ebooks.conversion.preprocess import HTMLPreProcessor +from calibre.ebooks.metadata.opf3 import CALIBRE_PREFIX, ensure_prefix, items_with_property, read_prefixes from calibre.ebooks.metadata.utils import parse_opf_version from calibre.ebooks.mobi import MobiError from calibre.ebooks.mobi.reader.headers import MetadataHeader from calibre.ebooks.oeb.base import ( - DC11_NS, OEB_DOCS, OEB_STYLES, OPF, OPF2_NS, Manifest, itercsslinks, iterlinks, - rewrite_links, serialize, urlquote, urlunquote + DC11_NS, + OEB_DOCS, + OEB_STYLES, + OPF, + OPF2_NS, + Manifest, + itercsslinks, + iterlinks, + rewrite_links, + serialize, + urlquote, + urlunquote, ) from calibre.ebooks.oeb.parse_utils import NotHTML, parse_html from calibre.ebooks.oeb.polish.errors import DRMError, InvalidBook from calibre.ebooks.oeb.polish.parsing import parse as parse_html_tweak -from calibre.ebooks.oeb.polish.utils import ( - CommentFinder, PositionFinder, adjust_mime_for_epub, guess_type, parse_css, OEB_FONTS -) +from calibre.ebooks.oeb.polish.utils import OEB_FONTS, CommentFinder, PositionFinder, adjust_mime_for_epub, guess_type, parse_css from calibre.ptempfile import PersistentTemporaryDirectory, PersistentTemporaryFile from calibre.utils.filenames import hardlink_file, nlinks_file, retry_on_fail from calibre.utils.ipc.simple_worker import WorkerError, fork_job diff --git a/src/calibre/ebooks/oeb/polish/cover.py b/src/calibre/ebooks/oeb/polish/cover.py index 3b9c94f969..3e34c15aa7 100644 --- a/src/calibre/ebooks/oeb/polish/cover.py +++ b/src/calibre/ebooks/oeb/polish/cover.py @@ -2,10 +2,12 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import shutil, re, os +import os +import re +import shutil -from calibre.ebooks.oeb.base import OPF, OEB_DOCS, XPath, XLINK, xml2text -from calibre.ebooks.oeb.polish.replace import replace_links, get_recommended_folders +from calibre.ebooks.oeb.base import OEB_DOCS, OPF, XLINK, XPath, xml2text +from calibre.ebooks.oeb.polish.replace import get_recommended_folders, replace_links from calibre.utils.imghdr import identify from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/create.py b/src/calibre/ebooks/oeb/polish/create.py index 9645aa71b9..c1c9900917 100644 --- a/src/calibre/ebooks/oeb/polish/create.py +++ b/src/calibre/ebooks/oeb/polish/create.py @@ -6,6 +6,7 @@ __copyright__ = '2013, Kovid Goyal ' import os import sys + from lxml import etree from calibre import CurrentDir, prepare_string_for_xml diff --git a/src/calibre/ebooks/oeb/polish/css.py b/src/calibre/ebooks/oeb/polish/css.py index 37db8222f5..0047229665 100644 --- a/src/calibre/ebooks/oeb/polish/css.py +++ b/src/calibre/ebooks/oeb/polish/css.py @@ -6,19 +6,19 @@ __copyright__ = '2014, Kovid Goyal ' import re from collections import defaultdict -from css_parser.css import CSSRule, CSSStyleDeclaration from functools import partial from operator import itemgetter +from css_parser.css import CSSRule, CSSStyleDeclaration +from css_selectors import Select, SelectorError, SelectorSyntaxError, parse + from calibre import force_unicode from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, XHTML, css_text from calibre.ebooks.oeb.normalize_css import normalize_filter_css, normalizers -from calibre.ebooks.oeb.polish.pretty import ( - pretty_script_or_style, pretty_xml_tree, serialize, -) -from calibre.utils.icu import lower as icu_lower, numeric_sort_key +from calibre.ebooks.oeb.polish.pretty import pretty_script_or_style, pretty_xml_tree, serialize +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import numeric_sort_key from calibre.utils.localization import ngettext -from css_selectors import Select, SelectorError, SelectorSyntaxError, parse from polyglot.builtins import iteritems, itervalues from polyglot.functools import lru_cache diff --git a/src/calibre/ebooks/oeb/polish/download.py b/src/calibre/ebooks/oeb/polish/download.py index 26de19e1ef..ff3c782382 100644 --- a/src/calibre/ebooks/oeb/polish/download.py +++ b/src/calibre/ebooks/oeb/polish/download.py @@ -14,7 +14,8 @@ from io import BytesIO from multiprocessing.dummy import Pool from tempfile import NamedTemporaryFile -from calibre import as_unicode, browser, sanitize_file_name as sanitize_file_name_base +from calibre import as_unicode, browser +from calibre import sanitize_file_name as sanitize_file_name_base from calibre.constants import iswindows from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, barename, iterlinks from calibre.ebooks.oeb.polish.utils import guess_type diff --git a/src/calibre/ebooks/oeb/polish/embed.py b/src/calibre/ebooks/oeb/polish/embed.py index 3904bd18d3..164f43d4bd 100644 --- a/src/calibre/ebooks/oeb/polish/embed.py +++ b/src/calibre/ebooks/oeb/polish/embed.py @@ -6,6 +6,7 @@ __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' import sys + from lxml import etree from calibre import prints diff --git a/src/calibre/ebooks/oeb/polish/fonts.py b/src/calibre/ebooks/oeb/polish/fonts.py index 237f4df3d6..28bd209eb9 100644 --- a/src/calibre/ebooks/oeb/polish/fonts.py +++ b/src/calibre/ebooks/oeb/polish/fonts.py @@ -4,10 +4,11 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' +from tinycss.fonts3 import parse_font, parse_font_family, serialize_font, serialize_font_family + from calibre.ebooks.oeb.base import css_text -from calibre.ebooks.oeb.polish.container import OEB_STYLES, OEB_DOCS from calibre.ebooks.oeb.normalize_css import normalize_font -from tinycss.fonts3 import parse_font_family, parse_font, serialize_font_family, serialize_font +from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/images.py b/src/calibre/ebooks/oeb/polish/images.py index f927b9819c..34ab4d4615 100644 --- a/src/calibre/ebooks/oeb/polish/images.py +++ b/src/calibre/ebooks/oeb/polish/images.py @@ -44,9 +44,7 @@ class Worker(Thread): self.queue.task_done() def compress(self, name, path, mime_type): - from calibre.utils.img import ( - encode_jpeg, encode_webp, optimize_jpeg, optimize_png, optimize_webp, - ) + from calibre.utils.img import encode_jpeg, encode_webp, optimize_jpeg, optimize_png, optimize_webp if 'png' in mime_type: func = optimize_png elif 'webp' in mime_type: diff --git a/src/calibre/ebooks/oeb/polish/import_book.py b/src/calibre/ebooks/oeb/polish/import_book.py index 8664467574..dedd51dbe3 100644 --- a/src/calibre/ebooks/oeb/polish/import_book.py +++ b/src/calibre/ebooks/oeb/polish/import_book.py @@ -4,13 +4,13 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, sys +import os +import sys -from calibre.ptempfile import TemporaryDirectory from calibre.ebooks.conversion.plumber import Plumber -from calibre.ebooks.oeb.polish.container import Container, OEB_DOCS, OEB_STYLES from calibre.ebooks.epub import initialize_container - +from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES, Container +from calibre.ptempfile import TemporaryDirectory from calibre.utils.logging import default_log from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/jacket.py b/src/calibre/ebooks/oeb/polish/jacket.py index d5eee3514e..272315b6cd 100644 --- a/src/calibre/ebooks/oeb/polish/jacket.py +++ b/src/calibre/ebooks/oeb/polish/jacket.py @@ -7,9 +7,10 @@ __docformat__ = 'restructuredtext en' from calibre.customize.ui import output_profiles from calibre.ebooks.conversion.config import load_defaults -from calibre.ebooks.oeb.base import XPath, OPF +from calibre.ebooks.oeb.base import OPF, XPath from calibre.ebooks.oeb.polish.cover import find_cover_page -from calibre.ebooks.oeb.transforms.jacket import render_jacket as render, referenced_images +from calibre.ebooks.oeb.transforms.jacket import referenced_images +from calibre.ebooks.oeb.transforms.jacket import render_jacket as render def render_jacket(container, jacket): diff --git a/src/calibre/ebooks/oeb/polish/main.py b/src/calibre/ebooks/oeb/polish/main.py index d445a959e0..fd32b77c4d 100644 --- a/src/calibre/ebooks/oeb/polish/main.py +++ b/src/calibre/ebooks/oeb/polish/main.py @@ -5,22 +5,23 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, sys, time +import re +import sys +import time from collections import namedtuple from functools import partial from calibre.ebooks.oeb.polish.container import get_container -from calibre.ebooks.oeb.polish.stats import StatsCollector -from calibre.ebooks.oeb.polish.subset import subset_all_fonts, iter_subsettable_fonts -from calibre.ebooks.oeb.polish.images import compress_images -from calibre.ebooks.oeb.polish.upgrade import upgrade_book -from calibre.ebooks.oeb.polish.embed import embed_all_fonts from calibre.ebooks.oeb.polish.cover import set_cover -from calibre.ebooks.oeb.polish.replace import smarten_punctuation -from calibre.ebooks.oeb.polish.jacket import ( - replace_jacket, add_or_replace_jacket, find_existing_jacket, remove_jacket) from calibre.ebooks.oeb.polish.css import remove_unused_css -from calibre.ebooks.oeb.polish.hyphenation import remove_soft_hyphens, add_soft_hyphens +from calibre.ebooks.oeb.polish.embed import embed_all_fonts +from calibre.ebooks.oeb.polish.hyphenation import add_soft_hyphens, remove_soft_hyphens +from calibre.ebooks.oeb.polish.images import compress_images +from calibre.ebooks.oeb.polish.jacket import add_or_replace_jacket, find_existing_jacket, remove_jacket, replace_jacket +from calibre.ebooks.oeb.polish.replace import smarten_punctuation +from calibre.ebooks.oeb.polish.stats import StatsCollector +from calibre.ebooks.oeb.polish.subset import iter_subsettable_fonts, subset_all_fonts +from calibre.ebooks.oeb.polish.upgrade import upgrade_book from calibre.utils.logging import Log from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/parsing.py b/src/calibre/ebooks/oeb/polish/parsing.py index 5f47df916c..033e84268f 100644 --- a/src/calibre/ebooks/oeb/polish/parsing.py +++ b/src/calibre/ebooks/oeb/polish/parsing.py @@ -6,13 +6,13 @@ __copyright__ = '2013, Kovid Goyal ' import re -from lxml.etree import Element as LxmlElement import html5_parser +from lxml.etree import Element as LxmlElement from calibre import xml_replace_entities -from calibre.utils.xml_parse import safe_xml_fromstring -from calibre.ebooks.chardet import xml_to_unicode, strip_encoding_declarations +from calibre.ebooks.chardet import strip_encoding_declarations, xml_to_unicode from calibre.utils.cleantext import clean_xml_chars +from calibre.utils.xml_parse import safe_xml_fromstring XHTML_NS = 'http://www.w3.org/1999/xhtml' diff --git a/src/calibre/ebooks/oeb/polish/pretty.py b/src/calibre/ebooks/oeb/polish/pretty.py index 8b1dd2942a..c30a31c7ff 100644 --- a/src/calibre/ebooks/oeb/polish/pretty.py +++ b/src/calibre/ebooks/oeb/polish/pretty.py @@ -5,16 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import textwrap -from polyglot.builtins import iteritems # from lxml.etree import Element - from calibre import force_unicode -from calibre.ebooks.oeb.base import ( - serialize, OEB_DOCS, barename, OEB_STYLES, XPNSMAP, XHTML, SVG) +from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, SVG, XHTML, XPNSMAP, barename, serialize from calibre.ebooks.oeb.polish.container import OPF_NAMESPACES from calibre.ebooks.oeb.polish.utils import guess_type from calibre.utils.icu import sort_key +from polyglot.builtins import iteritems def isspace(x): diff --git a/src/calibre/ebooks/oeb/polish/replace.py b/src/calibre/ebooks/oeb/polish/replace.py index efc09be273..b3d6619693 100644 --- a/src/calibre/ebooks/oeb/polish/replace.py +++ b/src/calibre/ebooks/oeb/polish/replace.py @@ -5,16 +5,19 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import codecs, shutil, os, posixpath -from polyglot.builtins import iteritems, itervalues -from functools import partial +import codecs +import os +import posixpath +import shutil from collections import Counter, defaultdict +from functools import partial from calibre import sanitize_file_name from calibre.ebooks.chardet import strip_encoding_declarations from calibre.ebooks.oeb.base import css_text from calibre.ebooks.oeb.polish.css import iter_declarations, remove_property_value from calibre.ebooks.oeb.polish.utils import extract +from polyglot.builtins import iteritems, itervalues from polyglot.urllib import urlparse, urlunparse @@ -229,8 +232,8 @@ def replace_file(container, name, path, basename, force_mt=None): def mt_to_category(container, mt): - from calibre.ebooks.oeb.polish.utils import guess_type, OEB_FONTS from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES + from calibre.ebooks.oeb.polish.utils import OEB_FONTS, guess_type if mt in OEB_DOCS: category = 'text' elif mt in OEB_STYLES: @@ -345,7 +348,7 @@ def remove_links_in_declaration(href_to_name, style, predicate): def remove_links_to(container, predicate): ''' predicate must be a function that takes the arguments (name, href, fragment=None) and returns True iff the link should be removed ''' - from calibre.ebooks.oeb.base import iterlinks, OEB_DOCS, OEB_STYLES, XPath, XHTML + from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, XHTML, XPath, iterlinks stylepath = XPath('//h:style') styleattrpath = XPath('//*[@style]') changed = set() diff --git a/src/calibre/ebooks/oeb/polish/report.py b/src/calibre/ebooks/oeb/polish/report.py index 6cf8bda5bd..0af77ae56b 100644 --- a/src/calibre/ebooks/oeb/polish/report.py +++ b/src/calibre/ebooks/oeb/polish/report.py @@ -4,18 +4,22 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import posixpath, os, time, types -from collections import namedtuple, defaultdict +import os +import posixpath +import time +import types +from collections import defaultdict, namedtuple from itertools import chain -from calibre import prepare_string_for_xml, force_unicode +from css_selectors import Select, SelectorError + +from calibre import force_unicode, prepare_string_for_xml from calibre.ebooks.oeb.base import XPath, xml2text from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES +from calibre.ebooks.oeb.polish.spell import count_all_chars, get_all_words from calibre.ebooks.oeb.polish.utils import OEB_FONTS -from calibre.ebooks.oeb.polish.spell import get_all_words, count_all_chars from calibre.utils.icu import numeric_sort_key, safe_chr from calibre.utils.imghdr import identify -from css_selectors import Select, SelectorError from polyglot.builtins import iteritems File = namedtuple('File', 'name dir basename size category word_count') @@ -234,7 +238,7 @@ ClassElement = namedtuple('ClassElement', 'name line_number text_on_line tag mat def css_data(container, book_locale, result_data, *args): import tinycss - from tinycss.css21 import RuleSet, ImportRule + from tinycss.css21 import ImportRule, RuleSet def css_rules(file_name, rules, sourceline=0): ans = [] diff --git a/src/calibre/ebooks/oeb/polish/spell.py b/src/calibre/ebooks/oeb/polish/spell.py index 92b3f4d015..f33f7ccfd9 100644 --- a/src/calibre/ebooks/oeb/polish/spell.py +++ b/src/calibre/ebooks/oeb/polish/spell.py @@ -5,15 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import sys -from collections import defaultdict, Counter +from collections import Counter, defaultdict from calibre import replace_entities -from calibre.spell.break_iterator import split_into_words, index_of -from calibre.spell.dictionary import parse_lang_code from calibre.ebooks.oeb.base import barename from calibre.ebooks.oeb.polish.container import OPF_NAMESPACES, get_container from calibre.ebooks.oeb.polish.parsing import parse -from calibre.ebooks.oeb.polish.toc import find_existing_ncx_toc, find_existing_nav_toc +from calibre.ebooks.oeb.polish.toc import find_existing_nav_toc, find_existing_ncx_toc +from calibre.spell.break_iterator import index_of, split_into_words +from calibre.spell.dictionary import parse_lang_code from calibre.utils.icu import ord_string from polyglot.builtins import iteritems @@ -404,7 +404,8 @@ def undo_replace_word(container, undo_cache): if __name__ == '__main__': import pprint - from calibre.gui2.tweak_book import set_book_locale, dictionaries + + from calibre.gui2.tweak_book import dictionaries, set_book_locale container = get_container(sys.argv[-1], tweak_mode=True) set_book_locale(container.mi.language) pprint.pprint(get_all_words(container, dictionaries.default_locale)) diff --git a/src/calibre/ebooks/oeb/polish/split.py b/src/calibre/ebooks/oeb/polish/split.py index 47151d20f4..7567ac6fdf 100644 --- a/src/calibre/ebooks/oeb/polish/split.py +++ b/src/calibre/ebooks/oeb/polish/split.py @@ -4,14 +4,15 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import copy, os, re -from polyglot.builtins import string_or_bytes +import copy +import os +import re -from calibre.ebooks.oeb.base import barename, XPNSMAP, XPath, OPF, XHTML, OEB_DOCS +from calibre.ebooks.oeb.base import OEB_DOCS, OPF, XHTML, XPNSMAP, XPath, barename from calibre.ebooks.oeb.polish.errors import MalformedMarkup -from calibre.ebooks.oeb.polish.toc import node_from_loc from calibre.ebooks.oeb.polish.replace import LinkRebaser -from polyglot.builtins import iteritems +from calibre.ebooks.oeb.polish.toc import node_from_loc +from polyglot.builtins import iteritems, string_or_bytes from polyglot.urllib import urlparse diff --git a/src/calibre/ebooks/oeb/polish/stats.py b/src/calibre/ebooks/oeb/polish/stats.py index 91b302ecb2..2cd6fd4d36 100644 --- a/src/calibre/ebooks/oeb/polish/stats.py +++ b/src/calibre/ebooks/oeb/polish/stats.py @@ -5,18 +5,19 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import regex import sys from functools import partial + +import regex from lxml.etree import tostring +from tinycss.fonts3 import parse_font_family from calibre.ebooks.oeb.base import XHTML, css_text from calibre.ebooks.oeb.polish.cascade import iterdeclaration, iterrules, resolve_styles -from calibre.utils.icu import ( - lower as icu_lower, ord_string, safe_chr, upper as icu_upper, -) +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import ord_string, safe_chr +from calibre.utils.icu import upper as icu_upper from polyglot.builtins import iteritems, itervalues -from tinycss.fonts3 import parse_font_family def normalize_font_properties(font): diff --git a/src/calibre/ebooks/oeb/polish/tests/base.py b/src/calibre/ebooks/oeb/polish/tests/base.py index fcc21004a4..f741142b7a 100644 --- a/src/calibre/ebooks/oeb/polish/tests/base.py +++ b/src/calibre/ebooks/oeb/polish/tests/base.py @@ -12,7 +12,8 @@ import calibre.ebooks.oeb.polish.container as pc from calibre import CurrentDir from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory from calibre.utils.logging import DevNull -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/polish/tests/cascade.py b/src/calibre/ebooks/oeb/polish/tests/cascade.py index ec47d9911b..153c3c447e 100644 --- a/src/calibre/ebooks/oeb/polish/tests/cascade.py +++ b/src/calibre/ebooks/oeb/polish/tests/cascade.py @@ -4,18 +4,17 @@ __license__ = 'GPL v3' __copyright__ = '2016, Kovid Goyal ' -from css_parser import parseStyle from functools import partial +from css_parser import parseStyle + from calibre.constants import iswindows from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES from calibre.ebooks.oeb.polish.cascade import DEFAULTS, iterrules, resolve_styles from calibre.ebooks.oeb.polish.container import ContainerBase, href_to_name from calibre.ebooks.oeb.polish.css import remove_property_value from calibre.ebooks.oeb.polish.embed import find_matching_font -from calibre.ebooks.oeb.polish.stats import ( - StatsCollector, font_keys, normalize_font_properties, prepare_font_rule, -) +from calibre.ebooks.oeb.polish.stats import StatsCollector, font_keys, normalize_font_properties, prepare_font_rule from calibre.ebooks.oeb.polish.tests.base import BaseTest from calibre.utils.icu import lower as icu_lower from calibre.utils.logging import Log, Stream diff --git a/src/calibre/ebooks/oeb/polish/tests/container.py b/src/calibre/ebooks/oeb/polish/tests/container.py index 7f4ed12946..0f58c40735 100644 --- a/src/calibre/ebooks/oeb/polish/tests/container.py +++ b/src/calibre/ebooks/oeb/polish/tests/container.py @@ -9,14 +9,11 @@ import subprocess from zipfile import ZipFile from calibre import CurrentDir -from calibre.ebooks.oeb.polish.container import ( - OCF_NS, clone_container, get_container as _gc, -) +from calibre.ebooks.oeb.polish.container import OCF_NS, clone_container +from calibre.ebooks.oeb.polish.container import get_container as _gc from calibre.ebooks.oeb.polish.replace import rationalize_folders, rename_files from calibre.ebooks.oeb.polish.split import merge, split -from calibre.ebooks.oeb.polish.tests.base import ( - BaseTest, get_simple_book, get_split_book, -) +from calibre.ebooks.oeb.polish.tests.base import BaseTest, get_simple_book, get_split_book from calibre.ptempfile import TemporaryDirectory, TemporaryFile from calibre.utils.filenames import nlinks_file from calibre.utils.resources import get_path as P @@ -202,9 +199,7 @@ class ContainerTests(BaseTest): def test_actual_case(self): ' Test getting the actual case for files from names on case insensitive filesystems ' - from calibre.ebooks.oeb.polish.utils import ( - actual_case_for_name, corrected_case_for_name, - ) + from calibre.ebooks.oeb.polish.utils import actual_case_for_name, corrected_case_for_name book = get_simple_book() c = get_container(book) name = 'f1/f2/added file.html' diff --git a/src/calibre/ebooks/oeb/polish/tests/parsing.py b/src/calibre/ebooks/oeb/polish/tests/parsing.py index 8f04f8a7d3..b65b697af0 100644 --- a/src/calibre/ebooks/oeb/polish/tests/parsing.py +++ b/src/calibre/ebooks/oeb/polish/tests/parsing.py @@ -6,13 +6,13 @@ __copyright__ = '2013, Kovid Goyal ' from functools import partial -from lxml import etree from html5lib.constants import cdataElements, rcdataElements +from lxml import etree -from calibre.ebooks.oeb.polish.tests.base import BaseTest -from calibre.ebooks.oeb.polish.parsing import parse_html5 as parse -from calibre.ebooks.oeb.base import XPath, XHTML_NS, SVG_NS, XLINK_NS +from calibre.ebooks.oeb.base import SVG_NS, XHTML_NS, XLINK_NS, XPath from calibre.ebooks.oeb.parse_utils import html5_parse +from calibre.ebooks.oeb.polish.parsing import parse_html5 as parse +from calibre.ebooks.oeb.polish.tests.base import BaseTest from polyglot.builtins import iteritems @@ -210,9 +210,11 @@ class ParsingTests(BaseTest): def timing(): import sys + + from html5lib import parse as vanilla + from calibre.ebooks.chardet import xml_to_unicode from calibre.utils.monotonic import monotonic - from html5lib import parse as vanilla filename = sys.argv[-1] with open(filename, 'rb') as f: raw = f.read() diff --git a/src/calibre/ebooks/oeb/polish/tests/structure.py b/src/calibre/ebooks/oeb/polish/tests/structure.py index 912ea380ac..4b072d28d2 100644 --- a/src/calibre/ebooks/oeb/polish/tests/structure.py +++ b/src/calibre/ebooks/oeb/polish/tests/structure.py @@ -2,22 +2,22 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal +import os +from functools import partial from io import BytesIO from itertools import count -from functools import partial -from zipfile import ZipFile, ZIP_STORED -import os -from calibre.ebooks.oeb.polish.tests.base import BaseTest -from calibre.ebooks.oeb.polish.container import get_container -from calibre.ebooks.oeb.polish.create import create_book -from calibre.ebooks.oeb.polish.cover import ( - find_cover_image, mark_as_cover, find_cover_page, mark_as_titlepage, clean_opf -) -from calibre.ebooks.oeb.polish.toc import get_toc, from_xpaths as toc_from_xpaths, get_landmarks -from calibre.ebooks.oeb.polish.utils import guess_type -from calibre.ebooks.oeb.base import OEB_DOCS +from zipfile import ZIP_STORED, ZipFile + from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.opf3 import CALIBRE_PREFIX +from calibre.ebooks.oeb.base import OEB_DOCS +from calibre.ebooks.oeb.polish.container import get_container +from calibre.ebooks.oeb.polish.cover import clean_opf, find_cover_image, find_cover_page, mark_as_cover, mark_as_titlepage +from calibre.ebooks.oeb.polish.create import create_book +from calibre.ebooks.oeb.polish.tests.base import BaseTest +from calibre.ebooks.oeb.polish.toc import from_xpaths as toc_from_xpaths +from calibre.ebooks.oeb.polish.toc import get_landmarks, get_toc +from calibre.ebooks.oeb.polish.utils import guess_type OPF_TEMPLATE = ''' diff --git a/src/calibre/ebooks/oeb/polish/toc.py b/src/calibre/ebooks/oeb/polish/toc.py index a6f51ea1b0..1147f26938 100644 --- a/src/calibre/ebooks/oeb/polish/toc.py +++ b/src/calibre/ebooks/oeb/polish/toc.py @@ -8,15 +8,13 @@ __docformat__ = 'restructuredtext en' import re from collections import Counter, OrderedDict from functools import partial -from lxml import etree -from lxml.builder import ElementMaker from operator import itemgetter +from lxml import etree +from lxml.builder import ElementMaker + from calibre import __version__ -from calibre.ebooks.oeb.base import ( - EPUB_NS, NCX, NCX_NS, OEB_DOCS, XHTML, XHTML_NS, XML, XML_NS, XPath, serialize, - uuid_id, xml2text, -) +from calibre.ebooks.oeb.base import EPUB_NS, NCX, NCX_NS, OEB_DOCS, XHTML, XHTML_NS, XML, XML_NS, XPath, serialize, uuid_id, xml2text from calibre.ebooks.oeb.polish.errors import MalformedMarkup from calibre.ebooks.oeb.polish.opf import get_book_language, set_guide_item from calibre.ebooks.oeb.polish.pretty import pretty_html_tree, pretty_xml_tree diff --git a/src/calibre/ebooks/oeb/polish/upgrade.py b/src/calibre/ebooks/oeb/polish/upgrade.py index d520066551..55846a12ad 100644 --- a/src/calibre/ebooks/oeb/polish/upgrade.py +++ b/src/calibre/ebooks/oeb/polish/upgrade.py @@ -4,17 +4,13 @@ import sys -from calibre.ebooks.conversion.plugins.epub_input import ( - ADOBE_OBFUSCATION, IDPF_OBFUSCATION -) +from calibre.ebooks.conversion.plugins.epub_input import ADOBE_OBFUSCATION, IDPF_OBFUSCATION from calibre.ebooks.metadata.opf3 import XPath from calibre.ebooks.metadata.opf_2_to_3 import upgrade_metadata from calibre.ebooks.oeb.base import DC, EPUB_NS, OEB_DOCS, xpath from calibre.ebooks.oeb.parse_utils import ensure_namespace_prefixes from calibre.ebooks.oeb.polish.opf import get_book_language -from calibre.ebooks.oeb.polish.toc import ( - commit_nav_toc, find_existing_ncx_toc, get_landmarks, get_toc -) +from calibre.ebooks.oeb.polish.toc import commit_nav_toc, find_existing_ncx_toc, get_landmarks, get_toc from calibre.ebooks.oeb.polish.utils import OEB_FONTS from calibre.utils.short_uuid import uuid4 diff --git a/src/calibre/ebooks/oeb/polish/utils.py b/src/calibre/ebooks/oeb/polish/utils.py index afd5e6b6cf..122aa3cb09 100644 --- a/src/calibre/ebooks/oeb/polish/utils.py +++ b/src/calibre/ebooks/oeb/polish/utils.py @@ -4,13 +4,14 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import re, os +import os +import re from bisect import bisect -from calibre import guess_type as _guess_type, replace_entities +from calibre import guess_type as _guess_type +from calibre import replace_entities from calibre.utils.icu import upper as icu_upper - BLOCK_TAG_NAMES = frozenset(( 'address', 'article', 'aside', 'blockquote', 'center', 'dir', 'fieldset', 'isindex', 'menu', 'noframes', 'hgroup', 'noscript', 'pre', 'section', @@ -160,7 +161,7 @@ class CommentFinder: def link_stylesheets(container, names, sheets, remove=False, mtype='text/css'): - from calibre.ebooks.oeb.base import XPath, XHTML + from calibre.ebooks.oeb.base import XHTML, XPath changed_names = set() snames = set(sheets) lp = XPath('//h:link[@href]') @@ -221,6 +222,7 @@ def parse_css(data, fname='', is_declaration=False, decode=None, log_lev import logging log_level = logging.WARNING from css_parser import CSSParser, log + from calibre.ebooks.oeb.base import _css_logger log.setLevel(log_level) log.raiseExceptions = False diff --git a/src/calibre/ebooks/oeb/reader.py b/src/calibre/ebooks/oeb/reader.py index 740d12187b..005d63159f 100644 --- a/src/calibre/ebooks/oeb/reader.py +++ b/src/calibre/ebooks/oeb/reader.py @@ -13,15 +13,40 @@ import re import sys import uuid from collections import defaultdict + from lxml import etree from calibre import guess_type, xml_replace_entities from calibre.constants import __appname__, __version__ from calibre.ebooks.oeb.base import ( - BINARY_MIME, COLLAPSE_RE, DC11_NS, DC_NSES, JPEG_MIME, MS_COVER_TYPE, NCX_MIME, - OEB_DOCS, OEB_IMAGES, OEB_STYLES, OPF, OPF1_NS, OPF2_NS, OPF2_NSMAP, PAGE_MAP_MIME, - SVG_MIME, XHTML_MIME, XMLDECL_RE, DirContainer, OEBBook, OEBError, XPath, barename, - iterlinks, namespace, urlnormalize, xml2text, xpath, + BINARY_MIME, + COLLAPSE_RE, + DC11_NS, + DC_NSES, + JPEG_MIME, + MS_COVER_TYPE, + NCX_MIME, + OEB_DOCS, + OEB_IMAGES, + OEB_STYLES, + OPF, + OPF1_NS, + OPF2_NS, + OPF2_NSMAP, + PAGE_MAP_MIME, + SVG_MIME, + XHTML_MIME, + XMLDECL_RE, + DirContainer, + OEBBook, + OEBError, + XPath, + barename, + iterlinks, + namespace, + urlnormalize, + xml2text, + xpath, ) from calibre.ebooks.oeb.writer import OEBWriter from calibre.ptempfile import TemporaryDirectory diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py index ce08fb6962..ff8178ab79 100644 --- a/src/calibre/ebooks/oeb/stylizer.py +++ b/src/calibre/ebooks/oeb/stylizer.py @@ -11,25 +11,23 @@ import numbers import os import re import unicodedata -from css_parser import ( - CSSParser, log as css_parser_log, parseString, parseStyle, profile as cssprofiles, - profiles, replaceUrls, -) -from css_parser.css import CSSFontFaceRule, CSSPageRule, CSSStyleRule, cssproperties from operator import itemgetter from weakref import WeakKeyDictionary from xml.dom import SyntaxErr as CSSSyntaxError +from css_parser import CSSParser, parseString, parseStyle, profiles, replaceUrls +from css_parser import log as css_parser_log +from css_parser import profile as cssprofiles +from css_parser.css import CSSFontFaceRule, CSSPageRule, CSSStyleRule, cssproperties +from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError +from tinycss.media3 import CSSMedia3Parser + from calibre import as_unicode, force_unicode from calibre.ebooks import unit_convert -from calibre.ebooks.oeb.base import ( - CSS_MIME, OEB_STYLES, XHTML, XHTML_NS, urlnormalize, xpath, -) +from calibre.ebooks.oeb.base import CSS_MIME, OEB_STYLES, XHTML, XHTML_NS, urlnormalize, xpath from calibre.ebooks.oeb.normalize_css import DEFAULTS, normalizers from calibre.utils.resources import get_path as P -from css_selectors import INAPPROPRIATE_PSEUDO_CLASSES, Select, SelectorError from polyglot.builtins import iteritems -from tinycss.media3 import CSSMedia3Parser css_parser_log.setLevel(logging.WARN) diff --git a/src/calibre/ebooks/oeb/transforms/data_url.py b/src/calibre/ebooks/oeb/transforms/data_url.py index fedbf8a65c..ffd4101c5f 100644 --- a/src/calibre/ebooks/oeb/transforms/data_url.py +++ b/src/calibre/ebooks/oeb/transforms/data_url.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import re + from calibre.ebooks.oeb.base import XPath, urlunquote from polyglot.builtins import as_bytes diff --git a/src/calibre/ebooks/oeb/transforms/embed_fonts.py b/src/calibre/ebooks/oeb/transforms/embed_fonts.py index a10d0d1813..3cb1740cf4 100644 --- a/src/calibre/ebooks/oeb/transforms/embed_fonts.py +++ b/src/calibre/ebooks/oeb/transforms/embed_fonts.py @@ -11,11 +11,11 @@ import css_parser from lxml import etree from calibre import guess_type -from calibre.ebooks.oeb.base import XPath, CSS_MIME, XHTML -from calibre.ebooks.oeb.transforms.subset import get_font_properties, find_font_face_rules, elem_style -from calibre.utils.filenames import ascii_filename -from calibre.utils.fonts.scanner import font_scanner, NoFonts +from calibre.ebooks.oeb.base import CSS_MIME, XHTML, XPath from calibre.ebooks.oeb.polish.embed import font_key +from calibre.ebooks.oeb.transforms.subset import elem_style, find_font_face_rules, get_font_properties +from calibre.utils.filenames import ascii_filename +from calibre.utils.fonts.scanner import NoFonts, font_scanner from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/transforms/flatcss.py b/src/calibre/ebooks/oeb/transforms/flatcss.py index bfc29978a1..214e06e55a 100644 --- a/src/calibre/ebooks/oeb/transforms/flatcss.py +++ b/src/calibre/ebooks/oeb/transforms/flatcss.py @@ -6,18 +6,20 @@ CSS flattening transform. __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -import re, operator, math, numbers +import math +import numbers +import operator +import re from collections import defaultdict from xml.dom import SyntaxErr -from lxml import etree import css_parser from css_parser.css import Property +from lxml import etree from calibre import guess_type from calibre.ebooks import unit_convert -from calibre.ebooks.oeb.base import (XHTML, XHTML_NS, CSS_MIME, OEB_STYLES, SVG_NS, - namespace, barename, XPath, css_text) +from calibre.ebooks.oeb.base import CSS_MIME, OEB_STYLES, SVG_NS, XHTML, XHTML_NS, XPath, barename, css_text, namespace from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.filenames import ascii_filename, ascii_text from calibre.utils.icu import numeric_sort_key @@ -223,7 +225,7 @@ class CSSFlattener: body_font_family = None if not family: return body_font_family, efi - from calibre.utils.fonts.scanner import font_scanner, NoFonts + from calibre.utils.fonts.scanner import NoFonts, font_scanner from calibre.utils.fonts.utils import panose_to_css_generic_family try: faces = font_scanner.fonts_for_family(family) diff --git a/src/calibre/ebooks/oeb/transforms/htmltoc.py b/src/calibre/ebooks/oeb/transforms/htmltoc.py index 135e224b7f..38a6d69b33 100644 --- a/src/calibre/ebooks/oeb/transforms/htmltoc.py +++ b/src/calibre/ebooks/oeb/transforms/htmltoc.py @@ -5,9 +5,7 @@ HTML-TOC-adding transform. __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -from calibre.ebooks.oeb.base import ( - CSS_MIME, XHTML, XHTML_MIME, XHTML_NS, XML, XPath, element, -) +from calibre.ebooks.oeb.base import CSS_MIME, XHTML, XHTML_MIME, XHTML_NS, XML, XPath, element from calibre.utils.localization import __ __all__ = ['HTMLTOCAdder'] diff --git a/src/calibre/ebooks/oeb/transforms/jacket.py b/src/calibre/ebooks/oeb/transforms/jacket.py index 91d21f7ab3..9e5932c191 100644 --- a/src/calibre/ebooks/oeb/transforms/jacket.py +++ b/src/calibre/ebooks/oeb/transforms/jacket.py @@ -17,9 +17,7 @@ from calibre.constants import iswindows from calibre.ebooks.chardet import strip_encoding_declarations from calibre.ebooks.metadata import fmt_sidx, rating_to_stars from calibre.ebooks.metadata.sources.identify import urls_from_identifiers -from calibre.ebooks.oeb.base import ( - XHTML, XHTML_NS, XPath, urldefrag, urlnormalize, xml2text, -) +from calibre.ebooks.oeb.base import XHTML, XHTML_NS, XPath, urldefrag, urlnormalize, xml2text from calibre.library.comments import comments_to_html, markdown from calibre.utils.config import tweaks from calibre.utils.date import as_local_time, format_date, is_date_undefined diff --git a/src/calibre/ebooks/oeb/transforms/linearize_tables.py b/src/calibre/ebooks/oeb/transforms/linearize_tables.py index 3578614dba..b3c05539e8 100644 --- a/src/calibre/ebooks/oeb/transforms/linearize_tables.py +++ b/src/calibre/ebooks/oeb/transforms/linearize_tables.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.ebooks.oeb.base import OEB_DOCS, XPath, XHTML +from calibre.ebooks.oeb.base import OEB_DOCS, XHTML, XPath class LinearizeTables: diff --git a/src/calibre/ebooks/oeb/transforms/manglecase.py b/src/calibre/ebooks/oeb/transforms/manglecase.py index c2f76239d2..7df2d9e330 100644 --- a/src/calibre/ebooks/oeb/transforms/manglecase.py +++ b/src/calibre/ebooks/oeb/transforms/manglecase.py @@ -9,9 +9,9 @@ from lxml import etree from calibre.ebooks.oeb.base import CSS_MIME, XHTML, XHTML_NS, namespace from calibre.ebooks.oeb.stylizer import Stylizer -from calibre.utils.icu import ( - lower as icu_lower, title_case as icu_title, upper as icu_upper, -) +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import title_case as icu_title +from calibre.utils.icu import upper as icu_upper from polyglot.builtins import string_or_bytes CASE_MANGLER_CSS = """ diff --git a/src/calibre/ebooks/oeb/transforms/metadata.py b/src/calibre/ebooks/oeb/transforms/metadata.py index 12a3ce2dfa..bd99f0d0bf 100644 --- a/src/calibre/ebooks/oeb/transforms/metadata.py +++ b/src/calibre/ebooks/oeb/transforms/metadata.py @@ -5,9 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re -from calibre.utils.date import isoformat, now +import os +import re + from calibre import guess_type +from calibre.utils.date import isoformat, now from polyglot.builtins import iteritems @@ -166,9 +168,10 @@ class MergeMetadata: return id def remove_old_cover(self, cover_item, new_cover_href=None): - from calibre.ebooks.oeb.base import XPath, XLINK from lxml import etree + from calibre.ebooks.oeb.base import XLINK, XPath + self.oeb.manifest.remove(cover_item) # Remove any references to the cover in the HTML diff --git a/src/calibre/ebooks/oeb/transforms/page_margin.py b/src/calibre/ebooks/oeb/transforms/page_margin.py index 07392d6c4a..7b49788e15 100644 --- a/src/calibre/ebooks/oeb/transforms/page_margin.py +++ b/src/calibre/ebooks/oeb/transforms/page_margin.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' import numbers from collections import Counter -from calibre.ebooks.oeb.base import barename, XPath +from calibre.ebooks.oeb.base import XPath, barename from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/oeb/transforms/rasterize.py b/src/calibre/ebooks/oeb/transforms/rasterize.py index ae5459adb1..6b2d583cbc 100644 --- a/src/calibre/ebooks/oeb/transforms/rasterize.py +++ b/src/calibre/ebooks/oeb/transforms/rasterize.py @@ -11,14 +11,10 @@ from base64 import standard_b64encode from functools import lru_cache from lxml import etree -from qt.core import ( - QBuffer, QByteArray, QColor, QImage, QIODevice, QPainter, QSvgRenderer, Qt, -) +from qt.core import QBuffer, QByteArray, QColor, QImage, QIODevice, QPainter, QSvgRenderer, Qt from calibre import guess_type -from calibre.ebooks.oeb.base import ( - PNG_MIME, SVG_MIME, XHTML, XLINK, urlnormalize, xml2str, xpath, -) +from calibre.ebooks.oeb.base import PNG_MIME, SVG_MIME, XHTML, XLINK, urlnormalize, xml2str, xpath from calibre.ebooks.oeb.stylizer import Stylizer from calibre.utils.imghdr import what from polyglot.urllib import urldefrag diff --git a/src/calibre/ebooks/oeb/transforms/rescale.py b/src/calibre/ebooks/oeb/transforms/rescale.py index dc7bc12475..78c9614979 100644 --- a/src/calibre/ebooks/oeb/transforms/rescale.py +++ b/src/calibre/ebooks/oeb/transforms/rescale.py @@ -20,9 +20,10 @@ class RescaleImages: self.rescale(max_size) def rescale(self, max_size: str = 'profile'): - from PIL import Image from io import BytesIO + from PIL import Image + is_image_collection = getattr(self.opts, 'is_image_collection', False) if is_image_collection: diff --git a/src/calibre/ebooks/oeb/transforms/split.py b/src/calibre/ebooks/oeb/transforms/split.py index b6b4ea55b4..9cc17766f1 100644 --- a/src/calibre/ebooks/oeb/transforms/split.py +++ b/src/calibre/ebooks/oeb/transforms/split.py @@ -8,20 +8,24 @@ forced at "likely" locations to conform to size limitations. This transform assumes a prior call to the flatcss transform. ''' -import os, functools, collections, re, copy +import collections +import copy +import functools +import os +import re from collections import OrderedDict -from lxml.etree import XPath as _XPath +from css_selectors import Select, SelectorError from lxml import etree +from lxml.etree import XPath as _XPath from calibre import as_unicode, force_unicode from calibre.ebooks.epub import rules -from calibre.ebooks.oeb.base import (OEB_STYLES, XPNSMAP as NAMESPACES, - urldefrag, rewrite_links, XHTML, urlnormalize) +from calibre.ebooks.oeb.base import OEB_STYLES, XHTML, rewrite_links, urldefrag, urlnormalize +from calibre.ebooks.oeb.base import XPNSMAP as NAMESPACES from calibre.ebooks.oeb.polish.split import do_split from polyglot.builtins import iteritems from polyglot.urllib import unquote -from css_selectors import Select, SelectorError XPath = functools.partial(_XPath, namespaces=NAMESPACES) diff --git a/src/calibre/ebooks/oeb/transforms/structure.py b/src/calibre/ebooks/oeb/transforms/structure.py index 161bdc1a98..f715277ade 100644 --- a/src/calibre/ebooks/oeb/transforms/structure.py +++ b/src/calibre/ebooks/oeb/transforms/structure.py @@ -5,13 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, uuid +import re +import uuid +from collections import Counter, OrderedDict from lxml import etree -from collections import OrderedDict, Counter -from calibre.ebooks.oeb.base import XPNSMAP, TOC, XHTML, xml2text, barename from calibre.ebooks import ConversionError +from calibre.ebooks.oeb.base import TOC, XHTML, XPNSMAP, barename, xml2text from polyglot.builtins import itervalues from polyglot.urllib import urlparse diff --git a/src/calibre/ebooks/oeb/transforms/subset.py b/src/calibre/ebooks/oeb/transforms/subset.py index a10b1d901d..a3d9270a17 100644 --- a/src/calibre/ebooks/oeb/transforms/subset.py +++ b/src/calibre/ebooks/oeb/transforms/subset.py @@ -9,10 +9,11 @@ import os from collections import defaultdict from io import BytesIO +from tinycss.fonts3 import parse_font_family + from calibre.ebooks.oeb.base import css_text, urlnormalize from calibre.utils.fonts.subset import subset from polyglot.builtins import iteritems -from tinycss.fonts3 import parse_font_family def get_font_properties(rule, default=None): diff --git a/src/calibre/ebooks/oeb/transforms/trimmanifest.py b/src/calibre/ebooks/oeb/transforms/trimmanifest.py index fa09aae808..1886f245ab 100644 --- a/src/calibre/ebooks/oeb/transforms/trimmanifest.py +++ b/src/calibre/ebooks/oeb/transforms/trimmanifest.py @@ -6,8 +6,7 @@ OPF manifest trimming transform. __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' -from calibre.ebooks.oeb.base import CSS_MIME, OEB_DOCS -from calibre.ebooks.oeb.base import urlnormalize, iterlinks +from calibre.ebooks.oeb.base import CSS_MIME, OEB_DOCS, iterlinks, urlnormalize from polyglot.urllib import urldefrag diff --git a/src/calibre/ebooks/oeb/writer.py b/src/calibre/ebooks/oeb/writer.py index 3d293d6efd..b30138101b 100644 --- a/src/calibre/ebooks/oeb/writer.py +++ b/src/calibre/ebooks/oeb/writer.py @@ -7,8 +7,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Marshall T. Vandegrift ' import os -from calibre.ebooks.oeb.base import OPF_MIME, xml2str -from calibre.ebooks.oeb.base import DirContainer, OEBError + +from calibre.ebooks.oeb.base import OPF_MIME, DirContainer, OEBError, xml2str __all__ = ['OEBWriter'] diff --git a/src/calibre/ebooks/pdb/__init__.py b/src/calibre/ebooks/pdb/__init__.py index 12d74a04a8..ee8835f4de 100644 --- a/src/calibre/ebooks/pdb/__init__.py +++ b/src/calibre/ebooks/pdb/__init__.py @@ -13,11 +13,11 @@ FORMAT_READERS = None def _import_readers(): global FORMAT_READERS from calibre.ebooks.pdb.ereader.reader import Reader as ereader_reader + from calibre.ebooks.pdb.haodoo.reader import Reader as haodoo_reader from calibre.ebooks.pdb.palmdoc.reader import Reader as palmdoc_reader - from calibre.ebooks.pdb.ztxt.reader import Reader as ztxt_reader from calibre.ebooks.pdb.pdf.reader import Reader as pdf_reader from calibre.ebooks.pdb.plucker.reader import Reader as plucker_reader - from calibre.ebooks.pdb.haodoo.reader import Reader as haodoo_reader + from calibre.ebooks.pdb.ztxt.reader import Reader as ztxt_reader FORMAT_READERS = { 'PNPdPPrs': ereader_reader, @@ -37,9 +37,9 @@ FORMAT_WRITERS = None def _import_writers(): global FORMAT_WRITERS + from calibre.ebooks.pdb.ereader.writer import Writer as ereader_writer from calibre.ebooks.pdb.palmdoc.writer import Writer as palmdoc_writer from calibre.ebooks.pdb.ztxt.writer import Writer as ztxt_writer - from calibre.ebooks.pdb.ereader.writer import Writer as ereader_writer FORMAT_WRITERS = { 'doc': palmdoc_writer, diff --git a/src/calibre/ebooks/pdb/ereader/reader.py b/src/calibre/ebooks/pdb/ereader/reader.py index fd547e6c2b..3edd14750f 100644 --- a/src/calibre/ebooks/pdb/ereader/reader.py +++ b/src/calibre/ebooks/pdb/ereader/reader.py @@ -7,9 +7,9 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' from calibre.ebooks.pdb.ereader import EreaderError -from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.pdb.ereader.reader132 import Reader132 from calibre.ebooks.pdb.ereader.reader202 import Reader202 +from calibre.ebooks.pdb.formatreader import FormatReader class Reader(FormatReader): diff --git a/src/calibre/ebooks/pdb/ereader/reader132.py b/src/calibre/ebooks/pdb/ereader/reader132.py index 16c35b8345..f479862ad5 100644 --- a/src/calibre/ebooks/pdb/ereader/reader132.py +++ b/src/calibre/ebooks/pdb/ereader/reader132.py @@ -102,8 +102,7 @@ class Reader132(FormatReader): return self.decompress_text(number) def extract_content(self, output_dir): - from calibre.ebooks.pml.pmlconverter import footnote_to_html, sidebar_to_html - from calibre.ebooks.pml.pmlconverter import PML_HTMLizer + from calibre.ebooks.pml.pmlconverter import PML_HTMLizer, footnote_to_html, sidebar_to_html output_dir = os.path.abspath(output_dir) diff --git a/src/calibre/ebooks/pdb/haodoo/reader.py b/src/calibre/ebooks/pdb/haodoo/reader.py index d308cb98ef..945efa7cdd 100644 --- a/src/calibre/ebooks/pdb/haodoo/reader.py +++ b/src/calibre/ebooks/pdb/haodoo/reader.py @@ -7,13 +7,13 @@ __copyright__ = '2012, Kan-Ru Chen ' __docformat__ = 'restructuredtext en' -import struct import os +import struct from calibre import prepare_string_for_xml -from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.metadata import MetaInformation -from calibre.ebooks.txt.processor import opf_writer, HTML_TEMPLATE +from calibre.ebooks.pdb.formatreader import FormatReader +from calibre.ebooks.txt.processor import HTML_TEMPLATE, opf_writer BPDB_IDENT = 'BOOKMTIT' UPDB_IDENT = 'BOOKMTIU' diff --git a/src/calibre/ebooks/pdb/header.py b/src/calibre/ebooks/pdb/header.py index b4acdf0e5a..4c990abeae 100644 --- a/src/calibre/ebooks/pdb/header.py +++ b/src/calibre/ebooks/pdb/header.py @@ -9,6 +9,7 @@ __docformat__ = 'restructuredtext en' import re import struct import time + from polyglot.builtins import long_type diff --git a/src/calibre/ebooks/pdb/palmdoc/reader.py b/src/calibre/ebooks/pdb/palmdoc/reader.py index 4dd0a2a113..463e5d0115 100644 --- a/src/calibre/ebooks/pdb/palmdoc/reader.py +++ b/src/calibre/ebooks/pdb/palmdoc/reader.py @@ -6,8 +6,8 @@ __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -import struct, io - +import io +import struct from calibre.ebooks.pdb.formatreader import FormatReader diff --git a/src/calibre/ebooks/pdb/palmdoc/writer.py b/src/calibre/ebooks/pdb/palmdoc/writer.py index 43de51e008..b2f659d6d7 100644 --- a/src/calibre/ebooks/pdb/palmdoc/writer.py +++ b/src/calibre/ebooks/pdb/palmdoc/writer.py @@ -10,8 +10,8 @@ import struct from calibre.ebooks.pdb.formatwriter import FormatWriter from calibre.ebooks.pdb.header import PdbHeaderBuilder -from calibre.ebooks.txt.txtml import TXTMLizer from calibre.ebooks.txt.newlines import TxtNewlines, specified_newlines +from calibre.ebooks.txt.txtml import TXTMLizer MAX_RECORD_SIZE = 4096 diff --git a/src/calibre/ebooks/pdb/plucker/reader.py b/src/calibre/ebooks/pdb/plucker/reader.py index 4a9ac3313e..9df38f9e8f 100644 --- a/src/calibre/ebooks/pdb/plucker/reader.py +++ b/src/calibre/ebooks/pdb/plucker/reader.py @@ -5,14 +5,13 @@ __docformat__ = 'restructuredtext en' import os import struct import zlib - from collections import OrderedDict from calibre import CurrentDir -from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.compression.palmdoc import decompress_doc +from calibre.ebooks.pdb.formatreader import FormatReader +from calibre.utils.img import Canvas, image_from_data, save_cover_data_to from calibre.utils.imghdr import identify -from calibre.utils.img import save_cover_data_to, Canvas, image_from_data from polyglot.builtins import codepoint_to_chr DATATYPE_PHTML = 0 diff --git a/src/calibre/ebooks/pdb/ztxt/reader.py b/src/calibre/ebooks/pdb/ztxt/reader.py index ef0ebebc2b..56678193e7 100644 --- a/src/calibre/ebooks/pdb/ztxt/reader.py +++ b/src/calibre/ebooks/pdb/ztxt/reader.py @@ -6,10 +6,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' +import io import struct import zlib -import io - from calibre.ebooks.pdb.formatreader import FormatReader from calibre.ebooks.pdb.ztxt import zTXTError diff --git a/src/calibre/ebooks/pdb/ztxt/writer.py b/src/calibre/ebooks/pdb/ztxt/writer.py index 4a75c471d8..01ce97c517 100644 --- a/src/calibre/ebooks/pdb/ztxt/writer.py +++ b/src/calibre/ebooks/pdb/ztxt/writer.py @@ -6,12 +6,13 @@ __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -import struct, zlib +import struct +import zlib from calibre.ebooks.pdb.formatwriter import FormatWriter from calibre.ebooks.pdb.header import PdbHeaderBuilder -from calibre.ebooks.txt.txtml import TXTMLizer from calibre.ebooks.txt.newlines import TxtNewlines, specified_newlines +from calibre.ebooks.txt.txtml import TXTMLizer MAX_RECORD_SIZE = 8192 diff --git a/src/calibre/ebooks/pdf/develop.py b/src/calibre/ebooks/pdf/develop.py index 9732fd9d8c..27591cb22d 100644 --- a/src/calibre/ebooks/pdf/develop.py +++ b/src/calibre/ebooks/pdf/develop.py @@ -4,7 +4,7 @@ import sys -from qt.core import QApplication, QUrl, QPageLayout, QPageSize, QMarginsF +from qt.core import QApplication, QMarginsF, QPageLayout, QPageSize, QUrl from qt.webengine import QWebEnginePage from calibre.gui2 import load_builtin_fonts, must_use_qt diff --git a/src/calibre/ebooks/pdf/html_writer.py b/src/calibre/ebooks/pdf/html_writer.py index 98ef90e344..ecfbcb78fc 100644 --- a/src/calibre/ebooks/pdf/html_writer.py +++ b/src/calibre/ebooks/pdf/html_writer.py @@ -9,20 +9,21 @@ import signal import sys from collections import namedtuple from functools import lru_cache -from html5_parser import parse from itertools import count, repeat -from qt.core import ( - QApplication, QByteArray, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl, - pyqtSignal, sip, -) + +from html5_parser import parse +from qt.core import QApplication, QByteArray, QMarginsF, QObject, QPageLayout, Qt, QTimer, QUrl, pyqtSignal, sip from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineSettings, - QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, + QWebEnginePage, + QWebEngineProfile, + QWebEngineSettings, + QWebEngineUrlRequestInterceptor, + QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, ) from calibre import detect_ncpus, human_readable, prepare_string_for_xml -from calibre.constants import FAKE_HOST, FAKE_PROTOCOL, __version__, ismacos, iswindows, __appname__ +from calibre.constants import FAKE_HOST, FAKE_PROTOCOL, __appname__, __version__, ismacos, iswindows from calibre.ebooks.metadata.xmp import metadata_to_xmp_packet from calibre.ebooks.oeb.base import XHTML, XPath from calibre.ebooks.oeb.polish.container import Container as ContainerBase @@ -37,10 +38,7 @@ from calibre.utils.fonts.sfnt.merge import merge_truetype_fonts_for_pdf from calibre.utils.fonts.sfnt.subset import pdf_subset from calibre.utils.logging import default_log from calibre.utils.monotonic import monotonic -from calibre.utils.podofo import ( - add_image_page, dedup_type3_fonts, get_podofo, remove_unused_fonts, - set_metadata_implementation, -) +from calibre.utils.podofo import add_image_page, dedup_type3_fonts, get_podofo, remove_unused_fonts, set_metadata_implementation from calibre.utils.resources import get_path as P from calibre.utils.short_uuid import uuid4 from calibre.utils.webengine import secure_webengine, send_reply, setup_profile diff --git a/src/calibre/ebooks/pdf/pdftohtml.py b/src/calibre/ebooks/pdf/pdftohtml.py index 40eac81a63..1b6f2b0b74 100644 --- a/src/calibre/ebooks/pdf/pdftohtml.py +++ b/src/calibre/ebooks/pdf/pdftohtml.py @@ -122,6 +122,7 @@ def pdftohtml(output_dir, pdf_path, no_images, as_xml=False): def parse_outline(raw, output_dir): from lxml import etree + from calibre.utils.xml_parse import safe_xml_fromstring raw = clean_xml_chars(xml_to_unicode(raw, strip_encoding_pats=True, assume_utf8=True)[0]) outline = safe_xml_fromstring(raw).xpath('(//outline)[1]') diff --git a/src/calibre/ebooks/pdf/reflow.py b/src/calibre/ebooks/pdf/reflow.py index 4169f63c95..f66dd4dc00 100644 --- a/src/calibre/ebooks/pdf/reflow.py +++ b/src/calibre/ebooks/pdf/reflow.py @@ -5,7 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, numbers +import numbers +import os +import sys from itertools import count from lxml import etree diff --git a/src/calibre/ebooks/pdf/render/common.py b/src/calibre/ebooks/pdf/render/common.py index 6c64fdd5c2..ff5e18d5f1 100644 --- a/src/calibre/ebooks/pdf/render/common.py +++ b/src/calibre/ebooks/pdf/render/common.py @@ -5,14 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import codecs, zlib, numbers -from io import BytesIO +import codecs +import numbers +import zlib from datetime import datetime +from io import BytesIO from calibre.utils.logging import default_log -from polyglot.builtins import iteritems, codepoint_to_chr -from polyglot.binary import as_hex_bytes from calibre_extensions.speedup import pdf_float +from polyglot.binary import as_hex_bytes +from polyglot.builtins import codepoint_to_chr, iteritems EOL = b'\n' diff --git a/src/calibre/ebooks/pdf/render/fonts.py b/src/calibre/ebooks/pdf/render/fonts.py index 6f59ac9ee0..b7a8fc510f 100644 --- a/src/calibre/ebooks/pdf/render/fonts.py +++ b/src/calibre/ebooks/pdf/render/fonts.py @@ -6,16 +6,15 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' import re +from collections import Counter, OrderedDict from itertools import groupby from operator import itemgetter -from collections import Counter, OrderedDict -from polyglot.builtins import iteritems, codepoint_to_chr from calibre import as_unicode -from calibre.ebooks.pdf.render.common import (Array, String, Stream, - Dictionary, Name) -from calibre.utils.fonts.sfnt.subset import pdf_subset, UnsupportedFont, NoGlyphs +from calibre.ebooks.pdf.render.common import Array, Dictionary, Name, Stream, String +from calibre.utils.fonts.sfnt.subset import NoGlyphs, UnsupportedFont, pdf_subset from calibre.utils.short_uuid import uuid4 +from polyglot.builtins import codepoint_to_chr, iteritems STANDARD_FONTS = { 'Times-Roman', 'Helvetica', 'Courier', 'Symbol', 'Times-Bold', diff --git a/src/calibre/ebooks/pdf/render/gradients.py b/src/calibre/ebooks/pdf/render/gradients.py index 4880d25f16..6e9c1ae1fa 100644 --- a/src/calibre/ebooks/pdf/render/gradients.py +++ b/src/calibre/ebooks/pdf/render/gradients.py @@ -5,12 +5,13 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, copy +import copy +import sys from collections import namedtuple from qt.core import QLinearGradient, QPointF, sip -from calibre.ebooks.pdf.render.common import Name, Array, Dictionary +from calibre.ebooks.pdf.render.common import Array, Dictionary, Name Stop = namedtuple('Stop', 't color') diff --git a/src/calibre/ebooks/pdf/render/graphics.py b/src/calibre/ebooks/pdf/render/graphics.py index 2d28f9a830..70b43a6224 100644 --- a/src/calibre/ebooks/pdf/render/graphics.py +++ b/src/calibre/ebooks/pdf/render/graphics.py @@ -5,16 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from math import sqrt from collections import namedtuple +from math import sqrt -from qt.core import ( - QBrush, QPen, Qt, QPointF, QTransform, QPaintEngine, QImage) +from qt.core import QBrush, QImage, QPaintEngine, QPen, QPointF, Qt, QTransform -from calibre.ebooks.pdf.render.common import ( - Name, Array, fmtnum, Stream, Dictionary) -from calibre.ebooks.pdf.render.serialize import Path +from calibre.ebooks.pdf.render.common import Array, Dictionary, Name, Stream, fmtnum from calibre.ebooks.pdf.render.gradients import LinearGradientPattern +from calibre.ebooks.pdf.render.serialize import Path def convert_path(path): # {{{ diff --git a/src/calibre/ebooks/pdf/render/links.py b/src/calibre/ebooks/pdf/render/links.py index 7425fbbf47..2cdb491cdd 100644 --- a/src/calibre/ebooks/pdf/render/links.py +++ b/src/calibre/ebooks/pdf/render/links.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import os -from calibre.ebooks.pdf.render.common import Array, Name, Dictionary, String, UTF16String, current_log +from calibre.ebooks.pdf.render.common import Array, Dictionary, Name, String, UTF16String, current_log from polyglot.builtins import iteritems from polyglot.urllib import unquote, urlparse diff --git a/src/calibre/ebooks/pdf/render/serialize.py b/src/calibre/ebooks/pdf/render/serialize.py index ceab4d97c9..0efe50e4ea 100644 --- a/src/calibre/ebooks/pdf/render/serialize.py +++ b/src/calibre/ebooks/pdf/render/serialize.py @@ -5,19 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import hashlib, numbers -from polyglot.builtins import iteritems +import hashlib +import numbers -from qt.core import QBuffer, QByteArray, QImage, Qt, QColor, qRgba, QPainter +from qt.core import QBuffer, QByteArray, QColor, QImage, QPainter, Qt, qRgba -from calibre.constants import (__appname__, __version__) -from calibre.ebooks.pdf.render.common import ( - Reference, EOL, serialize, Stream, Dictionary, String, Name, Array, - fmtnum) +from calibre.constants import __appname__, __version__ +from calibre.ebooks.pdf.render.common import EOL, Array, Dictionary, Name, Reference, Stream, String, fmtnum, serialize from calibre.ebooks.pdf.render.fonts import FontManager from calibre.ebooks.pdf.render.links import Links from calibre.utils.date import utcnow -from polyglot.builtins import as_unicode +from polyglot.builtins import as_unicode, iteritems PDFVER = b'%PDF-1.4' # 1.4 is needed for XMP metadata diff --git a/src/calibre/ebooks/pml/pmlconverter.py b/src/calibre/ebooks/pml/pmlconverter.py index 0e361258ba..b9a04b9356 100644 --- a/src/calibre/ebooks/pml/pmlconverter.py +++ b/src/calibre/ebooks/pml/pmlconverter.py @@ -6,9 +6,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' +import io import os import re -import io from copy import deepcopy from calibre import my_unichr, prepare_string_for_xml diff --git a/src/calibre/ebooks/pml/pmlml.py b/src/calibre/ebooks/pml/pmlml.py index b85c67cae9..f963956285 100644 --- a/src/calibre/ebooks/pml/pmlml.py +++ b/src/calibre/ebooks/pml/pmlml.py @@ -11,8 +11,8 @@ import re from lxml import etree from calibre.ebooks.pdb.ereader import image_name -from calibre.utils.xml_parse import safe_xml_fromstring from calibre.ebooks.pml import unipmlcode +from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.builtins import string_or_bytes TAG_MAP = { @@ -110,8 +110,8 @@ class PMLMLizer: return output def get_cover_page(self): - from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import XHTML + from calibre.ebooks.oeb.stylizer import Stylizer output = '' if 'cover' in self.oeb_book.guide: @@ -128,8 +128,8 @@ class PMLMLizer: return output def get_text(self): - from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import XHTML + from calibre.ebooks.oeb.stylizer import Stylizer text = [''] for item in self.oeb_book.spine: diff --git a/src/calibre/ebooks/rb/__init__.py b/src/calibre/ebooks/rb/__init__.py index 04f2e2045b..f7169e9583 100644 --- a/src/calibre/ebooks/rb/__init__.py +++ b/src/calibre/ebooks/rb/__init__.py @@ -4,7 +4,6 @@ __docformat__ = 'restructuredtext en' import os - HEADER = b'\xb0\x0c\xb0\x0c\x02\x00NUVO\x00\x00\x00\x00' diff --git a/src/calibre/ebooks/rb/rbml.py b/src/calibre/ebooks/rb/rbml.py index 557dccc82d..908982269d 100644 --- a/src/calibre/ebooks/rb/rbml.py +++ b/src/calibre/ebooks/rb/rbml.py @@ -78,8 +78,8 @@ class RBMLizer: return output def get_cover_page(self): - from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import XHTML + from calibre.ebooks.oeb.stylizer import Stylizer output = '' if 'cover' in self.oeb_book.guide: if self.name_map.get(self.oeb_book.guide['cover'].href, None): @@ -108,8 +108,8 @@ class RBMLizer: return ''.join(toc) def get_text(self): - from calibre.ebooks.oeb.stylizer import Stylizer from calibre.ebooks.oeb.base import XHTML + from calibre.ebooks.oeb.stylizer import Stylizer output = [''] for item in self.oeb_book.spine: diff --git a/src/calibre/ebooks/rb/reader.py b/src/calibre/ebooks/rb/reader.py index 58a5ecb5bb..271686fb26 100644 --- a/src/calibre/ebooks/rb/reader.py +++ b/src/calibre/ebooks/rb/reader.py @@ -7,10 +7,9 @@ import struct import zlib from calibre import CurrentDir -from calibre.ebooks.rb import HEADER -from calibre.ebooks.rb import RocketBookError -from calibre.ebooks.metadata.rb import get_metadata from calibre.ebooks.metadata.opf2 import OPFCreator +from calibre.ebooks.metadata.rb import get_metadata +from calibre.ebooks.rb import HEADER, RocketBookError from polyglot.builtins import as_unicode from polyglot.urllib import unquote diff --git a/src/calibre/ebooks/rb/writer.py b/src/calibre/ebooks/rb/writer.py index 195339e3da..5c2bf7396a 100644 --- a/src/calibre/ebooks/rb/writer.py +++ b/src/calibre/ebooks/rb/writer.py @@ -8,10 +8,9 @@ import zlib from PIL import Image -from calibre.ebooks.rb.rbml import RBMLizer -from calibre.ebooks.rb import HEADER -from calibre.ebooks.rb import unique_name from calibre.constants import __appname__, __version__ +from calibre.ebooks.rb import HEADER, unique_name +from calibre.ebooks.rb.rbml import RBMLizer TEXT_RECORD_SIZE = 4096 diff --git a/src/calibre/ebooks/readability/cleaners.py b/src/calibre/ebooks/readability/cleaners.py index 1f67810c89..fee5aec96f 100644 --- a/src/calibre/ebooks/readability/cleaners.py +++ b/src/calibre/ebooks/readability/cleaners.py @@ -1,5 +1,6 @@ # strip out a set of nuisance html attributes that can mess up rendering in RSS feeds import re + from lxml.html.clean import Cleaner bad_attrs = ['width', 'height', 'style', '[-a-z]*color', 'background[-a-z]*', 'on*'] diff --git a/src/calibre/ebooks/readability/htmls.py b/src/calibre/ebooks/readability/htmls.py index 9c9289face..c4b104a5b6 100644 --- a/src/calibre/ebooks/readability/htmls.py +++ b/src/calibre/ebooks/readability/htmls.py @@ -1,10 +1,10 @@ import re -from lxml.html import tostring import lxml.html +from lxml.html import tostring -from calibre.ebooks.readability.cleaners import normalize_spaces, clean_attributes from calibre.ebooks.chardet import xml_to_unicode +from calibre.ebooks.readability.cleaners import clean_attributes, normalize_spaces from polyglot.builtins import iteritems diff --git a/src/calibre/ebooks/readability/readability.py b/src/calibre/ebooks/readability/readability.py index edffc0c4ff..bed0759a79 100644 --- a/src/calibre/ebooks/readability/readability.py +++ b/src/calibre/ebooks/readability/readability.py @@ -1,16 +1,16 @@ #!/usr/bin/env python -import re, sys +import re +import sys from collections import defaultdict -from polyglot.builtins import reraise - -from lxml.html import (fragment_fromstring, document_fromstring, - tostring as htostring) +from lxml.html import document_fromstring, fragment_fromstring +from lxml.html import tostring as htostring +from calibre.ebooks.readability.cleaners import clean_attributes, html_cleaner from calibre.ebooks.readability.htmls import build_doc, get_body, get_title, shorten_title -from calibre.ebooks.readability.cleaners import html_cleaner, clean_attributes +from polyglot.builtins import reraise def tounicode(tree_or_node, **kwargs): diff --git a/src/calibre/ebooks/render_html.py b/src/calibre/ebooks/render_html.py index 285adc9a32..e4100e607b 100644 --- a/src/calibre/ebooks/render_html.py +++ b/src/calibre/ebooks/render_html.py @@ -4,13 +4,15 @@ import os import sys -from qt.core import ( - QApplication, QByteArray, QMarginsF, QPageLayout, QPageSize, Qt, QTimer, QUrl -) + +from qt.core import QApplication, QByteArray, QMarginsF, QPageLayout, QPageSize, Qt, QTimer, QUrl from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, - QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler + QWebEnginePage, + QWebEngineProfile, + QWebEngineScript, + QWebEngineUrlRequestInterceptor, + QWebEngineUrlRequestJob, + QWebEngineUrlSchemeHandler, ) from calibre.constants import FAKE_HOST, FAKE_PROTOCOL @@ -21,9 +23,7 @@ from calibre.gui_launch import setup_qt_logging from calibre.utils.filenames import atomic_rename from calibre.utils.logging import default_log from calibre.utils.monotonic import monotonic -from calibre.utils.webengine import ( - secure_webengine, send_reply, setup_fake_protocol, setup_profile -) +from calibre.utils.webengine import secure_webengine, send_reply, setup_fake_protocol, setup_profile LOAD_TIMEOUT = 20 PRINT_TIMEOUT = 10 @@ -148,9 +148,7 @@ class Render(QWebEnginePage): if type(getattr(QPageSize, sz, None)) is type(QPageSize.PageSizeId.A4): # noqa page_size = QPageSize(getattr(QPageSize, sz)) else: - from calibre.ebooks.pdf.image_writer import ( - parse_pdf_page_size - ) + from calibre.ebooks.pdf.image_writer import parse_pdf_page_size ps = parse_pdf_page_size(sz, data.get('unit', 'inch')) if ps is not None: page_size = ps diff --git a/src/calibre/ebooks/rtf/rtfml.py b/src/calibre/ebooks/rtf/rtfml.py index 7dd24b199c..52ac036f12 100644 --- a/src/calibre/ebooks/rtf/rtfml.py +++ b/src/calibre/ebooks/rtf/rtfml.py @@ -6,9 +6,9 @@ __docformat__ = 'restructuredtext en' Transform OEB content into RTF markup ''' +import io import os import re -import io from binascii import hexlify from lxml import etree @@ -212,8 +212,7 @@ class RTFMLizer: return text def dump_text(self, elem, stylizer, tag_stack=[]): - from calibre.ebooks.oeb.base import (XHTML_NS, namespace, barename, - urlnormalize) + from calibre.ebooks.oeb.base import XHTML_NS, barename, namespace, urlnormalize if not isinstance(elem.tag, string_or_bytes) \ or namespace(elem.tag) != XHTML_NS: diff --git a/src/calibre/ebooks/rtf2xml/ParseRtf.py b/src/calibre/ebooks/rtf2xml/ParseRtf.py index 13c7510daa..4c182370b9 100644 --- a/src/calibre/ebooks/rtf2xml/ParseRtf.py +++ b/src/calibre/ebooks/rtf2xml/ParseRtf.py @@ -12,18 +12,47 @@ ######################################################################### # $Revision: 1.41 $ # $Date: 2006/03/24 23:50:07 $ -import sys, os +import os +import sys -from calibre.ebooks.rtf2xml import headings_to_sections, \ - line_endings, footnote, fields_small, default_encoding, \ - make_lists, preamble_div, header, colors, group_borders, \ - check_encoding, add_brackets, table, combine_borders, \ - fields_large, process_tokens, hex_2_utf8, tokenize, \ - delete_info, sections, check_brackets, styles, \ - paragraph_def, convert_to_tags, output, copy, \ - list_numbers, info, pict, table_info, fonts, paragraphs, \ - body_styles, preamble_rest, group_styles, \ - inline +from calibre.ebooks.rtf2xml import ( + add_brackets, + body_styles, + check_brackets, + check_encoding, + colors, + combine_borders, + convert_to_tags, + copy, + default_encoding, + delete_info, + fields_large, + fields_small, + fonts, + footnote, + group_borders, + group_styles, + header, + headings_to_sections, + hex_2_utf8, + info, + inline, + line_endings, + list_numbers, + make_lists, + output, + paragraph_def, + paragraphs, + pict, + preamble_div, + preamble_rest, + process_tokens, + sections, + styles, + table, + table_info, + tokenize, +) from calibre.ebooks.rtf2xml.old_rtf import OldRtf from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/add_brackets.py b/src/calibre/ebooks/rtf2xml/add_brackets.py index e6533460e6..30b03d829c 100644 --- a/src/calibre/ebooks/rtf2xml/add_brackets.py +++ b/src/calibre/ebooks/rtf2xml/add_brackets.py @@ -11,11 +11,13 @@ # # # # ######################################################################### -import sys, os +import os +import sys -from calibre.ebooks.rtf2xml import copy, check_brackets +from calibre.ebooks.rtf2xml import check_brackets, copy from calibre.ptempfile import better_mktemp from polyglot.builtins import iteritems + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/body_styles.py b/src/calibre/ebooks/rtf2xml/body_styles.py index 1876264971..65d784513a 100644 --- a/src/calibre/ebooks/rtf2xml/body_styles.py +++ b/src/calibre/ebooks/rtf2xml/body_styles.py @@ -11,8 +11,10 @@ # # ######################################################################### import os + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write """ diff --git a/src/calibre/ebooks/rtf2xml/colors.py b/src/calibre/ebooks/rtf2xml/colors.py index a8aab50230..7f0fa81c7b 100644 --- a/src/calibre/ebooks/rtf2xml/colors.py +++ b/src/calibre/ebooks/rtf2xml/colors.py @@ -10,10 +10,13 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/combine_borders.py b/src/calibre/ebooks/rtf2xml/combine_borders.py index 85262d8b89..f8ed8d0b05 100644 --- a/src/calibre/ebooks/rtf2xml/combine_borders.py +++ b/src/calibre/ebooks/rtf2xml/combine_borders.py @@ -14,6 +14,7 @@ import os from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/configure_txt.py b/src/calibre/ebooks/rtf2xml/configure_txt.py index c66a1c961e..d0414f33a4 100644 --- a/src/calibre/ebooks/rtf2xml/configure_txt.py +++ b/src/calibre/ebooks/rtf2xml/configure_txt.py @@ -1,4 +1,6 @@ -import os, sys +import os +import sys + from . import open_for_read diff --git a/src/calibre/ebooks/rtf2xml/convert_to_tags.py b/src/calibre/ebooks/rtf2xml/convert_to_tags.py index 4b470d442b..150036c081 100644 --- a/src/calibre/ebooks/rtf2xml/convert_to_tags.py +++ b/src/calibre/ebooks/rtf2xml/convert_to_tags.py @@ -1,7 +1,9 @@ -import os, sys +import os +import sys -from calibre.ebooks.rtf2xml import copy, check_encoding +from calibre.ebooks.rtf2xml import check_encoding, copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write public_dtd = 'rtf2xml1.0.dtd' diff --git a/src/calibre/ebooks/rtf2xml/copy.py b/src/calibre/ebooks/rtf2xml/copy.py index e89d24c002..7f2fab0898 100644 --- a/src/calibre/ebooks/rtf2xml/copy.py +++ b/src/calibre/ebooks/rtf2xml/copy.py @@ -10,7 +10,8 @@ # # # # ######################################################################### -import os, shutil +import os +import shutil class Copy: diff --git a/src/calibre/ebooks/rtf2xml/default_encoding.py b/src/calibre/ebooks/rtf2xml/default_encoding.py index 5d1461c57c..d6d411bde3 100644 --- a/src/calibre/ebooks/rtf2xml/default_encoding.py +++ b/src/calibre/ebooks/rtf2xml/default_encoding.py @@ -56,6 +56,7 @@ Codepages as to RTF 1.9.1: 57011 Punjabi ''' import re + from . import open_for_read diff --git a/src/calibre/ebooks/rtf2xml/delete_info.py b/src/calibre/ebooks/rtf2xml/delete_info.py index b45e3d122d..f5743f50d2 100644 --- a/src/calibre/ebooks/rtf2xml/delete_info.py +++ b/src/calibre/ebooks/rtf2xml/delete_info.py @@ -10,10 +10,12 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/field_strings.py b/src/calibre/ebooks/rtf2xml/field_strings.py index 33602d46f7..257edcecb3 100644 --- a/src/calibre/ebooks/rtf2xml/field_strings.py +++ b/src/calibre/ebooks/rtf2xml/field_strings.py @@ -10,7 +10,8 @@ # # # # ######################################################################### -import sys, re +import re +import sys class FieldStrings: diff --git a/src/calibre/ebooks/rtf2xml/fields_large.py b/src/calibre/ebooks/rtf2xml/fields_large.py index 2d4af119a9..5a208d2eae 100644 --- a/src/calibre/ebooks/rtf2xml/fields_large.py +++ b/src/calibre/ebooks/rtf2xml/fields_large.py @@ -10,9 +10,12 @@ # # # # ######################################################################### -import sys, os -from calibre.ebooks.rtf2xml import field_strings, copy +import os +import sys + +from calibre.ebooks.rtf2xml import copy, field_strings from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/fields_small.py b/src/calibre/ebooks/rtf2xml/fields_small.py index 3feef24eb8..d2a0fbd846 100644 --- a/src/calibre/ebooks/rtf2xml/fields_small.py +++ b/src/calibre/ebooks/rtf2xml/fields_small.py @@ -10,10 +10,13 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys -from calibre.ebooks.rtf2xml import field_strings, copy +from calibre.ebooks.rtf2xml import copy, field_strings from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/fonts.py b/src/calibre/ebooks/rtf2xml/fonts.py index 54ab352efa..a3fd4b9d53 100644 --- a/src/calibre/ebooks/rtf2xml/fonts.py +++ b/src/calibre/ebooks/rtf2xml/fonts.py @@ -10,10 +10,12 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/get_options.py b/src/calibre/ebooks/rtf2xml/get_options.py index 47aa3faf6a..5c5fd60b2f 100644 --- a/src/calibre/ebooks/rtf2xml/get_options.py +++ b/src/calibre/ebooks/rtf2xml/get_options.py @@ -13,8 +13,10 @@ """ Gets options for main part of script """ -import sys, os -from calibre.ebooks.rtf2xml import options_trem, configure_txt +import os +import sys + +from calibre.ebooks.rtf2xml import configure_txt, options_trem class GetOptions: diff --git a/src/calibre/ebooks/rtf2xml/group_borders.py b/src/calibre/ebooks/rtf2xml/group_borders.py index 6fde25d7b2..3b6f118393 100644 --- a/src/calibre/ebooks/rtf2xml/group_borders.py +++ b/src/calibre/ebooks/rtf2xml/group_borders.py @@ -10,9 +10,13 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/group_styles.py b/src/calibre/ebooks/rtf2xml/group_styles.py index f873650823..fa8bbaec44 100644 --- a/src/calibre/ebooks/rtf2xml/group_styles.py +++ b/src/calibre/ebooks/rtf2xml/group_styles.py @@ -10,9 +10,13 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/header.py b/src/calibre/ebooks/rtf2xml/header.py index 1d6e3261dd..85d8a384ed 100644 --- a/src/calibre/ebooks/rtf2xml/header.py +++ b/src/calibre/ebooks/rtf2xml/header.py @@ -10,10 +10,12 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/headings_to_sections.py b/src/calibre/ebooks/rtf2xml/headings_to_sections.py index b40f4cd9a5..6253f18f33 100644 --- a/src/calibre/ebooks/rtf2xml/headings_to_sections.py +++ b/src/calibre/ebooks/rtf2xml/headings_to_sections.py @@ -10,9 +10,12 @@ # # # # ######################################################################### -import os, re +import os +import re + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/hex_2_utf8.py b/src/calibre/ebooks/rtf2xml/hex_2_utf8.py index 48a45ce007..86905baeff 100644 --- a/src/calibre/ebooks/rtf2xml/hex_2_utf8.py +++ b/src/calibre/ebooks/rtf2xml/hex_2_utf8.py @@ -10,9 +10,11 @@ # # # # ######################################################################### -import sys, os, io +import io +import os +import sys -from calibre.ebooks.rtf2xml import get_char_map, copy +from calibre.ebooks.rtf2xml import copy, get_char_map from calibre.ebooks.rtf2xml.char_set import char_set from calibre.ptempfile import better_mktemp diff --git a/src/calibre/ebooks/rtf2xml/info.py b/src/calibre/ebooks/rtf2xml/info.py index dbf619c79f..821b3ee68e 100644 --- a/src/calibre/ebooks/rtf2xml/info.py +++ b/src/calibre/ebooks/rtf2xml/info.py @@ -10,10 +10,13 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/inline.py b/src/calibre/ebooks/rtf2xml/inline.py index 4c103b454d..eadb8d2daf 100644 --- a/src/calibre/ebooks/rtf2xml/inline.py +++ b/src/calibre/ebooks/rtf2xml/inline.py @@ -1,7 +1,9 @@ -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write """ diff --git a/src/calibre/ebooks/rtf2xml/line_endings.py b/src/calibre/ebooks/rtf2xml/line_endings.py index 5dbc59a995..e34c4a98dc 100644 --- a/src/calibre/ebooks/rtf2xml/line_endings.py +++ b/src/calibre/ebooks/rtf2xml/line_endings.py @@ -13,8 +13,8 @@ import os from calibre.ebooks.rtf2xml import copy -from calibre.utils.cleantext import clean_ascii_chars from calibre.ptempfile import better_mktemp +from calibre.utils.cleantext import clean_ascii_chars class FixLineEndings: diff --git a/src/calibre/ebooks/rtf2xml/list_numbers.py b/src/calibre/ebooks/rtf2xml/list_numbers.py index 6da6a34b8d..d9379087ad 100644 --- a/src/calibre/ebooks/rtf2xml/list_numbers.py +++ b/src/calibre/ebooks/rtf2xml/list_numbers.py @@ -11,8 +11,10 @@ # # ######################################################################### import os + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/make_lists.py b/src/calibre/ebooks/rtf2xml/make_lists.py index 137ad01e14..cd06075e47 100644 --- a/src/calibre/ebooks/rtf2xml/make_lists.py +++ b/src/calibre/ebooks/rtf2xml/make_lists.py @@ -10,7 +10,9 @@ # # # # ######################################################################### -import sys, os, re +import os +import re +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp diff --git a/src/calibre/ebooks/rtf2xml/output.py b/src/calibre/ebooks/rtf2xml/output.py index 7a3b7d1167..f9f11b4f5c 100644 --- a/src/calibre/ebooks/rtf2xml/output.py +++ b/src/calibre/ebooks/rtf2xml/output.py @@ -10,8 +10,11 @@ # # # # ######################################################################### -import sys, os +import os +import sys + from . import open_for_read, open_for_write + # , codecs diff --git a/src/calibre/ebooks/rtf2xml/paragraph_def.py b/src/calibre/ebooks/rtf2xml/paragraph_def.py index acb2281a05..e5b63d7bf5 100644 --- a/src/calibre/ebooks/rtf2xml/paragraph_def.py +++ b/src/calibre/ebooks/rtf2xml/paragraph_def.py @@ -10,9 +10,10 @@ # # # # ######################################################################### -import sys, os +import os +import sys -from calibre.ebooks.rtf2xml import copy, border_parse +from calibre.ebooks.rtf2xml import border_parse, copy from calibre.ptempfile import better_mktemp from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/paragraphs.py b/src/calibre/ebooks/rtf2xml/paragraphs.py index 425fd89312..a7786c4ea1 100644 --- a/src/calibre/ebooks/rtf2xml/paragraphs.py +++ b/src/calibre/ebooks/rtf2xml/paragraphs.py @@ -10,10 +10,12 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/pict.py b/src/calibre/ebooks/rtf2xml/pict.py index 0cd65c3067..46c8f23a06 100644 --- a/src/calibre/ebooks/rtf2xml/pict.py +++ b/src/calibre/ebooks/rtf2xml/pict.py @@ -10,7 +10,8 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp diff --git a/src/calibre/ebooks/rtf2xml/preamble_div.py b/src/calibre/ebooks/rtf2xml/preamble_div.py index 760b170403..92c5ddb01f 100644 --- a/src/calibre/ebooks/rtf2xml/preamble_div.py +++ b/src/calibre/ebooks/rtf2xml/preamble_div.py @@ -10,9 +10,12 @@ # # # # ######################################################################### -import sys, os -from calibre.ebooks.rtf2xml import copy, override_table, list_table +import os +import sys + +from calibre.ebooks.rtf2xml import copy, list_table, override_table from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/preamble_rest.py b/src/calibre/ebooks/rtf2xml/preamble_rest.py index 7bc731a4e3..785325581d 100644 --- a/src/calibre/ebooks/rtf2xml/preamble_rest.py +++ b/src/calibre/ebooks/rtf2xml/preamble_rest.py @@ -10,9 +10,11 @@ # # # # ######################################################################### -import sys,os +import os +import sys from calibre.ebooks.rtf2xml import copy + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/process_tokens.py b/src/calibre/ebooks/rtf2xml/process_tokens.py index d773a12dc7..f118f0deef 100644 --- a/src/calibre/ebooks/rtf2xml/process_tokens.py +++ b/src/calibre/ebooks/rtf2xml/process_tokens.py @@ -10,9 +10,10 @@ # # # # ######################################################################### -import os, re +import os +import re -from calibre.ebooks.rtf2xml import copy, check_brackets +from calibre.ebooks.rtf2xml import check_brackets, copy from calibre.ptempfile import better_mktemp from . import open_for_read, open_for_write @@ -719,7 +720,7 @@ class ProcessTokens: try: # calibre why ignore negative number? Wrong in case of \fi numerator = float(re.search('[0-9.\\-]+', numerator).group()) - except TypeError as msg: + except TypeError: if self.__run_level > 3: msg = ('No number to process?\nthis indicates that the token \\(\\li\\) \ should have a number and does not\nnumerator is \ diff --git a/src/calibre/ebooks/rtf2xml/replace_illegals.py b/src/calibre/ebooks/rtf2xml/replace_illegals.py index 7b811fce95..c2521922e6 100644 --- a/src/calibre/ebooks/rtf2xml/replace_illegals.py +++ b/src/calibre/ebooks/rtf2xml/replace_illegals.py @@ -13,8 +13,9 @@ import os from calibre.ebooks.rtf2xml import copy -from calibre.utils.cleantext import clean_ascii_chars from calibre.ptempfile import better_mktemp +from calibre.utils.cleantext import clean_ascii_chars + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/sections.py b/src/calibre/ebooks/rtf2xml/sections.py index 2b8865c4ad..16c000f3be 100644 --- a/src/calibre/ebooks/rtf2xml/sections.py +++ b/src/calibre/ebooks/rtf2xml/sections.py @@ -10,7 +10,8 @@ # # # # ######################################################################### -import sys, os +import os +import sys from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp diff --git a/src/calibre/ebooks/rtf2xml/styles.py b/src/calibre/ebooks/rtf2xml/styles.py index f717a1f907..99cdeff9f1 100644 --- a/src/calibre/ebooks/rtf2xml/styles.py +++ b/src/calibre/ebooks/rtf2xml/styles.py @@ -10,9 +10,12 @@ # # # # ######################################################################### -import sys, os -from calibre.ebooks.rtf2xml import copy, border_parse +import os +import sys + +from calibre.ebooks.rtf2xml import border_parse, copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/table.py b/src/calibre/ebooks/rtf2xml/table.py index 9fd65ca5df..68576424b1 100644 --- a/src/calibre/ebooks/rtf2xml/table.py +++ b/src/calibre/ebooks/rtf2xml/table.py @@ -10,9 +10,10 @@ # # # # ######################################################################### -import sys, os +import os +import sys -from calibre.ebooks.rtf2xml import copy, border_parse +from calibre.ebooks.rtf2xml import border_parse, copy from calibre.ptempfile import better_mktemp from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/rtf2xml/table_info.py b/src/calibre/ebooks/rtf2xml/table_info.py index 04a0bdc719..56983c2280 100644 --- a/src/calibre/ebooks/rtf2xml/table_info.py +++ b/src/calibre/ebooks/rtf2xml/table_info.py @@ -11,8 +11,10 @@ # # ######################################################################### import os + from calibre.ebooks.rtf2xml import copy from calibre.ptempfile import better_mktemp + from . import open_for_read, open_for_write # note to self. This is the first module in which I use tempfile. A good idea? diff --git a/src/calibre/ebooks/rtf2xml/tokenize.py b/src/calibre/ebooks/rtf2xml/tokenize.py index fcd2fb3dd2..6a9bde8830 100644 --- a/src/calibre/ebooks/rtf2xml/tokenize.py +++ b/src/calibre/ebooks/rtf2xml/tokenize.py @@ -10,12 +10,14 @@ # # # # ######################################################################### -import os, re +import os +import re from calibre.ebooks.rtf2xml import copy -from calibre.utils.mreplace import MReplace from calibre.ptempfile import better_mktemp +from calibre.utils.mreplace import MReplace from polyglot.builtins import codepoint_to_chr + from . import open_for_read, open_for_write diff --git a/src/calibre/ebooks/snb/snbfile.py b/src/calibre/ebooks/snb/snbfile.py index 3f87046e29..07536bf880 100644 --- a/src/calibre/ebooks/snb/snbfile.py +++ b/src/calibre/ebooks/snb/snbfile.py @@ -2,7 +2,11 @@ __license__ = 'GPL v3' __copyright__ = '2010, Li Fanxi ' __docformat__ = 'restructuredtext en' -import sys, struct, zlib, bz2, os +import bz2 +import os +import struct +import sys +import zlib from calibre import guess_type diff --git a/src/calibre/ebooks/snb/snbml.py b/src/calibre/ebooks/snb/snbml.py index f482f2a33e..4d09d20cb6 100644 --- a/src/calibre/ebooks/snb/snbml.py +++ b/src/calibre/ebooks/snb/snbml.py @@ -10,6 +10,7 @@ import os import re from lxml import etree + from polyglot.builtins import string_or_bytes diff --git a/src/calibre/ebooks/textile/__init__.py b/src/calibre/ebooks/textile/__init__.py index 1acbfc38fc..c566ffac6d 100644 --- a/src/calibre/ebooks/textile/__init__.py +++ b/src/calibre/ebooks/textile/__init__.py @@ -1,4 +1,4 @@ -from .functions import textile, textile_restricted, Textile +from .functions import Textile, textile, textile_restricted if False: textile, textile_restricted, Textile diff --git a/src/calibre/ebooks/tweak.py b/src/calibre/ebooks/tweak.py index b083b5cf2a..8f372c25e0 100644 --- a/src/calibre/ebooks/tweak.py +++ b/src/calibre/ebooks/tweak.py @@ -5,14 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, unicodedata +import os +import sys +import unicodedata -from calibre import prints, as_unicode, walk -from calibre.constants import iswindows, __appname__ -from calibre.ptempfile import TemporaryDirectory +from calibre import as_unicode, prints, walk +from calibre.constants import __appname__, iswindows from calibre.libunzip import extract as zipextract -from calibre.utils.zipfile import ZipFile, ZIP_DEFLATED, ZIP_STORED +from calibre.ptempfile import TemporaryDirectory from calibre.utils.ipc.simple_worker import WorkerError +from calibre.utils.zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile class Error(ValueError): @@ -27,7 +29,8 @@ def ask_cli_question(msg): import msvcrt ans = msvcrt.getch() else: - import tty, termios + import termios + import tty old_settings = termios.tcgetattr(sys.stdin.fileno()) try: tty.setraw(sys.stdin.fileno()) @@ -42,7 +45,7 @@ def ask_cli_question(msg): def mobi_exploder(path, tdir, question=lambda x:True): - from calibre.ebooks.mobi.tweak import explode, BadFormat + from calibre.ebooks.mobi.tweak import BadFormat, explode try: return explode(path, tdir, question=question) except BadFormat as e: diff --git a/src/calibre/ebooks/txt/markdownml.py b/src/calibre/ebooks/txt/markdownml.py index f09d920d13..aa9d1f5291 100644 --- a/src/calibre/ebooks/txt/markdownml.py +++ b/src/calibre/ebooks/txt/markdownml.py @@ -7,7 +7,6 @@ __docformat__ = 'restructuredtext en' Transform OEB content into Textile formatted plain text ''' import re - from functools import partial from calibre.ebooks.htmlz.oeb2html import OEB2HTML diff --git a/src/calibre/ebooks/txt/processor.py b/src/calibre/ebooks/txt/processor.py index 47206e44f9..45fc22eded 100644 --- a/src/calibre/ebooks/txt/processor.py +++ b/src/calibre/ebooks/txt/processor.py @@ -7,12 +7,12 @@ __docformat__ = 'restructuredtext en' Read content from txt file. ''' -import os, re - -from calibre import prepare_string_for_xml, isbytestring -from calibre.ebooks.metadata.opf2 import OPFCreator +import os +import re +from calibre import isbytestring, prepare_string_for_xml from calibre.ebooks.conversion.preprocess import DocAnalysis +from calibre.ebooks.metadata.opf2 import OPFCreator from calibre.utils.cleantext import clean_ascii_chars from polyglot.builtins import iteritems @@ -106,9 +106,11 @@ DEFAULT_MD_EXTENSIONS = ('footnotes', 'tables', 'toc') def create_markdown_object(extensions): # Need to load markdown extensions without relying on pkg_resources import importlib - from calibre.ebooks.markdown import Markdown + from markdown import Extension + from calibre.ebooks.markdown import Markdown + class NotBrainDeadMarkdown(Markdown): def build_extension(self, ext_name, configs): if '.' in ext_name or ':' in ext_name: @@ -135,9 +137,9 @@ def convert_markdown(txt, title='', extensions=DEFAULT_MD_EXTENSIONS): def convert_markdown_with_metadata(txt, title='', extensions=DEFAULT_MD_EXTENSIONS): + from calibre.db.write import get_series_values from calibre.ebooks.metadata.book.base import Metadata from calibre.utils.date import parse_only_date - from calibre.db.write import get_series_values if 'meta' not in extensions: extensions.append('meta') md = create_markdown_object(extensions) @@ -355,8 +357,8 @@ def detect_formatting_type(txt): def get_images_from_polyglot_text(txt: str, base_dir: str = '', file_ext: str = 'txt') -> set: - from calibre.ebooks.oeb.base import OEB_IMAGES from calibre import guess_type + from calibre.ebooks.oeb.base import OEB_IMAGES if not base_dir: base_dir = os.getcwd() images = set() diff --git a/src/calibre/ebooks/txt/textileml.py b/src/calibre/ebooks/txt/textileml.py index 8411714137..6d75b3a62e 100644 --- a/src/calibre/ebooks/txt/textileml.py +++ b/src/calibre/ebooks/txt/textileml.py @@ -6,13 +6,12 @@ __docformat__ = 'restructuredtext en' Transform OEB content into Textile formatted plain text ''' import re - from functools import partial +from calibre.ebooks import unit_convert from calibre.ebooks.htmlz.oeb2html import OEB2HTML from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, rewrite_links from calibre.ebooks.oeb.stylizer import Stylizer -from calibre.ebooks import unit_convert from calibre.ebooks.textile.unsmarten import unsmarten from polyglot.builtins import string_or_bytes diff --git a/src/calibre/ebooks/txt/txtml.py b/src/calibre/ebooks/txt/txtml.py index b3ed04187f..4c5a39c72e 100644 --- a/src/calibre/ebooks/txt/txtml.py +++ b/src/calibre/ebooks/txt/txtml.py @@ -9,8 +9,8 @@ Transform OEB content into plain text import re from lxml import etree -from polyglot.builtins import string_or_bytes +from polyglot.builtins import string_or_bytes BLOCK_TAGS = [ 'div', diff --git a/src/calibre/ebooks/unihandecode/jadecoder.py b/src/calibre/ebooks/unihandecode/jadecoder.py index c143ac4f9e..635e35c8b5 100644 --- a/src/calibre/ebooks/unihandecode/jadecoder.py +++ b/src/calibre/ebooks/unihandecode/jadecoder.py @@ -17,10 +17,11 @@ Copyright (c) 2010 Hiroshi Miura ''' import re -from calibre.ebooks.unihandecode.unidecoder import Unidecoder -from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS + from calibre.ebooks.unihandecode.jacodepoints import CODEPOINTS as JACODES from calibre.ebooks.unihandecode.pykakasi.kakasi import kakasi +from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS +from calibre.ebooks.unihandecode.unidecoder import Unidecoder class Jadecoder(Unidecoder): diff --git a/src/calibre/ebooks/unihandecode/krdecoder.py b/src/calibre/ebooks/unihandecode/krdecoder.py index e4cbca94f8..1aaa415f99 100644 --- a/src/calibre/ebooks/unihandecode/krdecoder.py +++ b/src/calibre/ebooks/unihandecode/krdecoder.py @@ -8,9 +8,9 @@ Based on unidecoder. ''' -from calibre.ebooks.unihandecode.unidecoder import Unidecoder from calibre.ebooks.unihandecode.krcodepoints import CODEPOINTS as HANCODES from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS +from calibre.ebooks.unihandecode.unidecoder import Unidecoder class Krdecoder(Unidecoder): diff --git a/src/calibre/ebooks/unihandecode/pykakasi/__init__.py b/src/calibre/ebooks/unihandecode/pykakasi/__init__.py index 705aced763..7900e91691 100644 --- a/src/calibre/ebooks/unihandecode/pykakasi/__init__.py +++ b/src/calibre/ebooks/unihandecode/pykakasi/__init__.py @@ -1,4 +1,5 @@ from calibre.ebooks.unihandecode.pykakasi.kakasi import kakasi + kakasi __all__ = ["pykakasi"] diff --git a/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py b/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py index 749ba30971..c4ff561f35 100644 --- a/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py +++ b/src/calibre/ebooks/unihandecode/pykakasi/jisyo.py @@ -21,8 +21,8 @@ class jisyo : return self def __init__(self): - from calibre.utils.serialize import msgpack_loads from calibre.utils.resources import get_path as P + from calibre.utils.serialize import msgpack_loads if self.kanwadict is None: self.kanwadict = msgpack_loads( P('localization/pykakasi/kanwadict2.calibre_msgpack', data=True)) diff --git a/src/calibre/ebooks/unihandecode/pykakasi/kakasi.py b/src/calibre/ebooks/unihandecode/pykakasi/kakasi.py index 0429667f92..04db2fce30 100644 --- a/src/calibre/ebooks/unihandecode/pykakasi/kakasi.py +++ b/src/calibre/ebooks/unihandecode/pykakasi/kakasi.py @@ -21,8 +21,8 @@ # */ -from calibre.ebooks.unihandecode.pykakasi.j2h import J2H from calibre.ebooks.unihandecode.pykakasi.h2a import H2a +from calibre.ebooks.unihandecode.pykakasi.j2h import J2H from calibre.ebooks.unihandecode.pykakasi.k2a import K2a diff --git a/src/calibre/ebooks/unihandecode/unidecoder.py b/src/calibre/ebooks/unihandecode/unidecoder.py index 6a56ce5166..a4a3ba9a5a 100644 --- a/src/calibre/ebooks/unihandecode/unidecoder.py +++ b/src/calibre/ebooks/unihandecode/unidecoder.py @@ -58,6 +58,7 @@ it under the same terms as Perl itself. ''' import re + from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS from calibre.ebooks.unihandecode.zhcodepoints import CODEPOINTS as HANCODES diff --git a/src/calibre/ebooks/unihandecode/vndecoder.py b/src/calibre/ebooks/unihandecode/vndecoder.py index 2f6f89c11d..6f26b2fde1 100644 --- a/src/calibre/ebooks/unihandecode/vndecoder.py +++ b/src/calibre/ebooks/unihandecode/vndecoder.py @@ -7,9 +7,9 @@ Decode unicode text to an ASCII representation of the text in Vietnamese. ''' +from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS from calibre.ebooks.unihandecode.unidecoder import Unidecoder from calibre.ebooks.unihandecode.vncodepoints import CODEPOINTS as HANCODES -from calibre.ebooks.unihandecode.unicodepoints import CODEPOINTS class Vndecoder(Unidecoder): diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 423791751f..fd501990dc 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -10,28 +10,71 @@ import sys import threading from contextlib import contextmanager, suppress from functools import lru_cache -from qt.core import ( - QApplication, QBuffer, QByteArray, QColor, QDateTime, QDesktopServices, QDialog, - QDialogButtonBox, QEvent, QFile, QFileDialog, QFileIconProvider, QFileInfo, QFont, - QFontDatabase, QFontInfo, QFontMetrics, QGuiApplication, QIcon, QImageReader, - QImageWriter, QIODevice, QLocale, QNetworkProxyFactory, QObject, QPalette, - QResource, QSettings, QSocketNotifier, QStringListModel, Qt, QThread, QTimer, - QTranslator, QUrl, QWidget, pyqtSignal, pyqtSlot, -) from threading import Lock, RLock +from qt.core import ( + QApplication, + QBuffer, + QByteArray, + QColor, + QDateTime, + QDesktopServices, + QDialog, + QDialogButtonBox, + QEvent, + QFile, + QFileDialog, + QFileIconProvider, + QFileInfo, + QFont, + QFontDatabase, + QFontInfo, + QFontMetrics, + QGuiApplication, + QIcon, + QImageReader, + QImageWriter, + QIODevice, + QLocale, + QNetworkProxyFactory, + QObject, + QPalette, + QResource, + QSettings, + QSocketNotifier, + QStringListModel, + Qt, + QThread, + QTimer, + QTranslator, + QUrl, + QWidget, + pyqtSignal, + pyqtSlot, +) + import calibre.gui2.pyqt6_compat as pqc from calibre import as_unicode, prints from calibre.constants import ( - DEBUG, __appname__ as APP_UID, __version__, builtin_colors_dark, - builtin_colors_light, config_dir, is_running_from_develop, isbsd, isfrozen, islinux, - ismacos, iswindows, isxp, numeric_version, plugins_loc, + DEBUG, + __version__, + builtin_colors_dark, + builtin_colors_light, + config_dir, + is_running_from_develop, + isbsd, + isfrozen, + islinux, + ismacos, + iswindows, + isxp, + numeric_version, + plugins_loc, ) +from calibre.constants import __appname__ as APP_UID from calibre.ebooks.metadata import MetaInformation from calibre.gui2.geometry import geometry_for_restore_as_dict -from calibre.gui2.linux_file_dialogs import ( - check_for_linux_native_dialogs, linux_native_dialog, -) +from calibre.gui2.linux_file_dialogs import check_for_linux_native_dialogs, linux_native_dialog from calibre.gui2.palette import PaletteManager from calibre.gui2.qt_file_dialogs import FileDialog from calibre.ptempfile import base_dir @@ -41,7 +84,9 @@ from calibre.utils.date import UNDEFINED_DATE from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.img import set_image_allocation_limit from calibre.utils.localization import get_lang -from calibre.utils.resources import get_image_path as I, get_path as P, user_dir +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P +from calibre.utils.resources import user_dir from polyglot import queue from polyglot.builtins import iteritems, string_or_bytes @@ -923,16 +968,12 @@ if not iswindows and not ismacos and 'CALIBRE_NO_NATIVE_FILEDIALOGS' not in os.e has_linux_file_dialog_helper = check_for_linux_native_dialogs() if has_windows_file_dialog_helper: - from calibre.gui2.win_file_dialogs import ( - choose_dir, choose_files, choose_images, choose_save_file, - ) + from calibre.gui2.win_file_dialogs import choose_dir, choose_files, choose_images, choose_save_file elif has_linux_file_dialog_helper: choose_dir, choose_files, choose_save_file, choose_images = map( linux_native_dialog, 'dir files save_file images'.split()) else: - from calibre.gui2.qt_file_dialogs import ( - choose_dir, choose_files, choose_images, choose_save_file, - ) + from calibre.gui2.qt_file_dialogs import choose_dir, choose_files, choose_images, choose_save_file choose_files, choose_images, choose_dir, choose_save_file diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index 8510454af7..792863e8e8 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -8,9 +8,7 @@ __docformat__ = 'restructuredtext en' from functools import partial from zipfile import ZipFile -from qt.core import ( - QAction, QIcon, QKeySequence, QMenu, QObject, QPoint, QTimer, QToolButton, -) +from qt.core import QAction, QIcon, QKeySequence, QMenu, QObject, QPoint, QTimer, QToolButton from calibre import prints from calibre.constants import ismacos diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index e9b0f84786..79a710d8da 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -8,16 +8,14 @@ __docformat__ = 'restructuredtext en' import os from collections import defaultdict from functools import partial + from qt.core import QApplication, QDialog, QPixmap, QTimer from calibre import as_unicode, guess_type, prepare_string_for_xml from calibre.constants import iswindows from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata import MetaInformation, normalize_isbn -from calibre.gui2 import ( - choose_dir, choose_files, choose_files_and_remember_all_files, error_dialog, gprefs, - info_dialog, question_dialog, warning_dialog, -) +from calibre.gui2 import choose_dir, choose_files, choose_files_and_remember_all_files, error_dialog, gprefs, info_dialog, question_dialog, warning_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.add_empty_book import AddEmptyBookDialog from calibre.gui2.dialogs.confirm_delete import confirm diff --git a/src/calibre/gui2/actions/all_actions.py b/src/calibre/gui2/actions/all_actions.py index ba06a9452d..2ef657f8cd 100644 --- a/src/calibre/gui2/actions/all_actions.py +++ b/src/calibre/gui2/actions/all_actions.py @@ -4,7 +4,7 @@ from functools import partial from math import ceil -from qt.core import QIcon, QMenu, QToolButton, Qt +from qt.core import QIcon, QMenu, Qt, QToolButton from calibre.gui2.actions import InterfaceAction, show_menu_under_widget from calibre.gui2.preferences.toolbar import AllModel, CurrentModel diff --git a/src/calibre/gui2/actions/annotate.py b/src/calibre/gui2/actions/annotate.py index 42fc554c01..8f8fdb0dac 100644 --- a/src/calibre/gui2/actions/annotate.py +++ b/src/calibre/gui2/actions/annotate.py @@ -6,11 +6,11 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import pyqtSignal, QModelIndex, QThread, Qt +from qt.core import QModelIndex, Qt, QThread, pyqtSignal +from calibre.devices.usbms.device import Device from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceAction -from calibre.devices.usbms.device import Device from calibre.gui2.dialogs.progress import ProgressDialog from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/actions/catalog.py b/src/calibre/gui2/actions/catalog.py index ba147c8039..536dc684d6 100644 --- a/src/calibre/gui2/actions/catalog.py +++ b/src/calibre/gui2/actions/catalog.py @@ -5,15 +5,17 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, os, shutil +import os +import re +import shutil from qt.core import QModelIndex +from calibre import sanitize_file_name from calibre.gui2 import choose_dir, error_dialog, warning_dialog +from calibre.gui2.actions import InterfaceAction from calibre.gui2.tools import generate_catalog from calibre.utils.config import dynamic -from calibre.gui2.actions import InterfaceAction -from calibre import sanitize_file_name class GenerateCatalogAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/choose_library.py b/src/calibre/gui2/actions/choose_library.py index f006b44457..087e5f5d4a 100644 --- a/src/calibre/gui2/actions/choose_library.py +++ b/src/calibre/gui2/actions/choose_library.py @@ -10,19 +10,39 @@ import sys import weakref from contextlib import suppress from functools import lru_cache, partial + from qt.core import ( - QAction, QCoreApplication, QDialog, QDialogButtonBox, QGridLayout, QIcon, - QInputDialog, QLabel, QLineEdit, QMenu, QSize, Qt, QTimer, QToolButton, QVBoxLayout, + QAction, + QCoreApplication, + QDialog, + QDialogButtonBox, + QGridLayout, + QIcon, + QInputDialog, + QLabel, + QLineEdit, + QMenu, + QSize, + Qt, + QTimer, + QToolButton, + QVBoxLayout, pyqtSignal, ) from calibre import isbytestring, sanitize_file_name -from calibre.constants import ( - config_dir, filesystem_encoding, get_portable_base, isportable, iswindows, -) +from calibre.constants import config_dir, filesystem_encoding, get_portable_base, isportable, iswindows from calibre.gui2 import ( - Dispatcher, choose_dir, choose_images, error_dialog, gprefs, info_dialog, - open_local_file, pixmap_to_data, question_dialog, warning_dialog, + Dispatcher, + choose_dir, + choose_images, + error_dialog, + gprefs, + info_dialog, + open_local_file, + pixmap_to_data, + question_dialog, + warning_dialog, ) from calibre.gui2.actions import InterfaceAction from calibre.library import current_library_name diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index 6278b38c49..8f5297c813 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -7,6 +7,7 @@ __docformat__ = 'restructuredtext en' import os from functools import partial + from qt.core import QModelIndex from calibre.customize.ui import plugin_for_input_format, run_plugins_on_postconvert diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 180fc0ddf7..a17d5d1a19 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -9,19 +9,34 @@ import os from collections import defaultdict from contextlib import closing from functools import partial -from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, QFormLayout, - QGridLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QListWidget, QListWidgetItem, - QScrollArea, QSize, Qt, QToolButton, QVBoxLayout, QWidget, -) from threading import Thread +from qt.core import ( + QAbstractItemView, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QFormLayout, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QScrollArea, + QSize, + Qt, + QToolButton, + QVBoxLayout, + QWidget, +) + from calibre import as_unicode from calibre.constants import ismacos from calibre.db.copy_to_library import copy_one_book -from calibre.gui2 import ( - Dispatcher, choose_dir, error_dialog, gprefs, info_dialog, warning_dialog, -) +from calibre.gui2 import Dispatcher, choose_dir, error_dialog, gprefs, info_dialog, warning_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.actions.choose_library import library_qicon from calibre.gui2.dialogs.progress import ProgressDialog diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 2bcb049a9a..db6aa5e9fd 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -7,6 +7,7 @@ __docformat__ = 'restructuredtext en' from collections import Counter from functools import partial + from qt.core import QDialog, QModelIndex, QObject, QTimer from calibre.constants import ismacos @@ -14,9 +15,7 @@ from calibre.gui2 import Aborted, error_dialog from calibre.gui2.actions import InterfaceActionWithLibraryDrop from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.confirm_delete_location import confirm_location -from calibre.gui2.dialogs.delete_matching_from_device import ( - DeleteMatchingFromDeviceDialog, -) +from calibre.gui2.dialogs.delete_matching_from_device import DeleteMatchingFromDeviceDialog from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import MessagePopup from calibre.utils.localization import ngettext diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index c42de10e91..c2473bba35 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -11,9 +11,8 @@ import shutil from contextlib import contextmanager from functools import partial from io import BytesIO -from qt.core import ( - QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, QUrl, -) + +from qt.core import QAction, QApplication, QDialog, QIcon, QMenu, QMimeData, QModelIndex, QTimer, QUrl from calibre.db.errors import NoSuchFormat from calibre.ebooks.metadata import authors_to_string diff --git a/src/calibre/gui2/actions/embed.py b/src/calibre/gui2/actions/embed.py index cd7f574ae0..e5cd266f05 100644 --- a/src/calibre/gui2/actions/embed.py +++ b/src/calibre/gui2/actions/embed.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' from functools import partial + from qt.core import QProgressDialog, Qt, QTimer from calibre import force_unicode diff --git a/src/calibre/gui2/actions/fetch_news.py b/src/calibre/gui2/actions/fetch_news.py index 6ad68f068c..b143987676 100644 --- a/src/calibre/gui2/actions/fetch_news.py +++ b/src/calibre/gui2/actions/fetch_news.py @@ -11,8 +11,8 @@ from functools import partial from qt.core import Qt from calibre.gui2 import Dispatcher -from calibre.gui2.tools import fetch_scheduled_recipe from calibre.gui2.actions import InterfaceAction +from calibre.gui2.tools import fetch_scheduled_recipe class FetchNewsAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/layout_actions.py b/src/calibre/gui2/actions/layout_actions.py index ccae8f3b89..820ce0c73c 100644 --- a/src/calibre/gui2/actions/layout_actions.py +++ b/src/calibre/gui2/actions/layout_actions.py @@ -3,8 +3,8 @@ from enum import Enum from functools import partial -from qt.core import (QComboBox, QDialog, QDialogButtonBox, QFormLayout, QIcon, - QLabel, QMenu, QToolButton, QVBoxLayout) + +from qt.core import QComboBox, QDialog, QDialogButtonBox, QFormLayout, QIcon, QLabel, QMenu, QToolButton, QVBoxLayout from calibre.gui2 import error_dialog, gprefs, question_dialog from calibre.gui2.actions import InterfaceAction, show_menu_under_widget diff --git a/src/calibre/gui2/actions/mark_books.py b/src/calibre/gui2/actions/mark_books.py index 1733253707..02c7309475 100644 --- a/src/calibre/gui2/actions/mark_books.py +++ b/src/calibre/gui2/actions/mark_books.py @@ -5,10 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from functools import partial -from qt.core import ( - QApplication, QDialog, QDialogButtonBox, QEvent, QGridLayout, QIcon, QLabel, QMenu, - QPushButton, Qt, -) + +from qt.core import QApplication, QDialog, QDialogButtonBox, QEvent, QGridLayout, QIcon, QLabel, QMenu, QPushButton, Qt from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceActionWithLibraryDrop diff --git a/src/calibre/gui2/actions/plugin_updates.py b/src/calibre/gui2/actions/plugin_updates.py index 39e4b383ad..2710a180a5 100644 --- a/src/calibre/gui2/actions/plugin_updates.py +++ b/src/calibre/gui2/actions/plugin_updates.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2011, Grant Drake ' __docformat__ = 'restructuredtext en' -from qt.core import QApplication, Qt, QIcon +from qt.core import QApplication, QIcon, Qt + from calibre.gui2.actions import InterfaceAction -from calibre.gui2.dialogs.plugin_updater import (PluginUpdaterDialog, - FILTER_ALL, FILTER_UPDATE_AVAILABLE) +from calibre.gui2.dialogs.plugin_updater import FILTER_ALL, FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog class PluginUpdaterAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/polish.py b/src/calibre/gui2/actions/polish.py index 71a9e28bf1..741d90a528 100644 --- a/src/calibre/gui2/actions/polish.py +++ b/src/calibre/gui2/actions/polish.py @@ -11,10 +11,25 @@ import textwrap import weakref from collections import OrderedDict from functools import partial + from qt.core import ( - QApplication, QCheckBox, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, - QInputDialog, QLabel, QMenu, QModelIndex, QSize, QSizePolicy, QSpacerItem, Qt, - QTextEdit, QTimer, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QIcon, + QInputDialog, + QLabel, + QMenu, + QModelIndex, + QSize, + QSizePolicy, + QSpacerItem, + Qt, + QTextEdit, + QTimer, ) from calibre.gui2 import Dispatcher, error_dialog, gprefs, question_dialog diff --git a/src/calibre/gui2/actions/preferences.py b/src/calibre/gui2/actions/preferences.py index 36eee6d8f8..d46311efca 100644 --- a/src/calibre/gui2/actions/preferences.py +++ b/src/calibre/gui2/actions/preferences.py @@ -9,11 +9,11 @@ from functools import partial from qt.core import QIcon, Qt +from calibre.constants import DEBUG, ismacos from calibre.customize.ui import preferences_plugins +from calibre.gui2 import error_dialog, show_restart_warning from calibre.gui2.actions import InterfaceAction from calibre.gui2.preferences.main import Preferences -from calibre.gui2 import error_dialog, show_restart_warning -from calibre.constants import DEBUG, ismacos class PreferencesAction(InterfaceAction): @@ -67,8 +67,7 @@ class PreferencesAction(InterfaceAction): def get_plugins(self): - from calibre.gui2.dialogs.plugin_updater import (PluginUpdaterDialog, - FILTER_NOT_INSTALLED) + from calibre.gui2.dialogs.plugin_updater import FILTER_NOT_INSTALLED, PluginUpdaterDialog d = PluginUpdaterDialog(self.gui, initial_filter=FILTER_NOT_INSTALLED) d.exec() diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index 323cbafd8f..038ccd8ca2 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -5,12 +5,13 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, numbers +import numbers +import os from functools import partial -from calibre.utils.config import prefs -from calibre.gui2 import error_dialog, Dispatcher, choose_dir +from calibre.gui2 import Dispatcher, choose_dir, error_dialog from calibre.gui2.actions import InterfaceAction +from calibre.utils.config import prefs from polyglot.builtins import itervalues diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index 6cf2f74d3b..77335f6f9e 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -7,9 +7,9 @@ __docformat__ = 'restructuredtext en' from qt.core import Qt, sip +from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.book_info import BookInfo, DialogNumbers -from calibre.gui2 import error_dialog class ShowBookDetailsAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/show_quickview.py b/src/calibre/gui2/actions/show_quickview.py index dc77e14733..a0f4fe5ee6 100644 --- a/src/calibre/gui2/actions/show_quickview.py +++ b/src/calibre/gui2/actions/show_quickview.py @@ -8,10 +8,9 @@ __docformat__ = 'restructuredtext en' from qt.core import QAction, QTimer +from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.quickview import Quickview -from calibre.gui2 import error_dialog - current_qv_action_pi = None diff --git a/src/calibre/gui2/actions/show_template_tester.py b/src/calibre/gui2/actions/show_template_tester.py index be163e8639..dbd2c9da8e 100644 --- a/src/calibre/gui2/actions/show_template_tester.py +++ b/src/calibre/gui2/actions/show_template_tester.py @@ -5,9 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' +from calibre.gui2 import error_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.template_dialog import TemplateDialog -from calibre.gui2 import error_dialog class ShowTemplateTesterAction(InterfaceAction): diff --git a/src/calibre/gui2/actions/sort.py b/src/calibre/gui2/actions/sort.py index 02e42b6f37..82ab67e7b1 100644 --- a/src/calibre/gui2/actions/sort.py +++ b/src/calibre/gui2/actions/sort.py @@ -6,9 +6,21 @@ __copyright__ = '2013, Kovid Goyal ' from contextlib import suppress from functools import partial + from qt.core import ( - QAbstractItemView, QAction, QDialog, QDialogButtonBox, QIcon, QListWidget, - QListWidgetItem, QMenu, QSize, Qt, QToolButton, QVBoxLayout, pyqtSignal, + QAbstractItemView, + QAction, + QDialog, + QDialogButtonBox, + QIcon, + QListWidget, + QListWidgetItem, + QMenu, + QSize, + Qt, + QToolButton, + QVBoxLayout, + pyqtSignal, ) from calibre.gui2.actions import InterfaceAction, show_menu_under_widget diff --git a/src/calibre/gui2/actions/toc_edit.py b/src/calibre/gui2/actions/toc_edit.py index 1f235b22af..85f8e15a8f 100644 --- a/src/calibre/gui2/actions/toc_edit.py +++ b/src/calibre/gui2/actions/toc_edit.py @@ -8,9 +8,8 @@ __docformat__ = 'restructuredtext en' import os from collections import OrderedDict from itertools import count -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QTimer, -) + +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QTimer from calibre.gui2 import error_dialog, gprefs, question_dialog from calibre.gui2.actions import InterfaceActionWithLibraryDrop diff --git a/src/calibre/gui2/actions/tweak_epub.py b/src/calibre/gui2/actions/tweak_epub.py index ac2087429e..a6d15ebedc 100644 --- a/src/calibre/gui2/actions/tweak_epub.py +++ b/src/calibre/gui2/actions/tweak_epub.py @@ -6,9 +6,8 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import time -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QLabel, Qt, QVBoxLayout, -) + +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QLabel, Qt, QVBoxLayout from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.actions import InterfaceActionWithLibraryDrop diff --git a/src/calibre/gui2/actions/unpack_book.py b/src/calibre/gui2/actions/unpack_book.py index 908736729a..d32f09f4f4 100644 --- a/src/calibre/gui2/actions/unpack_book.py +++ b/src/calibre/gui2/actions/unpack_book.py @@ -8,10 +8,8 @@ __docformat__ = 'restructuredtext en' import os import shutil import weakref -from qt.core import ( - QDialog, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, QLabel, QPushButton, - QRadioButton, QSize, QTimer, QVBoxLayout, -) + +from qt.core import QDialog, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, QLabel, QPushButton, QRadioButton, QSize, QTimer, QVBoxLayout from calibre import as_unicode from calibre.constants import ismacos diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index d7cf1d4b16..04dee1c19b 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -9,14 +9,12 @@ import json import os import time from functools import partial + from qt.core import QAction, QDialog, QIcon, pyqtSignal from calibre.constants import ismacos, iswindows from calibre.db.constants import DATA_DIR_NAME -from calibre.gui2 import ( - Dispatcher, config, elided_text, error_dialog, info_dialog, open_local_file, - question_dialog, -) +from calibre.gui2 import Dispatcher, config, elided_text, error_dialog, info_dialog, open_local_file, question_dialog from calibre.gui2.actions import InterfaceAction from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.ptempfile import PersistentTemporaryFile diff --git a/src/calibre/gui2/actions/virtual_library.py b/src/calibre/gui2/actions/virtual_library.py index baf0c8b7b7..9786f3058e 100644 --- a/src/calibre/gui2/actions/virtual_library.py +++ b/src/calibre/gui2/actions/virtual_library.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2018, Kovid Goyal -from qt.core import QToolButton, QAction +from qt.core import QAction, QToolButton from calibre.gui2.actions import InterfaceAction diff --git a/src/calibre/gui2/add.py b/src/calibre/gui2/add.py index 2327a0334f..1ff54be95e 100644 --- a/src/calibre/gui2/add.py +++ b/src/calibre/gui2/add.py @@ -13,9 +13,10 @@ import traceback import weakref from collections import OrderedDict from io import BytesIO -from qt.core import QObject, Qt, pyqtSignal from threading import Thread +from qt.core import QObject, Qt, pyqtSignal + from calibre import as_unicode, prints from calibre.constants import DEBUG, filesystem_encoding, ismacos, iswindows from calibre.customize.ui import run_plugins_on_postadd, run_plugins_on_postimport diff --git a/src/calibre/gui2/add_filters.py b/src/calibre/gui2/add_filters.py index 0293487442..cdc3d50ec3 100644 --- a/src/calibre/gui2/add_filters.py +++ b/src/calibre/gui2/add_filters.py @@ -4,13 +4,14 @@ from collections import OrderedDict -from calibre.db.adding import compile_glob, filter_filename, compile_rule -from calibre.gui2 import elided_text, Application, error_dialog -from calibre.gui2.tag_mapper import ( - RuleEdit as RuleEditBase, RuleEditDialog as - RuleEditDialogBase, RuleItem as RuleItemBase, Rules as RulesBase, - Tester as TesterBase, RulesDialog as RulesDialogBase -) +from calibre.db.adding import compile_glob, compile_rule, filter_filename +from calibre.gui2 import Application, elided_text, error_dialog +from calibre.gui2.tag_mapper import RuleEdit as RuleEditBase +from calibre.gui2.tag_mapper import RuleEditDialog as RuleEditDialogBase +from calibre.gui2.tag_mapper import RuleItem as RuleItemBase +from calibre.gui2.tag_mapper import Rules as RulesBase +from calibre.gui2.tag_mapper import RulesDialog as RulesDialogBase +from calibre.gui2.tag_mapper import Tester as TesterBase from calibre.utils.config import JSONConfig add_filters = JSONConfig('add-filter-rules') diff --git a/src/calibre/gui2/author_mapper.py b/src/calibre/gui2/author_mapper.py index 3fe9395361..67fcbd5b2a 100644 --- a/src/calibre/gui2/author_mapper.py +++ b/src/calibre/gui2/author_mapper.py @@ -7,11 +7,12 @@ from collections import OrderedDict from calibre.ebooks.metadata import authors_to_string, string_to_authors from calibre.ebooks.metadata.author_mapper import compile_rules, map_authors from calibre.gui2 import Application, elided_text -from calibre.gui2.tag_mapper import ( - RuleEdit as RuleEditBase, RuleEditDialog as RuleEditDialogBase, - RuleItem as RuleItemBase, Rules as RulesBase, RulesDialog as RulesDialogBase, - Tester as TesterBase, -) +from calibre.gui2.tag_mapper import RuleEdit as RuleEditBase +from calibre.gui2.tag_mapper import RuleEditDialog as RuleEditDialogBase +from calibre.gui2.tag_mapper import RuleItem as RuleItemBase +from calibre.gui2.tag_mapper import Rules as RulesBase +from calibre.gui2.tag_mapper import RulesDialog as RulesDialogBase +from calibre.gui2.tag_mapper import Tester as TesterBase from calibre.utils.config import JSONConfig author_maps = JSONConfig('author-mapping-rules') diff --git a/src/calibre/gui2/auto_add.py b/src/calibre/gui2/auto_add.py index e78c9070be..d1cae5e22c 100644 --- a/src/calibre/gui2/auto_add.py +++ b/src/calibre/gui2/auto_add.py @@ -5,11 +5,10 @@ import os import shutil import tempfile import time -from qt.core import ( - QApplication, QCursor, QFileSystemWatcher, QObject, Qt, QTimer, pyqtSignal, -) from threading import Event, Thread +from qt.core import QApplication, QCursor, QFileSystemWatcher, QObject, Qt, QTimer, pyqtSignal + from calibre import prints from calibre.db.adding import compile_rule, filter_filename from calibre.ebooks import BOOK_EXTENSIONS @@ -262,9 +261,7 @@ class AutoAdder(QObject): from calibre.ebooks.metadata.tag_mapper import map_tags mi.tags = map_tags(mi.tags, gprefs['tag_map_on_add_rules']) if gprefs.get('author_map_on_add_rules'): - from calibre.ebooks.metadata.author_mapper import ( - compile_rules, map_authors, - ) + from calibre.ebooks.metadata.author_mapper import compile_rules, map_authors new_authors = map_authors(mi.authors, compile_rules(gprefs['author_map_on_add_rules'])) if new_authors != mi.authors: mi.authors = new_authors diff --git a/src/calibre/gui2/bars.py b/src/calibre/gui2/bars.py index 7108eafedc..f9070b39c2 100644 --- a/src/calibre/gui2/bars.py +++ b/src/calibre/gui2/bars.py @@ -6,16 +6,35 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' from functools import partial + from qt.core import ( - Qt, QAction, QMenu, QObject, QToolBar, QToolButton, QSize, pyqtSignal, QKeySequence, QMenuBar, - QTimer, QPropertyAnimation, QEasingCurve, pyqtProperty, QPainter, QWidget, QPalette, sip, - QHBoxLayout, QFrame) + QAction, + QEasingCurve, + QFrame, + QHBoxLayout, + QKeySequence, + QMenu, + QMenuBar, + QObject, + QPainter, + QPalette, + QPropertyAnimation, + QSize, + Qt, + QTimer, + QToolBar, + QToolButton, + QWidget, + pyqtProperty, + pyqtSignal, + sip, +) from calibre.constants import ismacos -from calibre.gui2 import gprefs, native_menubar_defaults, config +from calibre.gui2 import config, gprefs, native_menubar_defaults from calibre.gui2.throbber import ThrobbingButton -from polyglot.builtins import itervalues from calibre.gui2.widgets2 import RightClickButton +from polyglot.builtins import itervalues class RevealBar(QWidget): # {{{ diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 908ea7f3ae..1e1106e4c9 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -7,11 +7,33 @@ import re from collections import namedtuple from contextlib import suppress from functools import lru_cache, partial + from qt.core import ( - QAction, QApplication, QClipboard, QColor, QDialog, QEasingCurve, QIcon, - QKeySequence, QMenu, QMimeData, QPainter, QPalette, QPen, QPixmap, - QPropertyAnimation, QRect, QSize, QSizePolicy, QSplitter, Qt, QTimer, QUrl, QWidget, - pyqtProperty, pyqtSignal, + QAction, + QApplication, + QClipboard, + QColor, + QDialog, + QEasingCurve, + QIcon, + QKeySequence, + QMenu, + QMimeData, + QPainter, + QPalette, + QPen, + QPixmap, + QPropertyAnimation, + QRect, + QSize, + QSizePolicy, + QSplitter, + Qt, + QTimer, + QUrl, + QWidget, + pyqtProperty, + pyqtSignal, ) from calibre import fit_image, sanitize_file_name @@ -20,18 +42,11 @@ from calibre.db.constants import DATA_DIR_NAME, DATA_FILE_PATTERN, RESOURCE_URL_ from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.metadata.book.base import Metadata, field_metadata from calibre.ebooks.metadata.book.render import mi_to_html -from calibre.ebooks.metadata.search_internet import ( - all_author_searches, all_book_searches, name_for, url_for_author_search, - url_for_book_search, -) -from calibre.gui2 import ( - NO_URL_FORMATTING, choose_save_file, config, default_author_link, gprefs, - pixmap_to_data, question_dialog, rating_font, safe_open_url, -) -from calibre.gui2.dialogs.confirm_delete import confirm, confirm as confirm_delete -from calibre.gui2.dnd import ( - dnd_get_files, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions, -) +from calibre.ebooks.metadata.search_internet import all_author_searches, all_book_searches, name_for, url_for_author_search, url_for_book_search +from calibre.gui2 import NO_URL_FORMATTING, choose_save_file, config, default_author_link, gprefs, pixmap_to_data, question_dialog, rating_font, safe_open_url +from calibre.gui2.dialogs.confirm_delete import confirm +from calibre.gui2.dialogs.confirm_delete import confirm as confirm_delete +from calibre.gui2.dnd import dnd_get_files, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions from calibre.gui2.widgets2 import HTMLDisplay from calibre.startup import connect_lambda from calibre.utils.config import tweaks diff --git a/src/calibre/gui2/catalog/catalog_bibtex.py b/src/calibre/gui2/catalog/catalog_bibtex.py index 7fb17f6c1a..af41c91835 100644 --- a/src/calibre/gui2/catalog/catalog_bibtex.py +++ b/src/calibre/gui2/catalog/catalog_bibtex.py @@ -6,7 +6,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import QWidget, QListWidgetItem +from qt.core import QListWidgetItem, QWidget from calibre.gui2 import gprefs from calibre.gui2.catalog.catalog_bibtex_ui import Ui_Form diff --git a/src/calibre/gui2/catalog/catalog_csv_xml.py b/src/calibre/gui2/catalog/catalog_csv_xml.py index 207c7dccfd..055ea5f543 100644 --- a/src/calibre/gui2/catalog/catalog_csv_xml.py +++ b/src/calibre/gui2/catalog/catalog_csv_xml.py @@ -5,10 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import ( - QAbstractItemView, QHBoxLayout, QLabel, QListWidget, QListWidgetItem, QPushButton, - Qt, QVBoxLayout, QWidget, -) +from qt.core import QAbstractItemView, QHBoxLayout, QLabel, QListWidget, QListWidgetItem, QPushButton, Qt, QVBoxLayout, QWidget from calibre.constants import ismacos from calibre.gui2 import gprefs diff --git a/src/calibre/gui2/catalog/catalog_epub_mobi.py b/src/calibre/gui2/catalog/catalog_epub_mobi.py index 73f92bfed4..16172cbb97 100644 --- a/src/calibre/gui2/catalog/catalog_epub_mobi.py +++ b/src/calibre/gui2/catalog/catalog_epub_mobi.py @@ -5,21 +5,39 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, sys - +import re +import sys from functools import partial +from qt.core import ( + QAbstractItemView, + QCheckBox, + QComboBox, + QDoubleSpinBox, + QIcon, + QInputDialog, + QLineEdit, + QRadioButton, + QSize, + QSizePolicy, + Qt, + QTableWidget, + QTableWidgetItem, + QTextEdit, + QToolButton, + QUrl, + QVBoxLayout, + QWidget, + sip, +) + from calibre.ebooks.conversion.config import load_defaults -from calibre.gui2 import gprefs, open_url, question_dialog, error_dialog +from calibre.gui2 import error_dialog, gprefs, open_url, question_dialog from calibre.utils.config import JSONConfig from calibre.utils.icu import sort_key from calibre.utils.localization import localize_user_manual_link from .catalog_epub_mobi_ui import Ui_Form -from qt.core import (Qt, QAbstractItemView, QCheckBox, QComboBox, - QDoubleSpinBox, QIcon, QInputDialog, QLineEdit, QRadioButton, - QSize, QSizePolicy, QTableWidget, QTableWidgetItem, QTextEdit, QToolButton, - QUrl, QVBoxLayout, QWidget, sip) class PluginWidget(QWidget,Ui_Form): @@ -1096,7 +1114,7 @@ class GenericRulesTable(QTableWidget): # Format of rules list is different if default values vs retrieved JSON # Hack to normalize list style rules = self.rules - if rules and type(rules[0]) is list: + if rules and isinstance(rules[0], list): rules = rules[0] self.setFocus() rules = sorted(rules, key=lambda k: k['ordinal']) diff --git a/src/calibre/gui2/central.py b/src/calibre/gui2/central.py index a1ef62e457..5bbe0132de 100644 --- a/src/calibre/gui2/central.py +++ b/src/calibre/gui2/central.py @@ -5,10 +5,27 @@ from contextlib import suppress from copy import copy from dataclasses import asdict, dataclass, fields from enum import Enum, auto + from qt.core import ( - QAction, QDialog, QHBoxLayout, QIcon, QKeySequence, QLabel, QMainWindow, QPalette, - QPointF, QSize, QSizePolicy, QStyle, QStyleOption, QStylePainter, Qt, QToolButton, - QVBoxLayout, QWidget, pyqtSignal, + QAction, + QDialog, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QMainWindow, + QPalette, + QPointF, + QSize, + QSizePolicy, + QStyle, + QStyleOption, + QStylePainter, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.gui2 import Application, config, gprefs diff --git a/src/calibre/gui2/changes.py b/src/calibre/gui2/changes.py index 07f79e83f1..ad5831850b 100644 --- a/src/calibre/gui2/changes.py +++ b/src/calibre/gui2/changes.py @@ -2,10 +2,7 @@ # License: GPLv3 Copyright: 2017, Kovid Goyal -from calibre.srv.changes import ( - BooksAdded, BooksDeleted, FormatsAdded, FormatsRemoved, MetadataChanged, - SavedSearchesChanged -) +from calibre.srv.changes import BooksAdded, BooksDeleted, FormatsAdded, FormatsRemoved, MetadataChanged, SavedSearchesChanged def handle_changes(changes, gui=None): diff --git a/src/calibre/gui2/comments_editor.py b/src/calibre/gui2/comments_editor.py index 0016cc274d..bf8413951c 100644 --- a/src/calibre/gui2/comments_editor.py +++ b/src/calibre/gui2/comments_editor.py @@ -9,25 +9,71 @@ import weakref from collections import defaultdict from contextlib import contextmanager from functools import partial +from threading import Thread + from html5_parser import parse from lxml import html from qt.core import ( - QAction, QApplication, QBrush, QByteArray, QCheckBox, QColor, QColorDialog, QDialog, - QDialogButtonBox, QFont, QFontInfo, QFontMetrics, QFormLayout, QHBoxLayout, QIcon, - QKeySequence, QLabel, QLineEdit, QMenu, QPalette, QPlainTextEdit, QPointF, - QPushButton, QSize, QSpinBox, QSyntaxHighlighter, Qt, QTabWidget, QTextBlockFormat, - QTextCharFormat, QTextCursor, QTextDocument, QTextEdit, QTextFormat, - QTextFrameFormat, QTextImageFormat, QTextListFormat, QTimer, QToolButton, QUrl, - QVBoxLayout, QWidget, pyqtSignal, pyqtSlot, + QAction, + QApplication, + QBrush, + QByteArray, + QCheckBox, + QColor, + QColorDialog, + QDialog, + QDialogButtonBox, + QFont, + QFontInfo, + QFontMetrics, + QFormLayout, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QLineEdit, + QMenu, + QPalette, + QPlainTextEdit, + QPointF, + QPushButton, + QSize, + QSpinBox, + QSyntaxHighlighter, + Qt, + QTabWidget, + QTextBlockFormat, + QTextCharFormat, + QTextCursor, + QTextDocument, + QTextEdit, + QTextFormat, + QTextFrameFormat, + QTextImageFormat, + QTextListFormat, + QTimer, + QToolButton, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, + pyqtSlot, ) -from threading import Thread from calibre import browser, fit_image, xml_replace_entities from calibre.db.constants import DATA_DIR_NAME from calibre.ebooks.chardet import xml_to_unicode from calibre.gui2 import ( - NO_URL_FORMATTING, FunctionDispatcher, choose_dir, choose_files, error_dialog, - gprefs, is_dark_theme, local_path_for_resource, question_dialog, safe_open_url, + NO_URL_FORMATTING, + FunctionDispatcher, + choose_dir, + choose_files, + error_dialog, + gprefs, + is_dark_theme, + local_path_for_resource, + question_dialog, + safe_open_url, ) from calibre.gui2.book_details import resolved_css from calibre.gui2.dialogs.progress import ProgressDialog diff --git a/src/calibre/gui2/complete2.py b/src/calibre/gui2/complete2.py index 9e4c2b72b0..fb69d00741 100644 --- a/src/calibre/gui2/complete2.py +++ b/src/calibre/gui2/complete2.py @@ -6,14 +6,30 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' from qt.core import ( - QLineEdit, QAbstractListModel, Qt, pyqtSignal, QObject, QKeySequence, QAbstractItemView, - QApplication, QListView, QPoint, QModelIndex, QEvent, pyqtProperty, - QStyleOptionComboBox, QStyle, QComboBox, QTimer, sip) + QAbstractItemView, + QAbstractListModel, + QApplication, + QComboBox, + QEvent, + QKeySequence, + QLineEdit, + QListView, + QModelIndex, + QObject, + QPoint, + QStyle, + QStyleOptionComboBox, + Qt, + QTimer, + pyqtProperty, + pyqtSignal, + sip, +) from calibre.constants import ismacos -from calibre.utils.icu import sort_key, primary_startswith, primary_contains from calibre.gui2.widgets import EnComboBox, LineEditECM from calibre.utils.config import tweaks +from calibre.utils.icu import primary_contains, primary_startswith, sort_key def containsq(x, prefix): @@ -561,6 +577,7 @@ class EditWithComplete(EnComboBox): if __name__ == '__main__': from qt.core import QDialog, QVBoxLayout + from calibre.gui2 import Application app = Application([]) d = QDialog() diff --git a/src/calibre/gui2/convert/__init__.py b/src/calibre/gui2/convert/__init__.py index af085562ba..1194417ae2 100644 --- a/src/calibre/gui2/convert/__init__.py +++ b/src/calibre/gui2/convert/__init__.py @@ -5,18 +5,34 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap, codecs, importlib +import codecs +import importlib +import textwrap from functools import partial -from qt.core import (QWidget, QSpinBox, QDoubleSpinBox, QLineEdit, QTextEdit, - QCheckBox, QComboBox, Qt, QIcon, pyqtSignal, QLabel, QFontComboBox, QFont, - QFontInfo, QPlainTextEdit) +from qt.core import ( + QCheckBox, + QComboBox, + QDoubleSpinBox, + QFont, + QFontComboBox, + QFontInfo, + QIcon, + QLabel, + QLineEdit, + QPlainTextEdit, + QSpinBox, + Qt, + QTextEdit, + QWidget, + pyqtSignal, +) -from calibre.customize.conversion import OptionRecommendation -from calibre.ebooks.conversion.config import ( - load_defaults, save_defaults as save_defaults_, load_specifics, GuiRecommendations) from calibre import prepare_string_for_xml +from calibre.customize.conversion import OptionRecommendation from calibre.customize.ui import plugin_for_input_format +from calibre.ebooks.conversion.config import GuiRecommendations, load_defaults, load_specifics +from calibre.ebooks.conversion.config import save_defaults as save_defaults_ from calibre.gui2.font_family_chooser import FontFamilyChooser @@ -138,8 +154,8 @@ class Widget(QWidget): gui_opt.setDisabled(True) def get_value(self, g): - from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.convert.regex_builder import RegexEdit + from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.widgets import EncodingComboBox ret = self.get_value_handler(g) if ret != 'this is a dummy return value, xcswx1avcx4x': @@ -190,8 +206,8 @@ class Widget(QWidget): return except NotImplementedError: pass - from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.convert.regex_builder import RegexEdit + from calibre.gui2.convert.xpath_wizard import XPathEdit if isinstance(g, (QSpinBox, QDoubleSpinBox)): g.valueChanged.connect(f) elif isinstance(g, (QLineEdit, QTextEdit, QPlainTextEdit)): @@ -213,8 +229,8 @@ class Widget(QWidget): raise NotImplementedError() def set_value(self, g, val): - from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.convert.regex_builder import RegexEdit + from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.widgets import EncodingComboBox if self.set_value_handler(g, val): return diff --git a/src/calibre/gui2/convert/azw3_output.py b/src/calibre/gui2/convert/azw3_output.py index 5be642413f..a94937ae22 100644 --- a/src/calibre/gui2/convert/azw3_output.py +++ b/src/calibre/gui2/convert/azw3_output.py @@ -6,9 +6,9 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.azw3_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.azw3_output_ui import Ui_Form font_family_model = None diff --git a/src/calibre/gui2/convert/bulk.py b/src/calibre/gui2/convert/bulk.py index cfd2c97405..e0e2034524 100644 --- a/src/calibre/gui2/convert/bulk.py +++ b/src/calibre/gui2/convert/bulk.py @@ -3,11 +3,10 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' import shutil + from qt.core import QDialog, QDialogButtonBox, QModelIndex -from calibre.ebooks.conversion.config import ( - get_output_formats, sort_formats_by_preference, -) +from calibre.ebooks.conversion.config import get_output_formats, sort_formats_by_preference from calibre.ebooks.conversion.plumber import Plumber from calibre.gui2.convert import GuiRecommendations from calibre.gui2.convert.heuristics import HeuristicsWidget diff --git a/src/calibre/gui2/convert/comic_input.py b/src/calibre/gui2/convert/comic_input.py index 90c0c855e3..c8eb6bf93d 100644 --- a/src/calibre/gui2/convert/comic_input.py +++ b/src/calibre/gui2/convert/comic_input.py @@ -6,9 +6,9 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.comic_input_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.comic_input_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/debug.py b/src/calibre/gui2/convert/debug.py index e61e93bd2f..55f5e7fae9 100644 --- a/src/calibre/gui2/convert/debug.py +++ b/src/calibre/gui2/convert/debug.py @@ -7,10 +7,10 @@ __docformat__ = 'restructuredtext en' import os -from calibre.gui2.convert.debug_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.gui2 import error_dialog, choose_dir from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2 import choose_dir, error_dialog +from calibre.gui2.convert import Widget +from calibre.gui2.convert.debug_ui import Ui_Form class DebugWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/docx_input.py b/src/calibre/gui2/convert/docx_input.py index 4948e6fd47..b4c4c538bd 100644 --- a/src/calibre/gui2/convert/docx_input.py +++ b/src/calibre/gui2/convert/docx_input.py @@ -4,9 +4,9 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from calibre.gui2.convert.docx_input_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.docx_input_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/docx_output.py b/src/calibre/gui2/convert/docx_output.py index 5440db5285..c0a839e13d 100644 --- a/src/calibre/gui2/convert/docx_output.py +++ b/src/calibre/gui2/convert/docx_output.py @@ -2,10 +2,10 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import QFormLayout, QComboBox, QCheckBox, QLineEdit, QDoubleSpinBox, QSizePolicy +from qt.core import QCheckBox, QComboBox, QDoubleSpinBox, QFormLayout, QLineEdit, QSizePolicy -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget paper_size_model = None orientation_model = None diff --git a/src/calibre/gui2/convert/epub_output.py b/src/calibre/gui2/convert/epub_output.py index a8b4e9b8c7..3c31b30f4a 100644 --- a/src/calibre/gui2/convert/epub_output.py +++ b/src/calibre/gui2/convert/epub_output.py @@ -6,9 +6,9 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.epub_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.epub_output_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/fb2_input.py b/src/calibre/gui2/convert/fb2_input.py index 409cf719ce..f4ae5cbd78 100644 --- a/src/calibre/gui2/convert/fb2_input.py +++ b/src/calibre/gui2/convert/fb2_input.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.fb2_input_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.fb2_input_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/fb2_output.py b/src/calibre/gui2/convert/fb2_output.py index c8011df491..496d0b55fa 100644 --- a/src/calibre/gui2/convert/fb2_output.py +++ b/src/calibre/gui2/convert/fb2_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.fb2_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.fb2_output_ui import Ui_Form format_model = None diff --git a/src/calibre/gui2/convert/gui_conversion.py b/src/calibre/gui2/convert/gui_conversion.py index 2a1374df7b..641af19e33 100644 --- a/src/calibre/gui2/convert/gui_conversion.py +++ b/src/calibre/gui2/convert/gui_conversion.py @@ -5,9 +5,9 @@ __docformat__ = 'restructuredtext en' import os from optparse import OptionParser -from calibre.customize.conversion import OptionRecommendation, DummyReporter -from calibre.ebooks.conversion.plumber import Plumber +from calibre.customize.conversion import DummyReporter, OptionRecommendation from calibre.customize.ui import plugin_for_catalog_format +from calibre.ebooks.conversion.plumber import Plumber from calibre.utils.logging import Log diff --git a/src/calibre/gui2/convert/heuristics.py b/src/calibre/gui2/convert/heuristics.py index e60bc76b3a..50afe83314 100644 --- a/src/calibre/gui2/convert/heuristics.py +++ b/src/calibre/gui2/convert/heuristics.py @@ -4,11 +4,11 @@ __docformat__ = 'restructuredtext en' from qt.core import Qt -from calibre.gui2 import gprefs -from calibre.gui2.convert.heuristics_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.utils.localization import localize_user_manual_link from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2 import gprefs +from calibre.gui2.convert import Widget +from calibre.gui2.convert.heuristics_ui import Ui_Form +from calibre.utils.localization import localize_user_manual_link class HeuristicsWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/htmlz_output.py b/src/calibre/gui2/convert/htmlz_output.py index 73f1e0e9cf..998fe8048b 100644 --- a/src/calibre/gui2/convert/htmlz_output.py +++ b/src/calibre/gui2/convert/htmlz_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.htmlz_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.htmlz_output_ui import Ui_Form format_model = None diff --git a/src/calibre/gui2/convert/look_and_feel.py b/src/calibre/gui2/convert/look_and_feel.py index a3ea165681..deb7a7194e 100644 --- a/src/calibre/gui2/convert/look_and_feel.py +++ b/src/calibre/gui2/convert/look_and_feel.py @@ -6,6 +6,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' import json + from qt.core import QDialog, Qt from calibre.ebooks.conversion.config import OPTIONS diff --git a/src/calibre/gui2/convert/lrf_output.py b/src/calibre/gui2/convert/lrf_output.py index c1a48f0a22..7ecb1aaf62 100644 --- a/src/calibre/gui2/convert/lrf_output.py +++ b/src/calibre/gui2/convert/lrf_output.py @@ -5,9 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.lrf_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.lrf_output_ui import Ui_Form font_family_model = None diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index dd7caf624f..a6f587f255 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -5,21 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re +import os +import re -from qt.core import QPixmap, QApplication +from qt.core import QApplication, QPixmap -from calibre.gui2 import choose_images, error_dialog -from calibre.gui2.convert.metadata_ui import Ui_Form -from calibre.ebooks.metadata import (string_to_authors, MetaInformation, - title_sort) -from calibre.ebooks.metadata.opf2 import metadata_to_opf -from calibre.ptempfile import PersistentTemporaryFile -from calibre.gui2.convert import Widget -from calibre.utils.icu import sort_key -from calibre.library.comments import comments_to_html -from calibre.utils.config import tweaks from calibre.ebooks.conversion.config import OPTIONS +from calibre.ebooks.metadata import MetaInformation, string_to_authors, title_sort +from calibre.ebooks.metadata.opf2 import metadata_to_opf +from calibre.gui2 import choose_images, error_dialog +from calibre.gui2.convert import Widget +from calibre.gui2.convert.metadata_ui import Ui_Form +from calibre.library.comments import comments_to_html +from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.config import tweaks +from calibre.utils.icu import sort_key def create_opf_file(db, book_id, opf_file=None): diff --git a/src/calibre/gui2/convert/mobi_output.py b/src/calibre/gui2/convert/mobi_output.py index 9f14301b3d..cd97aa4c81 100644 --- a/src/calibre/gui2/convert/mobi_output.py +++ b/src/calibre/gui2/convert/mobi_output.py @@ -6,9 +6,9 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.mobi_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.mobi_output_ui import Ui_Form font_family_model = None diff --git a/src/calibre/gui2/convert/page_setup.py b/src/calibre/gui2/convert/page_setup.py index 4a89bb02b7..4d0e94181f 100644 --- a/src/calibre/gui2/convert/page_setup.py +++ b/src/calibre/gui2/convert/page_setup.py @@ -5,12 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import Qt, QAbstractListModel, QModelIndex, QItemSelectionModel +from qt.core import QAbstractListModel, QItemSelectionModel, QModelIndex, Qt -from calibre.gui2.convert.page_setup_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.customize.ui import input_profiles, output_profiles from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.page_setup_ui import Ui_Form class ProfileModel(QAbstractListModel): diff --git a/src/calibre/gui2/convert/pdb_output.py b/src/calibre/gui2/convert/pdb_output.py index 4c1fd0c71d..05508593f2 100644 --- a/src/calibre/gui2/convert/pdb_output.py +++ b/src/calibre/gui2/convert/pdb_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.pdb_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.pdb_output_ui import Ui_Form format_model = None diff --git a/src/calibre/gui2/convert/pdf_input.py b/src/calibre/gui2/convert/pdf_input.py index 57b76e270d..9c6f952de6 100644 --- a/src/calibre/gui2/convert/pdf_input.py +++ b/src/calibre/gui2/convert/pdf_input.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.pdf_input_ui import Ui_Form -from calibre.gui2.convert import Widget, QDoubleSpinBox from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import QDoubleSpinBox, Widget +from calibre.gui2.convert.pdf_input_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/pdf_output.py b/src/calibre/gui2/convert/pdf_output.py index 1dd0e6aabc..664f8ac986 100644 --- a/src/calibre/gui2/convert/pdf_output.py +++ b/src/calibre/gui2/convert/pdf_output.py @@ -3,12 +3,12 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import QHBoxLayout, QFormLayout, QDoubleSpinBox, QCheckBox, QVBoxLayout +from qt.core import QCheckBox, QDoubleSpinBox, QFormLayout, QHBoxLayout, QVBoxLayout -from calibre.gui2.convert.pdf_output_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.utils.localization import localize_user_manual_link from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.pdf_output_ui import Ui_Form +from calibre.utils.localization import localize_user_manual_link paper_size_model = None orientation_model = None diff --git a/src/calibre/gui2/convert/pml_output.py b/src/calibre/gui2/convert/pml_output.py index 00d66ad224..9a48084142 100644 --- a/src/calibre/gui2/convert/pml_output.py +++ b/src/calibre/gui2/convert/pml_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.pmlz_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.pmlz_output_ui import Ui_Form format_model = None diff --git a/src/calibre/gui2/convert/rb_output.py b/src/calibre/gui2/convert/rb_output.py index 09777b4bcd..41a5b01893 100644 --- a/src/calibre/gui2/convert/rb_output.py +++ b/src/calibre/gui2/convert/rb_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.rb_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.rb_output_ui import Ui_Form format_model = None diff --git a/src/calibre/gui2/convert/regex_builder.py b/src/calibre/gui2/convert/regex_builder.py index bdf8136b35..3057e6ed4d 100644 --- a/src/calibre/gui2/convert/regex_builder.py +++ b/src/calibre/gui2/convert/regex_builder.py @@ -3,9 +3,8 @@ import os from contextlib import suppress -from qt.core import ( - QBrush, QDialog, QDialogButtonBox, Qt, QTextCursor, QTextEdit, pyqtSignal, -) + +from qt.core import QBrush, QDialog, QDialogButtonBox, Qt, QTextCursor, QTextEdit, pyqtSignal from calibre.constants import iswindows from calibre.ebooks.conversion.search_replace import compile_regular_expression diff --git a/src/calibre/gui2/convert/rtf_input.py b/src/calibre/gui2/convert/rtf_input.py index 365016fa84..ebf7b4a1a0 100644 --- a/src/calibre/gui2/convert/rtf_input.py +++ b/src/calibre/gui2/convert/rtf_input.py @@ -4,9 +4,9 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from calibre.gui2.convert.rtf_input_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.rtf_input_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/search_and_replace.py b/src/calibre/gui2/convert/search_and_replace.py index 587268d41a..1eabfc756b 100644 --- a/src/calibre/gui2/convert/search_and_replace.py +++ b/src/calibre/gui2/convert/search_and_replace.py @@ -2,18 +2,18 @@ __license__ = 'GPL 3' __copyright__ = '2011, John Schember , 2012 Eli Algranti ' __docformat__ = 'restructuredtext en' -import codecs, json +import codecs +import json from qt.core import Qt, QTableWidgetItem -from calibre.gui2.convert.search_and_replace_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.gui2 import (error_dialog, question_dialog, choose_files, - choose_save_file) from calibre import as_unicode -from calibre.utils.localization import localize_user_manual_link -from calibre.ebooks.conversion.search_replace import compile_regular_expression from calibre.ebooks.conversion.config import OPTIONS +from calibre.ebooks.conversion.search_replace import compile_regular_expression +from calibre.gui2 import choose_files, choose_save_file, error_dialog, question_dialog +from calibre.gui2.convert import Widget +from calibre.gui2.convert.search_and_replace_ui import Ui_Form +from calibre.utils.localization import localize_user_manual_link class SearchAndReplaceWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/single.py b/src/calibre/gui2/convert/single.py index 7a65bfd286..8587ba95bd 100644 --- a/src/calibre/gui2/convert/single.py +++ b/src/calibre/gui2/convert/single.py @@ -5,16 +5,36 @@ import shutil from qt.core import ( - QAbstractListModel, QCheckBox, QComboBox, QDialog, - QDialogButtonBox, QFont, QFrame, QGridLayout, QHBoxLayout, QIcon, QLabel, - QListView, QModelIndex, QScrollArea, QSize, QSizePolicy, QSpacerItem, - Qt, QTextEdit, QWidget + QAbstractListModel, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QFrame, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QListView, + QModelIndex, + QScrollArea, + QSize, + QSizePolicy, + QSpacerItem, + Qt, + QTextEdit, + QWidget, ) from calibre.customize.conversion import OptionRecommendation from calibre.ebooks.conversion.config import ( - GuiRecommendations, delete_specifics, get_input_format_for_book, - get_output_formats, save_specifics, sort_formats_by_preference + GuiRecommendations, + delete_specifics, + get_input_format_for_book, + get_output_formats, + save_specifics, + sort_formats_by_preference, ) from calibre.ebooks.conversion.plumber import create_dummy_plumber from calibre.gui2 import gprefs diff --git a/src/calibre/gui2/convert/snb_output.py b/src/calibre/gui2/convert/snb_output.py index 5baf0b9418..1c4a211903 100644 --- a/src/calibre/gui2/convert/snb_output.py +++ b/src/calibre/gui2/convert/snb_output.py @@ -2,9 +2,9 @@ __license__ = 'GPL 3' __copyright__ = '2010, Li Fanxi ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.snb_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.snb_output_ui import Ui_Form newline_model = None diff --git a/src/calibre/gui2/convert/structure_detection.py b/src/calibre/gui2/convert/structure_detection.py index 56a1901fe4..81a54e4c95 100644 --- a/src/calibre/gui2/convert/structure_detection.py +++ b/src/calibre/gui2/convert/structure_detection.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.structure_detection_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.gui2 import error_dialog from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2 import error_dialog +from calibre.gui2.convert import Widget +from calibre.gui2.convert.structure_detection_ui import Ui_Form class StructureDetectionWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/toc.py b/src/calibre/gui2/convert/toc.py index 719f6b9d02..95ab6c597c 100644 --- a/src/calibre/gui2/convert/toc.py +++ b/src/calibre/gui2/convert/toc.py @@ -6,11 +6,11 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.toc_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.gui2 import error_dialog -from calibre.utils.localization import localize_user_manual_link from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2 import error_dialog +from calibre.gui2.convert import Widget +from calibre.gui2.convert.toc_ui import Ui_Form +from calibre.utils.localization import localize_user_manual_link class TOCWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/txt_input.py b/src/calibre/gui2/convert/txt_input.py index fcbf3f3fe4..dcd9591bd9 100644 --- a/src/calibre/gui2/convert/txt_input.py +++ b/src/calibre/gui2/convert/txt_input.py @@ -4,10 +4,10 @@ __docformat__ = 'restructuredtext en' from qt.core import QListWidgetItem, Qt -from calibre.gui2.convert.txt_input_ui import Ui_Form -from calibre.gui2.convert import Widget -from calibre.ebooks.conversion.plugins.txt_input import MD_EXTENSIONS from calibre.ebooks.conversion.config import OPTIONS +from calibre.ebooks.conversion.plugins.txt_input import MD_EXTENSIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.txt_input_ui import Ui_Form from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/convert/txt_output.py b/src/calibre/gui2/convert/txt_output.py index afca70c9d0..32add1ece6 100644 --- a/src/calibre/gui2/convert/txt_output.py +++ b/src/calibre/gui2/convert/txt_output.py @@ -3,9 +3,9 @@ __copyright__ = '2009, John Schember ' __docformat__ = 'restructuredtext en' -from calibre.gui2.convert.txt_output_ui import Ui_Form -from calibre.gui2.convert import Widget from calibre.ebooks.conversion.config import OPTIONS +from calibre.gui2.convert import Widget +from calibre.gui2.convert.txt_output_ui import Ui_Form class PluginWidget(Widget, Ui_Form): diff --git a/src/calibre/gui2/convert/xpath_wizard.py b/src/calibre/gui2/convert/xpath_wizard.py index 4d5f964ac8..3a713ac578 100644 --- a/src/calibre/gui2/convert/xpath_wizard.py +++ b/src/calibre/gui2/convert/xpath_wizard.py @@ -5,10 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import ( - QComboBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QSize, Qt, - QToolButton, QVBoxLayout, QWidget -) +from qt.core import QComboBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QSize, Qt, QToolButton, QVBoxLayout, QWidget from calibre.gui2.convert.xpath_wizard_ui import Ui_Form from calibre.gui2.widgets import HistoryLineEdit diff --git a/src/calibre/gui2/cover_flow.py b/src/calibre/gui2/cover_flow.py index 7be538f4bf..7fd9a6d04a 100644 --- a/src/calibre/gui2/cover_flow.py +++ b/src/calibre/gui2/cover_flow.py @@ -12,9 +12,22 @@ Module to implement the Cover Flow feature import os import sys import time + from qt.core import ( - QAction, QApplication, QDialog, QFont, QImage, QItemSelectionModel, QKeySequence, - QLabel, QSize, QSizePolicy, QStackedLayout, Qt, QTimer, pyqtSignal, + QAction, + QApplication, + QDialog, + QFont, + QImage, + QItemSelectionModel, + QKeySequence, + QLabel, + QSize, + QSizePolicy, + QStackedLayout, + Qt, + QTimer, + pyqtSignal, ) from calibre.constants import islinux diff --git a/src/calibre/gui2/covers.py b/src/calibre/gui2/covers.py index 7dbb2ccabb..2db143e4d0 100644 --- a/src/calibre/gui2/covers.py +++ b/src/calibre/gui2/covers.py @@ -5,17 +5,40 @@ import os from collections import OrderedDict from contextlib import suppress from copy import deepcopy + from qt.core import ( - QCheckBox, QColor, QColorDialog, QDialog, QDialogButtonBox, QFormLayout, QFrame, - QGridLayout, QHBoxLayout, QIcon, QInputDialog, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QMenu, QPixmap, QPushButton, QSize, QSizePolicy, QSpinBox, Qt, - QTabWidget, QTimer, QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QCheckBox, + QColor, + QColorDialog, + QDialog, + QDialogButtonBox, + QFormLayout, + QFrame, + QGridLayout, + QHBoxLayout, + QIcon, + QInputDialog, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QPixmap, + QPushButton, + QSize, + QSizePolicy, + QSpinBox, + Qt, + QTabWidget, + QTimer, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.constants import config_dir -from calibre.ebooks.covers import ( - all_styles, cprefs, default_color_themes, generate_cover, override_prefs, -) +from calibre.ebooks.covers import all_styles, cprefs, default_color_themes, generate_cover, override_prefs from calibre.gui2 import error_dialog, gprefs from calibre.gui2.font_family_chooser import FontFamilyChooser from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/css_transform_rules.py b/src/calibre/gui2/css_transform_rules.py index 3468c70a6a..6c23f031d1 100644 --- a/src/calibre/gui2/css_transform_rules.py +++ b/src/calibre/gui2/css_transform_rules.py @@ -2,17 +2,25 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from qt.core import ( - QWidget, QVBoxLayout, QHBoxLayout, QLabel, QComboBox, QLineEdit, - QPushButton, QSize, pyqtSignal, QMenu, QDialogButtonBox, QTextCursor -) +from qt.core import QComboBox, QDialogButtonBox, QHBoxLayout, QLabel, QLineEdit, QMenu, QPushButton, QSize, QTextCursor, QVBoxLayout, QWidget, pyqtSignal from calibre.ebooks.css_transform_rules import ( - validate_rule, safe_parser, compile_rules, transform_sheet, ACTION_MAP, MATCH_TYPE_MAP, export_rules, import_rules) -from calibre.gui2 import error_dialog, elided_text, choose_save_file, choose_files -from calibre.gui2.tag_mapper import ( - RuleEdit as RE, RuleEditDialog as RuleEditDialogBase, Rules as RulesBase, - RulesDialog as RulesDialogBase, RuleItem as RuleItemBase, SaveLoadMixin) + ACTION_MAP, + MATCH_TYPE_MAP, + compile_rules, + export_rules, + import_rules, + safe_parser, + transform_sheet, + validate_rule, +) +from calibre.gui2 import choose_files, choose_save_file, elided_text, error_dialog +from calibre.gui2.tag_mapper import RuleEdit as RE +from calibre.gui2.tag_mapper import RuleEditDialog as RuleEditDialogBase +from calibre.gui2.tag_mapper import RuleItem as RuleItemBase +from calibre.gui2.tag_mapper import Rules as RulesBase +from calibre.gui2.tag_mapper import RulesDialog as RulesDialogBase +from calibre.gui2.tag_mapper import SaveLoadMixin from calibre.gui2.widgets2 import Dialog from calibre.utils.config import JSONConfig from calibre.utils.localization import localize_user_manual_link diff --git a/src/calibre/gui2/custom_column_widgets.py b/src/calibre/gui2/custom_column_widgets.py index 2a8203827a..b29e932965 100644 --- a/src/calibre/gui2/custom_column_widgets.py +++ b/src/calibre/gui2/custom_column_widgets.py @@ -8,10 +8,29 @@ __docformat__ = 'restructuredtext en' import os from collections import OrderedDict from functools import partial + from qt.core import ( - QApplication, QCheckBox, QComboBox, QDialog, QDoubleSpinBox, QGridLayout, - QGroupBox, QHBoxLayout, QIcon, QLabel, QLineEdit, QMessageBox, QPlainTextEdit, - QSizePolicy, QSpacerItem, QSpinBox, QStyle, Qt, QToolButton, QUrl, QVBoxLayout, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDoubleSpinBox, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QMessageBox, + QPlainTextEdit, + QSizePolicy, + QSpacerItem, + QSpinBox, + QStyle, + Qt, + QToolButton, + QUrl, + QVBoxLayout, QWidget, ) @@ -22,14 +41,13 @@ from calibre.gui2.complete2 import EditWithComplete as EWC from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.library.delegates import ClearingDoubleSpinBox, ClearingSpinBox from calibre.gui2.markdown_editor import Editor as MarkdownEditor -from calibre.gui2.widgets2 import DateTimeEdit as DateTimeEditBase, RatingEditor +from calibre.gui2.widgets2 import DateTimeEdit as DateTimeEditBase +from calibre.gui2.widgets2 import RatingEditor from calibre.library.comments import comments_to_html from calibre.utils.config import tweaks -from calibre.utils.date import ( - as_local_time, as_utc, internal_iso_format_string, is_date_undefined, now, - qt_from_dt, qt_to_dt, -) -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.date import as_local_time, as_utc, internal_iso_format_string, is_date_undefined, now, qt_from_dt, qt_to_dt +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key class EditWithComplete(EWC): diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 8b295da09a..1c00b1ac9d 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -10,23 +10,22 @@ import sys import time import traceback import weakref -from qt.core import ( - QAction, QActionGroup, QCoreApplication, QDialog, QDialogButtonBox, QEventLoop, - QIcon, QMenu, QObject, QTimer, QVBoxLayout, pyqtSignal, -) from threading import Event, Thread -from calibre import ( - as_unicode, force_unicode, preferred_encoding, prints, sanitize_file_name, -) +from qt.core import QAction, QActionGroup, QCoreApplication, QDialog, QDialogButtonBox, QEventLoop, QIcon, QMenu, QObject, QTimer, QVBoxLayout, pyqtSignal + +from calibre import as_unicode, force_unicode, preferred_encoding, prints, sanitize_file_name from calibre.constants import DEBUG -from calibre.customize.ui import ( - available_input_formats, available_output_formats, device_plugins, - disabled_device_plugins, -) +from calibre.customize.ui import available_input_formats, available_output_formats, device_plugins, disabled_device_plugins from calibre.devices.errors import ( - BlacklistedDevice, FreeSpaceError, InitialConnectionError, OpenActionNeeded, - OpenFailed, OpenFeedback, UserFeedback, WrongDestinationError, + BlacklistedDevice, + FreeSpaceError, + InitialConnectionError, + OpenActionNeeded, + OpenFailed, + OpenFeedback, + UserFeedback, + WrongDestinationError, ) from calibre.devices.folder_device.driver import FOLDER_DEVICE from calibre.devices.interface import DevicePlugin, currently_connected_device @@ -34,15 +33,23 @@ from calibre.devices.scanner import DeviceScanner from calibre.ebooks.covers import cprefs, generate_cover, override_prefs, scale_cover from calibre.ebooks.metadata import authors_to_string from calibre.gui2 import ( - Dispatcher, FunctionDispatcher, choose_dir, config, dynamic, error_dialog, gprefs, - info_dialog, question_dialog, show_restart_warning, warning_dialog, + Dispatcher, + FunctionDispatcher, + choose_dir, + config, + dynamic, + error_dialog, + gprefs, + info_dialog, + question_dialog, + show_restart_warning, + warning_dialog, ) from calibre.gui2.dialogs.choose_format_device import ChooseFormatDeviceDialog from calibre.gui2.widgets import BusyCursor from calibre.library.save_to_disk import find_plugboard -from calibre.ptempfile import ( - PersistentTemporaryFile, force_unicode as filename_to_unicode, -) +from calibre.ptempfile import PersistentTemporaryFile +from calibre.ptempfile import force_unicode as filename_to_unicode from calibre.startup import connect_lambda from calibre.utils.config import device_prefs, tweaks from calibre.utils.filenames import ascii_filename diff --git a/src/calibre/gui2/device_drivers/configwidget.py b/src/calibre/gui2/device_drivers/configwidget.py index 6bad19f38c..2f15914533 100644 --- a/src/calibre/gui2/device_drivers/configwidget.py +++ b/src/calibre/gui2/device_drivers/configwidget.py @@ -4,13 +4,12 @@ __docformat__ = 'restructuredtext en' import textwrap -from qt.core import (QWidget, QListWidgetItem, Qt, QLabel, - QLineEdit, QCheckBox, QComboBox) +from qt.core import QCheckBox, QComboBox, QLabel, QLineEdit, QListWidgetItem, Qt, QWidget +from calibre.ebooks import BOOK_EXTENSIONS from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.device_drivers.configwidget_ui import Ui_ConfigWidget from calibre.utils.formatter import validation_formatter -from calibre.ebooks import BOOK_EXTENSIONS class ConfigWidget(QWidget, Ui_ConfigWidget): diff --git a/src/calibre/gui2/device_drivers/mtp_config.py b/src/calibre/gui2/device_drivers/mtp_config.py index f562a59c33..4c45121e37 100644 --- a/src/calibre/gui2/device_drivers/mtp_config.py +++ b/src/calibre/gui2/device_drivers/mtp_config.py @@ -7,17 +7,37 @@ __docformat__ = 'restructuredtext en' import weakref -from qt.core import (QWidget, QListWidgetItem, Qt, QToolButton, QLabel, - QTabWidget, QGridLayout, QListWidget, QIcon, QLineEdit, QVBoxLayout, - QPushButton, QGroupBox, QScrollArea, QHBoxLayout, QComboBox, - pyqtSignal, QSizePolicy, QDialog, QDialogButtonBox, QPlainTextEdit, - QApplication, QSize) +from qt.core import ( + QApplication, + QComboBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QPlainTextEdit, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + Qt, + QTabWidget, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, +) from calibre.ebooks import BOOK_EXTENSIONS from calibre.gui2 import error_dialog +from calibre.gui2.device_drivers.mtp_folder_browser import Browser, IgnoredFolders from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.utils.date import parse_date -from calibre.gui2.device_drivers.mtp_folder_browser import Browser, IgnoredFolders from polyglot.builtins import iteritems @@ -527,9 +547,9 @@ class SendError(QDialog): if __name__ == '__main__': - from calibre.gui2 import Application from calibre.devices.mtp.driver import MTP_DEVICE from calibre.devices.scanner import DeviceScanner + from calibre.gui2 import Application s = DeviceScanner() s.scan() app = Application([]) diff --git a/src/calibre/gui2/device_drivers/mtp_folder_browser.py b/src/calibre/gui2/device_drivers/mtp_folder_browser.py index a852b6b83e..d283587bf9 100644 --- a/src/calibre/gui2/device_drivers/mtp_folder_browser.py +++ b/src/calibre/gui2/device_drivers/mtp_folder_browser.py @@ -6,10 +6,8 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' from operator import attrgetter -from qt.core import ( - QDialog, QDialogButtonBox, QIcon, QLabel, QSize, Qt, QTabWidget, QTreeWidget, - QTreeWidgetItem, QVBoxLayout, pyqtSignal, -) + +from qt.core import QDialog, QDialogButtonBox, QIcon, QLabel, QSize, Qt, QTabWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout, pyqtSignal from calibre.gui2 import file_icon_provider from calibre.utils.icu import lower as icu_lower diff --git a/src/calibre/gui2/device_drivers/tabbed_device_config.py b/src/calibre/gui2/device_drivers/tabbed_device_config.py index 5e3789ee3b..783bb695fa 100644 --- a/src/calibre/gui2/device_drivers/tabbed_device_config.py +++ b/src/calibre/gui2/device_drivers/tabbed_device_config.py @@ -4,16 +4,28 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import weakref, textwrap +import textwrap +import weakref from qt.core import ( - QWidget, QLabel, QTabWidget, QGridLayout, QLineEdit, QVBoxLayout, - QGroupBox, QComboBox, QSizePolicy, QDialog, QDialogButtonBox, QCheckBox, - QSpacerItem) + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QGroupBox, + QLabel, + QLineEdit, + QSizePolicy, + QSpacerItem, + QTabWidget, + QVBoxLayout, + QWidget, +) -from calibre.ebooks import BOOK_EXTENSIONS -from calibre.gui2.device_drivers.mtp_config import (FormatsConfig, TemplateConfig) from calibre.devices.usbms.driver import debug_print +from calibre.ebooks import BOOK_EXTENSIONS +from calibre.gui2.device_drivers.mtp_config import FormatsConfig, TemplateConfig def wrap_msg(msg): @@ -372,9 +384,9 @@ class DeviceOptionsGroupBox(QGroupBox): if __name__ == '__main__': - from calibre.gui2 import Application from calibre.devices.kobo.driver import KOBO from calibre.devices.scanner import DeviceScanner + from calibre.gui2 import Application s = DeviceScanner() s.scan() app = Application([]) diff --git a/src/calibre/gui2/dialogs/add_empty_book.py b/src/calibre/gui2/dialogs/add_empty_book.py index 17b395a136..c8772e44c2 100644 --- a/src/calibre/gui2/dialogs/add_empty_book.py +++ b/src/calibre/gui2/dialogs/add_empty_book.py @@ -6,13 +6,12 @@ __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from qt.core import ( - QDialog, QGridLayout, QLabel, QDialogButtonBox, QApplication, QSpinBox, - QToolButton, QIcon, QLineEdit, QComboBox, QCheckBox) +from qt.core import QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QLineEdit, QSpinBox, QToolButton + from calibre.ebooks.metadata import string_to_authors +from calibre.gui2 import gprefs from calibre.gui2.complete2 import EditWithComplete from calibre.utils.config import tweaks -from calibre.gui2 import gprefs class AddEmptyBookDialog(QDialog): diff --git a/src/calibre/gui2/dialogs/add_from_isbn.py b/src/calibre/gui2/dialogs/add_from_isbn.py index 83302f326a..6d914a3bbc 100644 --- a/src/calibre/gui2/dialogs/add_from_isbn.py +++ b/src/calibre/gui2/dialogs/add_from_isbn.py @@ -6,10 +6,8 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os -from qt.core import ( - QApplication, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, - QLineEdit, QPlainTextEdit, QPushButton, Qt, QVBoxLayout -) + +from qt.core import QApplication, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QLineEdit, QPlainTextEdit, QPushButton, Qt, QVBoxLayout from calibre.constants import iswindows from calibre.ebooks.metadata import check_isbn diff --git a/src/calibre/gui2/dialogs/authors_edit.py b/src/calibre/gui2/dialogs/authors_edit.py index d93aad884e..f0de795193 100644 --- a/src/calibre/gui2/dialogs/authors_edit.py +++ b/src/calibre/gui2/dialogs/authors_edit.py @@ -5,9 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from collections import OrderedDict + from qt.core import ( - QAbstractItemView, QApplication, QDialog, QDialogButtonBox, QGridLayout, QIcon, - QLabel, QListWidget, QPushButton, QSize, QStyledItemDelegate, Qt, pyqtSignal, + QAbstractItemView, + QApplication, + QDialog, + QDialogButtonBox, + QGridLayout, + QIcon, + QLabel, + QListWidget, + QPushButton, + QSize, + QStyledItemDelegate, + Qt, + pyqtSignal, ) from calibre.ebooks.metadata import string_to_authors diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index e35fb71646..309c92b8bd 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -6,19 +6,37 @@ import textwrap from enum import IntEnum from qt.core import ( - QAction, QApplication, QBrush, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, - QHBoxLayout, QIcon, QKeySequence, QLabel, QListView, QModelIndex, QPalette, QPixmap, - QPushButton, QShortcut, QSize, QSplitter, Qt, QTimer, QToolButton, QVBoxLayout, - QWidget, pyqtSignal, + QAction, + QApplication, + QBrush, + QCheckBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QListView, + QModelIndex, + QPalette, + QPixmap, + QPushButton, + QShortcut, + QSize, + QSplitter, + Qt, + QTimer, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import fit_image from calibre.db.constants import RESOURCE_URL_SCHEME -from calibre.gui2 import NO_URL_FORMATTING, gprefs -from calibre.gui2 import BOOK_DETAILS_DISPLAY_DEBOUNCE_DELAY -from calibre.gui2.book_details import ( - create_open_cover_with_menu, resolved_css, details_context_menu_event, render_html, set_html, -) +from calibre.gui2 import BOOK_DETAILS_DISPLAY_DEBOUNCE_DELAY, NO_URL_FORMATTING, gprefs +from calibre.gui2.book_details import create_open_cover_with_menu, details_context_menu_event, render_html, resolved_css, set_html from calibre.gui2.ui import get_gui from calibre.gui2.widgets import CoverView from calibre.gui2.widgets2 import Dialog, HTMLDisplay @@ -67,9 +85,7 @@ class Configure(Dialog): Dialog.__init__(self, _('Configure the Book details window'), 'book-details-popup-conf', parent) def setup_ui(self): - from calibre.gui2.preferences.look_feel import ( - DisplayedFields, move_field_down, move_field_up, - ) + from calibre.gui2.preferences.look_feel import DisplayedFields, move_field_down, move_field_up self.l = QVBoxLayout(self) self.field_display_order = fdo = QListView(self) self.model = DisplayedFields(self.db, fdo, pref_name='popup_book_display_fields') diff --git a/src/calibre/gui2/dialogs/catalog.py b/src/calibre/gui2/dialogs/catalog.py index a801c07f56..acc3b144ae 100644 --- a/src/calibre/gui2/dialogs/catalog.py +++ b/src/calibre/gui2/dialogs/catalog.py @@ -9,9 +9,8 @@ import importlib import os import sys import weakref -from qt.core import ( - QDialog, QDialogButtonBox, QScrollArea, QSize -) + +from qt.core import QDialog, QDialogButtonBox, QScrollArea, QSize from calibre.customize import PluginInstallationType from calibre.customize.ui import catalog_plugins, config @@ -25,6 +24,7 @@ class Catalog(QDialog, Ui_Dialog): def __init__(self, parent, dbspec, ids, db): import re + from PyQt6.uic import compileUi from calibre import prints as info diff --git a/src/calibre/gui2/dialogs/check_library.py b/src/calibre/gui2/dialogs/check_library.py index 58e6c1268e..f36c37eed7 100644 --- a/src/calibre/gui2/dialogs/check_library.py +++ b/src/calibre/gui2/dialogs/check_library.py @@ -7,14 +7,33 @@ __license__ = 'GPL v3' import os import weakref -from qt.core import ( - QApplication, QCheckBox, QCursor, QDialog, QDialogButtonBox, QGridLayout, - QHBoxLayout, QIcon, QLabel, QLineEdit, QProgressBar, QPushButton, - QStackedLayout, Qt, QTextEdit, QTreeWidget, QTreeWidgetItem, QVBoxLayout, - QWidget, pyqtSignal, QSplitter, QToolButton -) from threading import Thread +from qt.core import ( + QApplication, + QCheckBox, + QCursor, + QDialog, + QDialogButtonBox, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QProgressBar, + QPushButton, + QSplitter, + QStackedLayout, + Qt, + QTextEdit, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import as_unicode, prints from calibre.gui2 import open_local_file from calibre.gui2.dialogs.confirm_delete import confirm diff --git a/src/calibre/gui2/dialogs/choose_format.py b/src/calibre/gui2/dialogs/choose_format.py index 32b58034e7..fcf012141d 100644 --- a/src/calibre/gui2/dialogs/choose_format.py +++ b/src/calibre/gui2/dialogs/choose_format.py @@ -2,10 +2,8 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' from functools import partial -from qt.core import ( - QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QListWidget, QListWidgetItem, - QMenu, QModelIndex, QPushButton, QSize, QVBoxLayout, -) + +from qt.core import QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QListWidget, QListWidgetItem, QMenu, QModelIndex, QPushButton, QSize, QVBoxLayout from calibre.gui2 import file_icon_provider from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/dialogs/choose_format_device.py b/src/calibre/gui2/dialogs/choose_format_device.py index 903b79813e..4fb26c02c4 100644 --- a/src/calibre/gui2/dialogs/choose_format_device.py +++ b/src/calibre/gui2/dialogs/choose_format_device.py @@ -1,7 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2011, John Schember ' -from qt.core import QDialog, QTreeWidgetItem, QIcon, QModelIndex +from qt.core import QDialog, QIcon, QModelIndex, QTreeWidgetItem from calibre.gui2 import file_icon_provider from calibre.gui2.dialogs.choose_format_device_ui import Ui_ChooseFormatDeviceDialog diff --git a/src/calibre/gui2/dialogs/choose_library.py b/src/calibre/gui2/dialogs/choose_library.py index f03e1836c3..b5d1f49a6a 100644 --- a/src/calibre/gui2/dialogs/choose_library.py +++ b/src/calibre/gui2/dialogs/choose_library.py @@ -7,9 +7,10 @@ __docformat__ = 'restructuredtext en' import errno import os -from qt.core import QDialog, Qt, QTimer, pyqtSignal from threading import Event, Thread +from qt.core import QDialog, Qt, QTimer, pyqtSignal + from calibre import force_unicode, isbytestring, patheq from calibre.constants import filesystem_encoding, get_portable_base, iswindows from calibre.gui2 import choose_dir, error_dialog diff --git a/src/calibre/gui2/dialogs/choose_plugin_toolbars.py b/src/calibre/gui2/dialogs/choose_plugin_toolbars.py index 710c5989ce..dc88345c16 100644 --- a/src/calibre/gui2/dialogs/choose_plugin_toolbars.py +++ b/src/calibre/gui2/dialogs/choose_plugin_toolbars.py @@ -6,8 +6,7 @@ __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from qt.core import (QDialog, QVBoxLayout, QLabel, QDialogButtonBox, - QListWidget, QAbstractItemView, QSizePolicy) +from qt.core import QAbstractItemView, QDialog, QDialogButtonBox, QLabel, QListWidget, QSizePolicy, QVBoxLayout class ChoosePluginToolbarsDialog(QDialog): diff --git a/src/calibre/gui2/dialogs/comments_dialog.py b/src/calibre/gui2/dialogs/comments_dialog.py index 2768a38e5e..4747a918b9 100644 --- a/src/calibre/gui2/dialogs/comments_dialog.py +++ b/src/calibre/gui2/dialogs/comments_dialog.py @@ -5,10 +5,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from qt.core import ( - QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QPlainTextEdit, QSize, Qt, - QVBoxLayout, pyqtSignal, -) +from qt.core import QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QPlainTextEdit, QSize, Qt, QVBoxLayout, pyqtSignal from calibre.gui2 import Application, gprefs from calibre.gui2.comments_editor import Editor diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py index bf0209a881..d87fc7eb1a 100644 --- a/src/calibre/gui2/dialogs/confirm_delete.py +++ b/src/calibre/gui2/dialogs/confirm_delete.py @@ -5,9 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, Qt, QVBoxLayout, -) +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, Qt, QVBoxLayout from calibre import confirm_config_name from calibre.gui2 import dynamic diff --git a/src/calibre/gui2/dialogs/confirm_delete_location.py b/src/calibre/gui2/dialogs/confirm_delete_location.py index acad8e9fb7..e7ba43446d 100644 --- a/src/calibre/gui2/dialogs/confirm_delete_location.py +++ b/src/calibre/gui2/dialogs/confirm_delete_location.py @@ -6,7 +6,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' \ '2010, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import QDialog, QIcon, Qt, QVBoxLayout, QHBoxLayout, QSizePolicy, QLabel, QPushButton +from qt.core import QDialog, QHBoxLayout, QIcon, QLabel, QPushButton, QSizePolicy, Qt, QVBoxLayout from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/dialogs/confirm_merge.py b/src/calibre/gui2/dialogs/confirm_merge.py index 58e4c47a99..8b73037a94 100644 --- a/src/calibre/gui2/dialogs/confirm_merge.py +++ b/src/calibre/gui2/dialogs/confirm_merge.py @@ -6,10 +6,7 @@ __copyright__ = '2015, Kovid Goyal ' from typing import NamedTuple -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QLabel, QSplitter, Qt, QTextBrowser, - QVBoxLayout, QWidget, -) +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QLabel, QSplitter, Qt, QTextBrowser, QVBoxLayout, QWidget from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.book.base import field_metadata diff --git a/src/calibre/gui2/dialogs/custom_recipes.py b/src/calibre/gui2/dialogs/custom_recipes.py index afca6b7470..091eeb8b3c 100644 --- a/src/calibre/gui2/dialogs/custom_recipes.py +++ b/src/calibre/gui2/dialogs/custom_recipes.py @@ -4,24 +4,48 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, re, textwrap, time +import os +import re +import textwrap +import time from qt.core import ( - QVBoxLayout, QStackedWidget, QSize, QPushButton, QIcon, QWidget, QListView, QItemSelectionModel, - QHBoxLayout, QAbstractListModel, Qt, QLabel, QSizePolicy, pyqtSignal, QSortFilterProxyModel, - QFormLayout, QSpinBox, QLineEdit, QGroupBox, QListWidget, QListWidgetItem, - QToolButton, QTreeView, QDialog, QDialogButtonBox) + QAbstractListModel, + QDialog, + QDialogButtonBox, + QFormLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QItemSelectionModel, + QLabel, + QLineEdit, + QListView, + QListWidget, + QListWidgetItem, + QPushButton, + QSize, + QSizePolicy, + QSortFilterProxyModel, + QSpinBox, + QStackedWidget, + Qt, + QToolButton, + QTreeView, + QVBoxLayout, + QWidget, + pyqtSignal, +) -from calibre.gui2 import error_dialog, open_local_file, choose_files, choose_save_file +from calibre.gui2 import choose_files, choose_save_file, error_dialog, open_local_file from calibre.gui2.dialogs.confirm_delete import confirm as confirm_delete -from calibre.gui2.widgets2 import Dialog -from calibre.web.feeds.recipes import custom_recipes, compile_recipe -from calibre.gui2.tweak_book.editor.text import TextEdit -from calibre.web.feeds.recipes.collection import get_builtin_recipe_by_id -from calibre.utils.localization import localize_user_manual_link -from polyglot.builtins import iteritems, as_unicode from calibre.gui2.search_box import SearchBox2 -from polyglot.builtins import as_bytes +from calibre.gui2.tweak_book.editor.text import TextEdit +from calibre.gui2.widgets2 import Dialog +from calibre.utils.localization import localize_user_manual_link +from calibre.web.feeds.recipes import compile_recipe, custom_recipes +from calibre.web.feeds.recipes.collection import get_builtin_recipe_by_id +from polyglot.builtins import as_bytes, as_unicode, iteritems def is_basic_recipe(src): diff --git a/src/calibre/gui2/dialogs/data_files_manager.py b/src/calibre/gui2/dialogs/data_files_manager.py index be6fbeef69..716d36a727 100644 --- a/src/calibre/gui2/dialogs/data_files_manager.py +++ b/src/calibre/gui2/dialogs/data_files_manager.py @@ -8,24 +8,40 @@ from contextlib import contextmanager from datetime import datetime from functools import partial from math import ceil + from qt.core import ( - QAbstractItemView, QAbstractListModel, QComboBox, QCursor, QDialogButtonBox, - QHBoxLayout, QIcon, QItemSelection, QItemSelectionModel, QLabel, QListView, QMenu, - QPushButton, QRect, QSize, QStyle, QStyledItemDelegate, Qt, QTextDocument, QTimer, - QVBoxLayout, pyqtSignal, sip, QDropEvent + QAbstractItemView, + QAbstractListModel, + QComboBox, + QCursor, + QDialogButtonBox, + QDropEvent, + QHBoxLayout, + QIcon, + QItemSelection, + QItemSelectionModel, + QLabel, + QListView, + QMenu, + QPushButton, + QRect, + QSize, + QStyle, + QStyledItemDelegate, + Qt, + QTextDocument, + QTimer, + QVBoxLayout, + pyqtSignal, + sip, ) from calibre import human_readable, prepare_string_for_xml from calibre.constants import ismacos from calibre.db.constants import DATA_DIR_NAME, DATA_FILE_PATTERN -from calibre.gui2 import ( - choose_files, error_dialog, file_icon_provider, gprefs, open_local_file, - question_dialog, -) +from calibre.gui2 import choose_files, error_dialog, file_icon_provider, gprefs, open_local_file, question_dialog from calibre.gui2.dialogs.confirm_delete import confirm -from calibre.gui2.open_with import ( - choose_program, edit_programs, populate_menu, run_program, -) +from calibre.gui2.open_with import choose_program, edit_programs, populate_menu, run_program from calibre.gui2.widgets2 import Dialog from calibre.utils.icu import primary_sort_key from calibre.utils.recycle_bin import delete_file diff --git a/src/calibre/gui2/dialogs/delete_matching_from_device.py b/src/calibre/gui2/dialogs/delete_matching_from_device.py index 2a0cc07bd1..fdea0b7641 100644 --- a/src/calibre/gui2/dialogs/delete_matching_from_device.py +++ b/src/calibre/gui2/dialogs/delete_matching_from_device.py @@ -5,13 +5,11 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __license__ = 'GPL v3' -from qt.core import Qt, QDialog, QTableWidgetItem, QAbstractItemView +from qt.core import QAbstractItemView, QDialog, Qt, QTableWidgetItem from calibre import strftime -from calibre.ebooks.metadata import authors_to_string, authors_to_sort_string, \ - title_sort -from calibre.gui2.dialogs.delete_matching_from_device_ui import \ - Ui_DeleteMatchingFromDeviceDialog +from calibre.ebooks.metadata import authors_to_sort_string, authors_to_string, title_sort +from calibre.gui2.dialogs.delete_matching_from_device_ui import Ui_DeleteMatchingFromDeviceDialog from calibre.utils.date import UNDEFINED_DATE diff --git a/src/calibre/gui2/dialogs/device_category_editor.py b/src/calibre/gui2/dialogs/device_category_editor.py index 54e547f167..2219c20d0b 100644 --- a/src/calibre/gui2/dialogs/device_category_editor.py +++ b/src/calibre/gui2/dialogs/device_category_editor.py @@ -1,10 +1,10 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from qt.core import Qt, QDialog, QListWidgetItem +from qt.core import QDialog, QListWidgetItem, Qt +from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.dialogs.device_category_editor_ui import Ui_DeviceCategoryEditor -from calibre.gui2 import question_dialog, error_dialog class ListWidgetItem(QListWidgetItem): diff --git a/src/calibre/gui2/dialogs/duplicates.py b/src/calibre/gui2/dialogs/duplicates.py index 74815ea069..8d47ffce9c 100644 --- a/src/calibre/gui2/dialogs/duplicates.py +++ b/src/calibre/gui2/dialogs/duplicates.py @@ -6,10 +6,8 @@ __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os.path -from qt.core import ( - QApplication, QDialog, QDialogButtonBox, QFont, QGridLayout, QIcon, QLabel, Qt, - QTreeWidget, QTreeWidgetItem, -) + +from qt.core import QApplication, QDialog, QDialogButtonBox, QFont, QGridLayout, QIcon, QLabel, Qt, QTreeWidget, QTreeWidgetItem from calibre.ebooks.metadata import authors_to_string from calibre.gui2 import gprefs diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py index baf50de69f..74c5c60462 100644 --- a/src/calibre/gui2/dialogs/edit_authors_dialog.py +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py @@ -7,21 +7,32 @@ __license__ = 'GPL v3' from contextlib import contextmanager from functools import partial + from qt.core import ( - QAbstractItemView, QAction, QApplication, QDialog, QDialogButtonBox, QFrame, - QIcon, QLabel, QMenu, QStyledItemDelegate, Qt, QTableWidgetItem, QTimer, + QAbstractItemView, + QAction, + QApplication, + QDialog, + QDialogButtonBox, + QFrame, + QIcon, + QLabel, + QMenu, + QStyledItemDelegate, + Qt, + QTableWidgetItem, + QTimer, ) from calibre.ebooks.metadata import author_to_author_sort, string_to_authors from calibre.gui2 import error_dialog, gprefs from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog -from calibre.gui2.dialogs.tag_list_editor import NotesUtilities, NotesTableWidgetItem +from calibre.gui2.dialogs.tag_list_editor import NotesTableWidgetItem, NotesUtilities from calibre.utils.config import prefs from calibre.utils.config_base import tweaks -from calibre.utils.icu import ( - contains, lower as icu_lower, primary_contains, primary_startswith, sort_key, - upper as icu_upper, -) +from calibre.utils.icu import contains, primary_contains, primary_startswith, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction' diff --git a/src/calibre/gui2/dialogs/edit_category_notes.py b/src/calibre/gui2/dialogs/edit_category_notes.py index 36e082ff9c..23260a14dc 100644 --- a/src/calibre/gui2/dialogs/edit_category_notes.py +++ b/src/calibre/gui2/dialogs/edit_category_notes.py @@ -3,21 +3,38 @@ import os import sys -from qt.core import ( - QButtonGroup, QByteArray, QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, - QIcon, QLabel, QLineEdit, QPixmap, QPushButton, QRadioButton, QSize, QSpinBox, Qt, - QTextDocument, QTextFrameFormat, QTextImageFormat, QUrl, QVBoxLayout, QWidget, - pyqtSlot, -) from typing import NamedTuple -from calibre import sanitize_file_name, fit_image +from qt.core import ( + QButtonGroup, + QByteArray, + QDialog, + QDialogButtonBox, + QFormLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QPixmap, + QPushButton, + QRadioButton, + QSize, + QSpinBox, + Qt, + QTextDocument, + QTextFrameFormat, + QTextImageFormat, + QUrl, + QVBoxLayout, + QWidget, + pyqtSlot, +) + +from calibre import fit_image, sanitize_file_name from calibre.db.constants import RESOURCE_URL_SCHEME from calibre.db.notes.connect import hash_data from calibre.db.notes.exim import export_note, import_note -from calibre.gui2 import ( - Application, choose_files, choose_images, choose_save_file, error_dialog, -) +from calibre.gui2 import Application, choose_files, choose_images, choose_save_file, error_dialog from calibre.gui2.comments_editor import OBJECT_REPLACEMENT_CHAR, Editor, EditorWidget from calibre.gui2.widgets import ImageView from calibre.gui2.widgets2 import Dialog diff --git a/src/calibre/gui2/dialogs/enum_values_edit.py b/src/calibre/gui2/dialogs/enum_values_edit.py index 8a5884cf3d..3b87001cc6 100644 --- a/src/calibre/gui2/dialogs/enum_values_edit.py +++ b/src/calibre/gui2/dialogs/enum_values_edit.py @@ -1,9 +1,21 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2020, Charles Haley -from qt.core import (Qt, QDialog, QColor, QDialogButtonBox, QHeaderView, - QGridLayout, QTableWidget, QTableWidgetItem, QVBoxLayout, - QToolButton, QIcon, QAbstractItemView, QComboBox) +from qt.core import ( + QAbstractItemView, + QColor, + QComboBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QHeaderView, + QIcon, + Qt, + QTableWidget, + QTableWidgetItem, + QToolButton, + QVBoxLayout, +) from calibre.gui2 import error_dialog, gprefs diff --git a/src/calibre/gui2/dialogs/exim.py b/src/calibre/gui2/dialogs/exim.py index f0c9701ee3..dfceba8561 100644 --- a/src/calibre/gui2/dialogs/exim.py +++ b/src/calibre/gui2/dialogs/exim.py @@ -5,13 +5,30 @@ import os import stat from functools import partial -from qt.core import ( - QAbstractItemView, QDialog, QDialogButtonBox, QFrame, QGridLayout, QIcon, QLabel, - QLineEdit, QListWidget, QListWidgetItem, QProgressBar, QPushButton, QScrollArea, - QSize, QStackedLayout, Qt, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Event, Thread +from qt.core import ( + QAbstractItemView, + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QProgressBar, + QPushButton, + QScrollArea, + QSize, + QStackedLayout, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import as_unicode, human_readable from calibre.constants import iswindows from calibre.db.legacy import LibraryDatabase diff --git a/src/calibre/gui2/dialogs/match_books.py b/src/calibre/gui2/dialogs/match_books.py index 790bf50a15..a64d9368d3 100644 --- a/src/calibre/gui2/dialogs/match_books.py +++ b/src/calibre/gui2/dialogs/match_books.py @@ -6,9 +6,7 @@ __copyright__ = '2013, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' -from qt.core import ( - QAbstractItemView, QApplication, QCursor, QDialog, Qt, QTableWidgetItem, QTimer, -) +from qt.core import QAbstractItemView, QApplication, QCursor, QDialog, Qt, QTableWidgetItem, QTimer from calibre.gui2 import error_dialog, gprefs from calibre.gui2.dialogs.match_books_ui import Ui_MatchBooks diff --git a/src/calibre/gui2/dialogs/message_box.py b/src/calibre/gui2/dialogs/message_box.py index 700355a5af..108061f591 100644 --- a/src/calibre/gui2/dialogs/message_box.py +++ b/src/calibre/gui2/dialogs/message_box.py @@ -5,12 +5,29 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from contextlib import suppress import sys +from contextlib import suppress + from qt.core import ( - QAction, QApplication, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, - QKeySequence, QLabel, QPainter, QPlainTextEdit, QSize, QSizePolicy, Qt, - QTextBrowser, QTextDocument, QVBoxLayout, QWidget, pyqtSignal, + QAction, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QIcon, + QKeySequence, + QLabel, + QPainter, + QPlainTextEdit, + QSize, + QSizePolicy, + Qt, + QTextBrowser, + QTextDocument, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.constants import __version__, isfrozen @@ -489,9 +506,10 @@ class JobError(QDialog): # {{{ if __name__ == '__main__': + from qt.core import QMainWindow, QTimer + from calibre import prepare_string_for_xml from calibre.gui2 import Application, question_dialog - from qt.core import QMainWindow, QTimer app = Application([]) merged = {'Kovid Goyal': ['Waterloo', 'Doomed'], 'Someone Else': ['Some other book ' * 1000]} lines = [] diff --git a/src/calibre/gui2/dialogs/metadata_bulk.py b/src/calibre/gui2/dialogs/metadata_bulk.py index d8a2a564bd..85d4758294 100644 --- a/src/calibre/gui2/dialogs/metadata_bulk.py +++ b/src/calibre/gui2/dialogs/metadata_bulk.py @@ -3,38 +3,47 @@ import numbers -import regex from collections import defaultdict, namedtuple from io import BytesIO -from qt.core import ( - QComboBox, QCompleter, QDateTime, QDialog, QDialogButtonBox, QFont, QGridLayout, - QInputDialog, QLabel, QLineEdit, QProgressBar, QSize, Qt, QVBoxLayout, pyqtSignal, -) from threading import Thread +import regex +from qt.core import ( + QComboBox, + QCompleter, + QDateTime, + QDialog, + QDialogButtonBox, + QFont, + QGridLayout, + QInputDialog, + QLabel, + QLineEdit, + QProgressBar, + QSize, + Qt, + QVBoxLayout, + pyqtSignal, +) + from calibre import human_readable, prints from calibre.constants import DEBUG from calibre.db import _get_next_series_num_for_list from calibre.ebooks.metadata import authors_to_string, string_to_authors, title_sort from calibre.ebooks.metadata.book.formatter import SafeFormat from calibre.ebooks.metadata.opf2 import OPF -from calibre.gui2 import ( - UNDEFINED_QDATETIME, FunctionDispatcher, error_dialog, gprefs, info_dialog, - question_dialog, -) +from calibre.gui2 import UNDEFINED_QDATETIME, FunctionDispatcher, error_dialog, gprefs, info_dialog, question_dialog from calibre.gui2.custom_column_widgets import populate_metadata_page from calibre.gui2.dialogs.metadata_bulk_ui import Ui_MetadataBulkDialog from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor -from calibre.gui2.widgets import ( - LineEditECM, setup_status_actions, update_status_actions, -) +from calibre.gui2.widgets import LineEditECM, setup_status_actions, update_status_actions from calibre.startup import connect_lambda from calibre.utils.config import JSONConfig, dynamic, prefs, tweaks from calibre.utils.date import internal_iso_format_string, qt_to_dt -from calibre.utils.icu import ( - capitalize, lower as icu_lower, sort_key, upper as icu_upper, -) +from calibre.utils.icu import capitalize, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper from calibre.utils.localization import ngettext from calibre.utils.titlecase import titlecase from polyglot.builtins import error_message, iteritems, itervalues, native_string_type @@ -321,9 +330,7 @@ class MyBlockingBusy(QDialog): # {{{ elif args.cover_action == 'trim': self.progress_next_step_range.emit(len(self.ids)) - from calibre.utils.img import ( - image_from_data, image_to_data, remove_borders_from_image, - ) + from calibre.utils.img import image_from_data, image_to_data, remove_borders_from_image for book_id in self.ids: cdata = cache.cover(book_id) if cdata: diff --git a/src/calibre/gui2/dialogs/multisort.py b/src/calibre/gui2/dialogs/multisort.py index c9cbbb3cb7..07cb1dbe7e 100644 --- a/src/calibre/gui2/dialogs/multisort.py +++ b/src/calibre/gui2/dialogs/multisort.py @@ -2,10 +2,7 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal -from qt.core import ( - QAbstractItemView, QDialogButtonBox, QInputDialog, QLabel, QListWidget, - QListWidgetItem, QMenu, QSize, Qt, QVBoxLayout -) +from qt.core import QAbstractItemView, QDialogButtonBox, QInputDialog, QLabel, QListWidget, QListWidgetItem, QMenu, QSize, Qt, QVBoxLayout from calibre import prepare_string_for_xml from calibre.gui2 import error_dialog diff --git a/src/calibre/gui2/dialogs/opml.py b/src/calibre/gui2/dialogs/opml.py index ed56731d26..16455967a0 100644 --- a/src/calibre/gui2/dialogs/opml.py +++ b/src/calibre/gui2/dialogs/opml.py @@ -7,15 +7,12 @@ __copyright__ = '2014, Kovid Goyal ' from collections import defaultdict, namedtuple from operator import itemgetter -from qt.core import ( - QDialog, QFormLayout, QHBoxLayout, QLineEdit, QToolButton, QIcon, - QDialogButtonBox, Qt, QSpinBox, QCheckBox) - from lxml import etree +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, QIcon, QLineEdit, QSpinBox, Qt, QToolButton from calibre.gui2 import choose_files, error_dialog -from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.icu import sort_key +from calibre.utils.xml_parse import safe_xml_fromstring Group = namedtuple('Group', 'title feeds') diff --git a/src/calibre/gui2/dialogs/palette.py b/src/calibre/gui2/dialogs/palette.py index f22a57697b..2becff51b1 100644 --- a/src/calibre/gui2/dialogs/palette.py +++ b/src/calibre/gui2/dialogs/palette.py @@ -5,16 +5,27 @@ import json import textwrap from contextlib import suppress + from qt.core import ( - QCheckBox, QComboBox, QDialog, QHBoxLayout, QIcon, QLabel, QPalette, QPushButton, - QScrollArea, QSize, QSizePolicy, QTabWidget, QVBoxLayout, QWidget, pyqtSignal, + QCheckBox, + QComboBox, + QDialog, + QHBoxLayout, + QIcon, + QLabel, + QPalette, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QTabWidget, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.gui2 import Application, choose_files, choose_save_file, gprefs -from calibre.gui2.palette import ( - default_dark_palette, default_light_palette, is_foreground_color, palette_colors, - palette_from_dict, -) +from calibre.gui2.palette import default_dark_palette, default_light_palette, is_foreground_color, palette_colors, palette_from_dict from calibre.gui2.widgets2 import ColorButton, Dialog diff --git a/src/calibre/gui2/dialogs/password.py b/src/calibre/gui2/dialogs/password.py index 47a3f02c9d..fece539d80 100644 --- a/src/calibre/gui2/dialogs/password.py +++ b/src/calibre/gui2/dialogs/password.py @@ -2,10 +2,11 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' import re + from qt.core import QDialog, QLineEdit, Qt -from calibre.gui2.dialogs.password_ui import Ui_Dialog from calibre.gui2 import dynamic +from calibre.gui2.dialogs.password_ui import Ui_Dialog class PasswordDialog(QDialog, Ui_Dialog): diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py index a05f49ed61..51787ea17f 100644 --- a/src/calibre/gui2/dialogs/plugin_updater.py +++ b/src/calibre/gui2/dialogs/plugin_updater.py @@ -8,21 +8,34 @@ __docformat__ = 'restructuredtext en' import datetime import re import traceback + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QAction, QBrush, QComboBox, QDialog, - QDialogButtonBox, QFont, QFrame, QHBoxLayout, QIcon, QLabel, QLineEdit, QModelIndex, - QSize, QSortFilterProxyModel, Qt, QTableView, QUrl, QVBoxLayout, + QAbstractItemView, + QAbstractTableModel, + QAction, + QBrush, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QFrame, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QModelIndex, + QSize, + QSortFilterProxyModel, + Qt, + QTableView, + QUrl, + QVBoxLayout, ) from calibre import prints -from calibre.constants import ( - DEBUG, __appname__, __version__, ismacos, iswindows, numeric_version, -) +from calibre.constants import DEBUG, __appname__, __version__, ismacos, iswindows, numeric_version from calibre.customize import PluginInstallationType -from calibre.customize.ui import ( - NameConflict, add_plugin, disable_plugin, enable_plugin, has_external_plugins, - initialized_plugins, is_disabled, remove_plugin, -) +from calibre.customize.ui import NameConflict, add_plugin, disable_plugin, enable_plugin, has_external_plugins, initialized_plugins, is_disabled, remove_plugin from calibre.gui2 import error_dialog, gprefs, info_dialog, open_url, question_dialog from calibre.gui2.preferences.plugins import ConfigWidget from calibre.utils.date import UNDEFINED_DATE, format_date diff --git a/src/calibre/gui2/dialogs/progress.py b/src/calibre/gui2/dialogs/progress.py index 03c998b2ba..dc662931ee 100644 --- a/src/calibre/gui2/dialogs/progress.py +++ b/src/calibre/gui2/dialogs/progress.py @@ -5,9 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' -from qt.core import ( - QDialog, pyqtSignal, Qt, QVBoxLayout, QLabel, QFont, QProgressBar, QSize, - QDialogButtonBox, QApplication, QFontMetrics, QHBoxLayout, QIcon) +from qt.core import QApplication, QDialog, QDialogButtonBox, QFont, QFontMetrics, QHBoxLayout, QIcon, QLabel, QProgressBar, QSize, Qt, QVBoxLayout, pyqtSignal from calibre.gui2 import elided_text, question_dialog from calibre.gui2.progress_indicator import ProgressIndicator diff --git a/src/calibre/gui2/dialogs/quickview.py b/src/calibre/gui2/dialogs/quickview.py index f1e0c633a2..ce6788c0a9 100644 --- a/src/calibre/gui2/dialogs/quickview.py +++ b/src/calibre/gui2/dialogs/quickview.py @@ -10,12 +10,25 @@ import traceback from functools import partial from qt.core import ( - Qt, QDialog, QAbstractItemView, QTableWidgetItem, QIcon, QListWidgetItem, - QCoreApplication, QEvent, QObject, QApplication, pyqtSignal, QMenu, - QShortcut, QTimer, QStyle) + QAbstractItemView, + QApplication, + QCoreApplication, + QDialog, + QEvent, + QIcon, + QListWidgetItem, + QMenu, + QObject, + QShortcut, + QStyle, + Qt, + QTableWidgetItem, + QTimer, + pyqtSignal, +) from calibre.customize.ui import find_plugin -from calibre.gui2 import gprefs, error_dialog +from calibre.gui2 import error_dialog, gprefs from calibre.gui2.dialogs.quickview_ui import Ui_Quickview from calibre.utils.date import timestampfromdt from calibre.utils.icu import sort_key diff --git a/src/calibre/gui2/dialogs/restore_library.py b/src/calibre/gui2/dialogs/restore_library.py index 46c75b4601..4997e9e1d8 100644 --- a/src/calibre/gui2/dialogs/restore_library.py +++ b/src/calibre/gui2/dialogs/restore_library.py @@ -2,13 +2,11 @@ # License: GPLv3 Copyright: 2011, Kovid Goyal -from qt.core import (QDialog, QLabel, QVBoxLayout, QDialogButtonBox, - QProgressBar, QSize, QTimer, pyqtSignal, Qt) +from qt.core import QDialog, QDialogButtonBox, QLabel, QProgressBar, QSize, Qt, QTimer, QVBoxLayout, pyqtSignal -from calibre.gui2 import (error_dialog, question_dialog, warning_dialog, - info_dialog) from calibre import force_unicode from calibre.constants import filesystem_encoding +from calibre.gui2 import error_dialog, info_dialog, question_dialog, warning_dialog class DBRestore(QDialog): diff --git a/src/calibre/gui2/dialogs/saved_search_editor.py b/src/calibre/gui2/dialogs/saved_search_editor.py index 1a8b83274c..f5fde04f51 100644 --- a/src/calibre/gui2/dialogs/saved_search_editor.py +++ b/src/calibre/gui2/dialogs/saved_search_editor.py @@ -2,16 +2,14 @@ # License: GPLv3 Copyright: 2008, Kovid Goyal -from qt.core import ( - QDialog, QDialogButtonBox, QFormLayout, QIcon, QLabel, QLineEdit, QListWidget, - QPlainTextEdit, Qt, QVBoxLayout, -) +from qt.core import QDialog, QDialogButtonBox, QFormLayout, QIcon, QLabel, QLineEdit, QListWidget, QPlainTextEdit, Qt, QVBoxLayout from calibre import prepare_string_for_xml from calibre.gui2 import error_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.widgets2 import Dialog -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key def commit_searches(searches): diff --git a/src/calibre/gui2/dialogs/scheduler.py b/src/calibre/gui2/dialogs/scheduler.py index 9009e7db9d..517e25ef4b 100644 --- a/src/calibre/gui2/dialogs/scheduler.py +++ b/src/calibre/gui2/dialogs/scheduler.py @@ -6,26 +6,55 @@ __docformat__ = 'restructuredtext en' Scheduler for automated recipe downloads ''' -from datetime import timedelta -import calendar, textwrap +import calendar +import textwrap from collections import OrderedDict from contextlib import suppress +from datetime import timedelta from qt.core import ( - QDialog, Qt, QTime, QObject, QMenu, QHBoxLayout, QAction, QIcon, QRecursiveMutex, - QTimer, pyqtSignal, QWidget, QGridLayout, QCheckBox, QTimeEdit, QLabel, - QLineEdit, QDoubleSpinBox, QSize, QTreeView, QSizePolicy, QToolButton, - QFrame, QVBoxLayout, QTabWidget, QSpacerItem, QGroupBox, - QRadioButton, QStackedWidget, QSpinBox, QPushButton, QDialogButtonBox + QAction, + QCheckBox, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFrame, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QMenu, + QObject, + QPushButton, + QRadioButton, + QRecursiveMutex, + QSize, + QSizePolicy, + QSpacerItem, + QSpinBox, + QStackedWidget, + Qt, + QTabWidget, + QTime, + QTimeEdit, + QTimer, + QToolButton, + QTreeView, + QVBoxLayout, + QWidget, + pyqtSignal, ) -from calibre.gui2 import config as gconf, error_dialog, gprefs -from calibre.gui2.search_box import SearchBox2 -from calibre.web.feeds.recipes.model import RecipeModel -from calibre.utils.date import utcnow -from calibre.utils.network import internet_connected from calibre import force_unicode -from calibre.utils.localization import get_lang, canonicalize_lang +from calibre.gui2 import config as gconf +from calibre.gui2 import error_dialog, gprefs +from calibre.gui2.search_box import SearchBox2 +from calibre.utils.date import utcnow +from calibre.utils.localization import canonicalize_lang, get_lang +from calibre.utils.network import internet_connected +from calibre.web.feeds.recipes.model import RecipeModel from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/dialogs/search.py b/src/calibre/gui2/dialogs/search.py index f5794fc335..106806538d 100644 --- a/src/calibre/gui2/dialogs/search.py +++ b/src/calibre/gui2/dialogs/search.py @@ -4,10 +4,27 @@ __copyright__ = '2008, Kovid Goyal ' import copy import re from datetime import date + from qt.core import ( - QComboBox, QDialog, QDialogButtonBox, QFormLayout, QFrame, QGroupBox, QHBoxLayout, - QIcon, QLabel, QLineEdit, QPushButton, QRadioButton, QSize, QSpinBox, Qt, - QTabWidget, QToolButton, QVBoxLayout, QWidget, + QComboBox, + QDialog, + QDialogButtonBox, + QFormLayout, + QFrame, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QPushButton, + QRadioButton, + QSize, + QSpinBox, + Qt, + QTabWidget, + QToolButton, + QVBoxLayout, + QWidget, ) from calibre import strftime diff --git a/src/calibre/gui2/dialogs/select_formats.py b/src/calibre/gui2/dialogs/select_formats.py index a17ae49995..49ec4fd96b 100644 --- a/src/calibre/gui2/dialogs/select_formats.py +++ b/src/calibre/gui2/dialogs/select_formats.py @@ -6,8 +6,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import QVBoxLayout, QDialog, QLabel, QDialogButtonBox, Qt, \ - QAbstractListModel, QListView, QSize, QApplication, QAbstractItemView +from qt.core import QAbstractItemView, QAbstractListModel, QApplication, QDialog, QDialogButtonBox, QLabel, QListView, QSize, Qt, QVBoxLayout from calibre.gui2 import file_icon_provider diff --git a/src/calibre/gui2/dialogs/show_category_note.py b/src/calibre/gui2/dialogs/show_category_note.py index 737312deb6..428357620c 100644 --- a/src/calibre/gui2/dialogs/show_category_note.py +++ b/src/calibre/gui2/dialogs/show_category_note.py @@ -2,10 +2,8 @@ # License: GPLv3 Copyright: 2023, Kovid Goyal import os -from qt.core import ( - QApplication, QByteArray, QDialog, QDialogButtonBox, QIcon, QLabel, QMimeData, - QSize, Qt, QTextDocument, QUrl, QVBoxLayout, -) + +from qt.core import QApplication, QByteArray, QDialog, QDialogButtonBox, QIcon, QLabel, QMimeData, QSize, Qt, QTextDocument, QUrl, QVBoxLayout from calibre import prepare_string_for_xml from calibre.db.constants import RESOURCE_URL_SCHEME diff --git a/src/calibre/gui2/dialogs/smartdevice.py b/src/calibre/gui2/dialogs/smartdevice.py index 2b0bd7d7bc..a47cd42745 100644 --- a/src/calibre/gui2/dialogs/smartdevice.py +++ b/src/calibre/gui2/dialogs/smartdevice.py @@ -3,7 +3,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from qt.core import (QDialog, QLineEdit, Qt) +from qt.core import QDialog, QLineEdit, Qt from calibre.gui2 import error_dialog from calibre.gui2.dialogs.smartdevice_ui import Ui_Dialog diff --git a/src/calibre/gui2/dialogs/tag_categories.py b/src/calibre/gui2/dialogs/tag_categories.py index 915f946926..ab591ba5c8 100644 --- a/src/calibre/gui2/dialogs/tag_categories.py +++ b/src/calibre/gui2/dialogs/tag_categories.py @@ -1,16 +1,16 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from collections import namedtuple, defaultdict +from collections import defaultdict, namedtuple + from qt.core import QApplication, QDialog, QIcon, QListWidgetItem, Qt from calibre.constants import islinux from calibre.gui2 import error_dialog, warning_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.tag_categories_ui import Ui_TagCategories -from calibre.utils.icu import ( - lower as icu_lower, primary_contains, primary_sort_key, strcmp, -) +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import primary_contains, primary_sort_key, strcmp class TagCategories(QDialog, Ui_TagCategories): diff --git a/src/calibre/gui2/dialogs/tag_editor.py b/src/calibre/gui2/dialogs/tag_editor.py index 1a979546ed..fdf90af097 100644 --- a/src/calibre/gui2/dialogs/tag_editor.py +++ b/src/calibre/gui2/dialogs/tag_editor.py @@ -1,9 +1,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -from qt.core import ( - QAbstractItemView, QDialog, QSortFilterProxyModel, QStringListModel, Qt, -) +from qt.core import QAbstractItemView, QDialog, QSortFilterProxyModel, QStringListModel, Qt from calibre.constants import islinux from calibre.gui2 import error_dialog, gprefs, question_dialog diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index afb6390b1e..b8c7f9ee13 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -7,14 +7,27 @@ from contextlib import contextmanager from functools import partial from qt.core import ( - QAbstractItemView, QAction, QApplication, QColor, QDialog, - QDialogButtonBox, QFrame, QIcon, QLabel, QMenu, QSize, QStyledItemDelegate, - Qt, QTableWidgetItem, QTimer, pyqtSignal, sip, + QAbstractItemView, + QAction, + QApplication, + QColor, + QDialog, + QDialogButtonBox, + QFrame, + QIcon, + QLabel, + QMenu, + QSize, + QStyledItemDelegate, + Qt, + QTableWidgetItem, + QTimer, + pyqtSignal, + sip, ) from calibre import sanitize_file_name -from calibre.gui2 import (error_dialog, gprefs, question_dialog, choose_files, - choose_save_file) +from calibre.gui2 import choose_files, choose_save_file, error_dialog, gprefs, question_dialog from calibre.gui2.actions.show_quickview import get_quickview_action_plugin from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.dialogs.confirm_delete import confirm @@ -22,10 +35,9 @@ from calibre.gui2.dialogs.tag_list_editor_table_widget import TleTableWidget from calibre.gui2.dialogs.tag_list_editor_ui import Ui_TagListEditor from calibre.gui2.widgets import EnLineEdit from calibre.utils.config import prefs -from calibre.utils.icu import ( - capitalize, contains, lower as icu_lower, primary_contains, primary_startswith, - upper as icu_upper, -) +from calibre.utils.icu import capitalize, contains, primary_contains, primary_startswith +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper from calibre.utils.titlecase import titlecase QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction' diff --git a/src/calibre/gui2/dialogs/tag_list_editor_table_widget.py b/src/calibre/gui2/dialogs/tag_list_editor_table_widget.py index 1075c222dc..a6bafda8f8 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor_table_widget.py +++ b/src/calibre/gui2/dialogs/tag_list_editor_table_widget.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2008, Kovid Goyal -from qt.core import (Qt, QTableWidget, pyqtSignal) +from qt.core import Qt, QTableWidget, pyqtSignal class TleTableWidget(QTableWidget): diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index add80773e2..f6aba1f406 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -11,28 +11,46 @@ import re import sys import traceback from functools import partial + from qt.core import ( - QAbstractItemView, QApplication, QColor, QComboBox, QCursor, QDialog, - QDialogButtonBox, QFont, QFontDatabase, QFontInfo, QFontMetrics, QIcon, QLineEdit, - QPalette, QSize, QSyntaxHighlighter, Qt, QTableWidget, QTableWidgetItem, - QTextCharFormat, QTextOption, QVBoxLayout, pyqtSignal, + QAbstractItemView, + QApplication, + QColor, + QComboBox, + QCursor, + QDialog, + QDialogButtonBox, + QFont, + QFontDatabase, + QFontInfo, + QFontMetrics, + QIcon, + QLineEdit, + QPalette, + QSize, + QSyntaxHighlighter, + Qt, + QTableWidget, + QTableWidgetItem, + QTextCharFormat, + QTextOption, + QVBoxLayout, + pyqtSignal, ) from calibre import sanitize_file_name from calibre.constants import config_dir from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.book.formatter import SafeFormat -from calibre.gui2 import ( - choose_files, choose_save_file, error_dialog, gprefs, pixmap_to_data, - question_dialog, -) +from calibre.gui2 import choose_files, choose_save_file, error_dialog, gprefs, pixmap_to_data, question_dialog from calibre.gui2.dialogs.template_dialog_ui import Ui_TemplateDialog from calibre.library.coloring import color_row_key, displayable_columns from calibre.utils.config_base import tweaks from calibre.utils.date import DEFAULT_DATE from calibre.utils.formatter import PythonTemplateContext, StopException from calibre.utils.formatter_functions import StoredObjectType, formatter_functions -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from calibre.utils.localization import localize_user_manual_link, ngettext from calibre.utils.resources import get_path as P diff --git a/src/calibre/gui2/dialogs/template_dialog_box_layout.py b/src/calibre/gui2/dialogs/template_dialog_box_layout.py index 91061ead42..ea8e13048f 100644 --- a/src/calibre/gui2/dialogs/template_dialog_box_layout.py +++ b/src/calibre/gui2/dialogs/template_dialog_box_layout.py @@ -4,7 +4,7 @@ Created on 20 Jan 2021 @author: Charles Haley ''' -from qt.core import (QBoxLayout) +from qt.core import QBoxLayout class BoxLayout(QBoxLayout): diff --git a/src/calibre/gui2/dialogs/template_dialog_code_widget.py b/src/calibre/gui2/dialogs/template_dialog_code_widget.py index a0eedd4981..196eaab1ee 100644 --- a/src/calibre/gui2/dialogs/template_dialog_code_widget.py +++ b/src/calibre/gui2/dialogs/template_dialog_code_widget.py @@ -7,10 +7,7 @@ Based on classes in calibre.gui2.tweak_book.editor License: GPLv3 Copyright: 2021, Kovid Goyal ''' -from qt.core import ( - QFont, QPainter, QPalette, QPlainTextEdit, QRect, Qt, QTextEdit, - QTextFormat, QTextCursor -) +from qt.core import QFont, QPainter, QPalette, QPlainTextEdit, QRect, Qt, QTextCursor, QTextEdit, QTextFormat from calibre.gui2.tweak_book.editor.text import LineNumbers from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color diff --git a/src/calibre/gui2/dialogs/trim_image.py b/src/calibre/gui2/dialogs/trim_image.py index c6842fc3db..0837b6629c 100644 --- a/src/calibre/gui2/dialogs/trim_image.py +++ b/src/calibre/gui2/dialogs/trim_image.py @@ -6,10 +6,8 @@ __copyright__ = '2013, Kovid Goyal ' import os import sys -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, QIcon, QKeySequence, - QLabel, QSize, QSpinBox, Qt, QToolBar, QVBoxLayout, -) + +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, QIcon, QKeySequence, QLabel, QSize, QSpinBox, Qt, QToolBar, QVBoxLayout from calibre.gui2 import gprefs from calibre.gui2.tweak_book.editor.canvas import Canvas diff --git a/src/calibre/gui2/dnd.py b/src/calibre/gui2/dnd.py index 1a2b5bba08..532321e0f1 100644 --- a/src/calibre/gui2/dnd.py +++ b/src/calibre/gui2/dnd.py @@ -8,12 +8,10 @@ __docformat__ = 'restructuredtext en' import os import posixpath import re -from qt.core import ( - QDialog, QDialogButtonBox, QImageReader, QLabel, QPixmap, QProgressBar, Qt, - QTimer, QUrl, QVBoxLayout -) -from threading import Thread from contextlib import suppress +from threading import Thread + +from qt.core import QDialog, QDialogButtonBox, QImageReader, QLabel, QPixmap, QProgressBar, Qt, QTimer, QUrl, QVBoxLayout from calibre import as_unicode, browser, prints from calibre.constants import DEBUG, iswindows diff --git a/src/calibre/gui2/ebook_download.py b/src/calibre/gui2/ebook_download.py index 1306c1a2bf..389bf7b02c 100644 --- a/src/calibre/gui2/ebook_download.py +++ b/src/calibre/gui2/ebook_download.py @@ -6,6 +6,7 @@ import os import shutil import time from contextlib import closing + from mechanize import MozillaCookieJar from calibre import browser diff --git a/src/calibre/gui2/email.py b/src/calibre/gui2/email.py index 77e36bcb74..894c69087b 100644 --- a/src/calibre/gui2/email.py +++ b/src/calibre/gui2/email.py @@ -12,12 +12,10 @@ import time from collections import defaultdict from functools import partial from itertools import repeat -from qt.core import ( - QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QPushButton, Qt, -) from threading import Thread +from qt.core import QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QLineEdit, QListWidget, QListWidgetItem, QPushButton, Qt + from calibre.constants import preferred_encoding from calibre.customize.ui import available_input_formats, available_output_formats from calibre.ebooks.metadata import authors_to_string @@ -27,9 +25,8 @@ from calibre.library.save_to_disk import get_components from calibre.utils.config import prefs, tweaks from calibre.utils.icu import primary_sort_key from calibre.utils.resources import get_image_path as I -from calibre.utils.smtp import ( - compose_mail, config as email_config, extract_email_address, sendmail, -) +from calibre.utils.smtp import compose_mail, extract_email_address, sendmail +from calibre.utils.smtp import config as email_config from polyglot.binary import from_hex_unicode from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/extra_files_watcher.py b/src/calibre/gui2/extra_files_watcher.py index 41b34a2462..0a933679cf 100644 --- a/src/calibre/gui2/extra_files_watcher.py +++ b/src/calibre/gui2/extra_files_watcher.py @@ -2,10 +2,11 @@ # License: GPLv3 Copyright: 2023, Kovid Goyal -from qt.core import QObject, QTimer from time import monotonic from typing import NamedTuple, Tuple +from qt.core import QObject, QTimer + from calibre.db.constants import DATA_FILE_PATTERN diff --git a/src/calibre/gui2/flow_toolbar.py b/src/calibre/gui2/flow_toolbar.py index 01ec3e1b97..013aa55515 100644 --- a/src/calibre/gui2/flow_toolbar.py +++ b/src/calibre/gui2/flow_toolbar.py @@ -2,10 +2,7 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal -from qt.core import ( - QPoint, QRect, QSize, QSizePolicy, QStyle, QStyleOption, QStylePainter, Qt, - QToolBar, QToolButton, QWidget, pyqtSignal -) +from qt.core import QPoint, QRect, QSize, QSizePolicy, QStyle, QStyleOption, QStylePainter, Qt, QToolBar, QToolButton, QWidget, pyqtSignal class Separator(QWidget): diff --git a/src/calibre/gui2/font_family_chooser.py b/src/calibre/gui2/font_family_chooser.py index 0d2ee0ece1..387785a6eb 100644 --- a/src/calibre/gui2/font_family_chooser.py +++ b/src/calibre/gui2/font_family_chooser.py @@ -7,11 +7,35 @@ __docformat__ = 'restructuredtext en' import os import shutil + from qt.core import ( - QAbstractItemView, QDialog, QDialogButtonBox, QFont, QFontComboBox, QFontDatabase, - QFontInfo, QFontMetrics, QGridLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, - QListView, QPen, QPushButton, QRawFont, QSize, QSizePolicy, QStringListModel, - QStyle, QStyledItemDelegate, Qt, QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QDialog, + QDialogButtonBox, + QFont, + QFontComboBox, + QFontDatabase, + QFontInfo, + QFontMetrics, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListView, + QPen, + QPushButton, + QRawFont, + QSize, + QSizePolicy, + QStringListModel, + QStyle, + QStyledItemDelegate, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.constants import config_dir diff --git a/src/calibre/gui2/fts/dialog.py b/src/calibre/gui2/fts/dialog.py index 0b62e63592..357a04c855 100644 --- a/src/calibre/gui2/fts/dialog.py +++ b/src/calibre/gui2/fts/dialog.py @@ -3,10 +3,8 @@ import os -from qt.core import ( - QAction, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QSize, QStackedWidget, Qt, - QVBoxLayout, -) + +from qt.core import QAction, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QSize, QStackedWidget, Qt, QVBoxLayout from calibre.gui2 import error_dialog, warning_dialog from calibre.gui2.fts.scan import ScanStatus diff --git a/src/calibre/gui2/fts/scan.py b/src/calibre/gui2/fts/scan.py index dea28d6f74..99a69911b5 100644 --- a/src/calibre/gui2/fts/scan.py +++ b/src/calibre/gui2/fts/scan.py @@ -2,10 +2,8 @@ # License: GPL v3 Copyright: 2022, Kovid Goyal import os -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QPushButton, - QRadioButton, QVBoxLayout, QWidget, pyqtSignal -) + +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QPushButton, QRadioButton, QVBoxLayout, QWidget, pyqtSignal from calibre.db.listeners import EventType from calibre.db.utils import IndexingProgress diff --git a/src/calibre/gui2/fts/search.py b/src/calibre/gui2/fts/search.py index 2c134715f5..d2689c031b 100644 --- a/src/calibre/gui2/fts/search.py +++ b/src/calibre/gui2/fts/search.py @@ -9,20 +9,39 @@ import traceback from contextlib import suppress from functools import partial from itertools import count -from qt.core import ( - QAbstractItemModel, QAbstractItemView, QAction, QCheckBox, QDialog, - QDialogButtonBox, QFont, QHBoxLayout, QIcon, QKeySequence, QLabel, QMenu, - QModelIndex, QPixmap, QPushButton, QRect, QSize, QSplitter, QStackedWidget, Qt, - QTreeView, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Event, Thread +from qt.core import ( + QAbstractItemModel, + QAbstractItemView, + QAction, + QCheckBox, + QDialog, + QDialogButtonBox, + QFont, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QMenu, + QModelIndex, + QPixmap, + QPushButton, + QRect, + QSize, + QSplitter, + QStackedWidget, + Qt, + QTreeView, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import fit_image, prepare_string_for_xml from calibre.db import FTSQueryError from calibre.ebooks.metadata import authors_to_string, fmt_sidx -from calibre.gui2 import ( - config, error_dialog, gprefs, info_dialog, question_dialog, safe_open_url, -) +from calibre.gui2 import config, error_dialog, gprefs, info_dialog, question_dialog, safe_open_url from calibre.gui2.fts.utils import get_db from calibre.gui2.library.models import render_pin from calibre.gui2.progress_indicator import ProgressIndicator diff --git a/src/calibre/gui2/geometry.py b/src/calibre/gui2/geometry.py index 91a3e5ab6d..12795e942d 100644 --- a/src/calibre/gui2/geometry.py +++ b/src/calibre/gui2/geometry.py @@ -6,7 +6,8 @@ # our own restore geometry -from qt.core import QRect, QScreen, QSize, QWidget, QApplication, Qt +from qt.core import QApplication, QRect, QScreen, QSize, Qt, QWidget + from calibre.constants import is_debugging as _is_debugging from calibre.utils.config_base import tweaks diff --git a/src/calibre/gui2/gestures.py b/src/calibre/gui2/gestures.py index 1b60d1951c..19198f2dc6 100644 --- a/src/calibre/gui2/gestures.py +++ b/src/calibre/gui2/gestures.py @@ -4,10 +4,8 @@ import os from functools import lru_cache -from qt.core import ( - QApplication, QEvent, QInputDevice, QMouseEvent, QObject, QPointF, QScroller, Qt, - pyqtSignal, -) + +from qt.core import QApplication, QEvent, QInputDevice, QMouseEvent, QObject, QPointF, QScroller, Qt, pyqtSignal from calibre.startup import connect_lambda from calibre.utils.monotonic import monotonic diff --git a/src/calibre/gui2/html_transform_rules.py b/src/calibre/gui2/html_transform_rules.py index 035b1a6293..bf632d0525 100644 --- a/src/calibre/gui2/html_transform_rules.py +++ b/src/calibre/gui2/html_transform_rules.py @@ -2,25 +2,18 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from qt.core import ( - QComboBox, QFrame, QHBoxLayout, QIcon, QLabel, QLineEdit, QPushButton, - QScrollArea, Qt, QToolButton, QVBoxLayout, QWidget, pyqtSignal -) +from qt.core import QComboBox, QFrame, QHBoxLayout, QIcon, QLabel, QLineEdit, QPushButton, QScrollArea, Qt, QToolButton, QVBoxLayout, QWidget, pyqtSignal from calibre import prepare_string_for_xml -from calibre.ebooks.html_transform_rules import ( - ACTION_MAP, MATCH_TYPE_MAP, export_rules, import_rules, transform_html, - validate_rule -) +from calibre.ebooks.html_transform_rules import ACTION_MAP, MATCH_TYPE_MAP, export_rules, import_rules, transform_html, validate_rule from calibre.gui2 import elided_text, error_dialog from calibre.gui2.convert.xpath_wizard import XPathEdit -from calibre.gui2.css_transform_rules import ( - RulesWidget as RulesWidgetBase, Tester as TesterBase -) -from calibre.gui2.tag_mapper import ( - RuleEditDialog as RuleEditDialogBase, RuleItem as RuleItemBase, - Rules as RulesBase, RulesDialog as RulesDialogBase -) +from calibre.gui2.css_transform_rules import RulesWidget as RulesWidgetBase +from calibre.gui2.css_transform_rules import Tester as TesterBase +from calibre.gui2.tag_mapper import RuleEditDialog as RuleEditDialogBase +from calibre.gui2.tag_mapper import RuleItem as RuleItemBase +from calibre.gui2.tag_mapper import Rules as RulesBase +from calibre.gui2.tag_mapper import RulesDialog as RulesDialogBase # Classes for rule edit widget {{{ diff --git a/src/calibre/gui2/icon_theme.py b/src/calibre/gui2/icon_theme.py index e33b583354..aa94005d13 100644 --- a/src/calibre/gui2/icon_theme.py +++ b/src/calibre/gui2/icon_theme.py @@ -17,23 +17,50 @@ from functools import lru_cache from io import BytesIO from itertools import count from multiprocessing.pool import ThreadPool -from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, - QFormLayout, QGroupBox, QHBoxLayout, QIcon, QImage, QImageReader, - QItemSelectionModel, QLabel, QLineEdit, QListWidget, QListWidgetItem, QPen, QPixmap, - QProgressDialog, QSize, QSpinBox, QSplitter, QStackedLayout, QStaticText, QStyle, - QStyledItemDelegate, Qt, QTabWidget, QTextEdit, QVBoxLayout, QWidget, pyqtSignal, - sip, -) from threading import Event, Thread -from calibre import detect_ncpus as cpu_count, fit_image, human_readable, walk +from qt.core import ( + QAbstractItemView, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QFormLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QImage, + QImageReader, + QItemSelectionModel, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QPen, + QPixmap, + QProgressDialog, + QSize, + QSpinBox, + QSplitter, + QStackedLayout, + QStaticText, + QStyle, + QStyledItemDelegate, + Qt, + QTabWidget, + QTextEdit, + QVBoxLayout, + QWidget, + pyqtSignal, + sip, +) + +from calibre import detect_ncpus as cpu_count +from calibre import fit_image, human_readable, walk from calibre.constants import cache_dir from calibre.customize.ui import interface_actions -from calibre.gui2 import ( - choose_dir, choose_save_file, empty_index, error_dialog, gprefs, - icon_resource_manager, must_use_qt, safe_open_url, -) +from calibre.gui2 import choose_dir, choose_save_file, empty_index, error_dialog, gprefs, icon_resource_manager, must_use_qt, safe_open_url from calibre.gui2.dialogs.progress import ProgressDialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.widgets2 import Dialog @@ -42,7 +69,8 @@ from calibre.utils.filenames import ascii_filename, atomic_rename from calibre.utils.https import HTTPError, get_https_resource_securely from calibre.utils.icu import numeric_sort_key as sort_key from calibre.utils.img import Canvas, image_from_data, optimize_jpeg, optimize_png -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from calibre.utils.zipfile import ZIP_STORED, ZipFile from polyglot import http_client from polyglot.builtins import as_bytes, iteritems, reraise diff --git a/src/calibre/gui2/image_popup.py b/src/calibre/gui2/image_popup.py index 2af9eb4d88..161dfa0890 100644 --- a/src/calibre/gui2/image_popup.py +++ b/src/calibre/gui2/image_popup.py @@ -6,15 +6,31 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' from qt.core import ( - QApplication, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, QImage, - QLabel, QPainter, QPalette, QPixmap, QScrollArea, QSize, QSizePolicy, - Qt, QTransform, QUrl, QVBoxLayout, pyqtSignal, QAction, QKeySequence + QAction, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QHBoxLayout, + QIcon, + QImage, + QKeySequence, + QLabel, + QPainter, + QPalette, + QPixmap, + QScrollArea, + QSize, + QSizePolicy, + Qt, + QTransform, + QUrl, + QVBoxLayout, + pyqtSignal, ) from calibre import fit_image -from calibre.gui2 import ( - NO_URL_FORMATTING, choose_save_file, gprefs, max_available_height -) +from calibre.gui2 import NO_URL_FORMATTING, choose_save_file, gprefs, max_available_height def render_svg(widget, path): diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index b7d2a09c34..ee3b4e7758 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -6,10 +6,26 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import functools + from qt.core import ( - QAction, QApplication, QDialog, QEvent, QIcon, QLabel, QMenu, QPixmap, - QStackedWidget, QStatusBar, QStyle, QStyleOption, QStylePainter, Qt, QTabBar, - QTimer, QToolButton, QUrl, + QAction, + QApplication, + QDialog, + QEvent, + QIcon, + QLabel, + QMenu, + QPixmap, + QStackedWidget, + QStatusBar, + QStyle, + QStyleOption, + QStylePainter, + Qt, + QTabBar, + QTimer, + QToolButton, + QUrl, ) from calibre.constants import get_appname_for_display, get_version, ismacos diff --git a/src/calibre/gui2/job_indicator.py b/src/calibre/gui2/job_indicator.py index a87e55b38a..504867a409 100644 --- a/src/calibre/gui2/job_indicator.py +++ b/src/calibre/gui2/job_indicator.py @@ -5,10 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import ( - QAbstractAnimation, QBrush, QColor, QEasingCurve, QPainter, QPainterPath, - QPalette, QPoint, QPointF, QPropertyAnimation, QRect, Qt, QWidget -) +from qt.core import QAbstractAnimation, QBrush, QColor, QEasingCurve, QPainter, QPainterPath, QPalette, QPoint, QPointF, QPropertyAnimation, QRect, Qt, QWidget from calibre.gui2 import config diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py index 6b1368e94e..4ee717eb05 100644 --- a/src/calibre/gui2/jobs.py +++ b/src/calibre/gui2/jobs.py @@ -10,12 +10,37 @@ Job management. ''' import time + from qt.core import ( - QAbstractItemDelegate, QAbstractTableModel, QAction, QApplication, QByteArray, - QCoreApplication, QDialog, QDialogButtonBox, QEvent, QHBoxLayout, QIcon, - QItemSelectionModel, QLabel, QModelIndex, QPlainTextEdit, QSize, QSizePolicy, - QSortFilterProxyModel, QStyle, QStyleOption, QStyleOptionProgressBar, QStylePainter, - Qt, QTextBrowser, QTimer, QToolTip, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemDelegate, + QAbstractTableModel, + QAction, + QApplication, + QByteArray, + QCoreApplication, + QDialog, + QDialogButtonBox, + QEvent, + QHBoxLayout, + QIcon, + QItemSelectionModel, + QLabel, + QModelIndex, + QPlainTextEdit, + QSize, + QSizePolicy, + QSortFilterProxyModel, + QStyle, + QStyleOption, + QStyleOptionProgressBar, + QStylePainter, + Qt, + QTextBrowser, + QTimer, + QToolTip, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import __appname__, as_unicode, strftime diff --git a/src/calibre/gui2/keyboard.py b/src/calibre/gui2/keyboard.py index 0eb9ce1056..83f32662ca 100644 --- a/src/calibre/gui2/keyboard.py +++ b/src/calibre/gui2/keyboard.py @@ -8,19 +8,47 @@ __docformat__ = 'restructuredtext en' from collections import OrderedDict from functools import partial -from qt.core import (QObject, QKeySequence, QAbstractItemModel, QModelIndex, QItemSelectionModel, - Qt, QStyledItemDelegate, QTextDocument, QStyle, pyqtSignal, QFrame, QAbstractItemView, QMenu, - QApplication, QSize, QRectF, QWidget, QTreeView, QHBoxLayout, QVBoxLayout, QAbstractItemDelegate, - QGridLayout, QLabel, QRadioButton, QPushButton, QToolButton, QIcon, QEvent, sip, QKeyCombination) +from qt.core import ( + QAbstractItemDelegate, + QAbstractItemModel, + QAbstractItemView, + QApplication, + QEvent, + QFrame, + QGridLayout, + QHBoxLayout, + QIcon, + QItemSelectionModel, + QKeyCombination, + QKeySequence, + QLabel, + QMenu, + QModelIndex, + QObject, + QPushButton, + QRadioButton, + QRectF, + QSize, + QStyle, + QStyledItemDelegate, + Qt, + QTextDocument, + QToolButton, + QTreeView, + QVBoxLayout, + QWidget, + pyqtSignal, + sip, +) -from calibre.utils.config import JSONConfig +from calibre import prepare_string_for_xml, prints from calibre.constants import DEBUG -from calibre import prints, prepare_string_for_xml -from calibre.utils.icu import sort_key, lower from calibre.gui2 import error_dialog, info_dialog -from calibre.utils.localization import pgettext -from calibre.utils.search_query_parser import SearchQueryParser, ParseException from calibre.gui2.search_box import SearchBox2 +from calibre.utils.config import JSONConfig +from calibre.utils.icu import lower, sort_key +from calibre.utils.localization import pgettext +from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import iteritems, itervalues ROOT = QModelIndex() diff --git a/src/calibre/gui2/languages.py b/src/calibre/gui2/languages.py index 0da571560f..f859bb2867 100644 --- a/src/calibre/gui2/languages.py +++ b/src/calibre/gui2/languages.py @@ -6,10 +6,11 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' from qt.core import QComboBox + from calibre.gui2 import gui_prefs from calibre.gui2.complete2 import EditWithComplete +from calibre.utils.icu import lower, sort_key from calibre.utils.localization import lang_map_for_ui -from calibre.utils.icu import sort_key, lower from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index c4a167f7cc..86b85ccfb7 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -6,9 +6,23 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' from functools import partial + from qt.core import ( - QActionGroup, QCoreApplication, QFrame, QHBoxLayout, QIcon, QLabel, QLineEdit, - QMenu, QObject, QSizePolicy, Qt, QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QActionGroup, + QCoreApplication, + QFrame, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QMenu, + QObject, + QSizePolicy, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import human_readable diff --git a/src/calibre/gui2/layout_menu.py b/src/calibre/gui2/layout_menu.py index 01c05720ba..75edc9f371 100644 --- a/src/calibre/gui2/layout_menu.py +++ b/src/calibre/gui2/layout_menu.py @@ -2,10 +2,7 @@ # License: GPLv3 Copyright: 2017, Kovid Goyal -from qt.core import ( - QFontMetrics, QHBoxLayout, QIcon, QMenu, QStylePainter, QPushButton, QSize, - QSizePolicy, Qt, QWidget, QStyleOption, QStyle) - +from qt.core import QFontMetrics, QHBoxLayout, QIcon, QMenu, QPushButton, QSize, QSizePolicy, QStyle, QStyleOption, QStylePainter, Qt, QWidget ICON_SZ = 64 diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index cd0fee3c3a..69086f512d 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -5,25 +5,59 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import itertools -from io import BytesIO import math import operator import os import weakref from collections import namedtuple from functools import wraps -from PIL import Image -from qt.core import ( - QAbstractItemView, QApplication, QBuffer, QByteArray, QColor, QDrag, QEasingCurve, - QEvent, QFont, QHelpEvent, QIcon, QImage, QIODevice, QItemSelection, - QItemSelectionModel, QListView, QMimeData, QModelIndex, QPainter, QPalette, QPixmap, - QPoint, QPropertyAnimation, QRect, QSize, QStyledItemDelegate, QStyleOptionViewItem, - Qt, QTableView, QTimer, QToolTip, QTreeView, QUrl, pyqtProperty, pyqtSignal, - pyqtSlot, qBlue, qGreen, qRed, -) +from io import BytesIO from textwrap import wrap from threading import Event, Thread +from PIL import Image +from qt.core import ( + QAbstractItemView, + QApplication, + QBuffer, + QByteArray, + QColor, + QDrag, + QEasingCurve, + QEvent, + QFont, + QHelpEvent, + QIcon, + QImage, + QIODevice, + QItemSelection, + QItemSelectionModel, + QListView, + QMimeData, + QModelIndex, + QPainter, + QPalette, + QPixmap, + QPoint, + QPropertyAnimation, + QRect, + QSize, + QStyledItemDelegate, + QStyleOptionViewItem, + Qt, + QTableView, + QTimer, + QToolTip, + QTreeView, + QUrl, + pyqtProperty, + pyqtSignal, + pyqtSlot, + qBlue, + qGreen, + qRed, +) + from calibre import fit_image, human_readable, prepare_string_for_xml from calibre.constants import DEBUG, config_dir, islinux from calibre.ebooks.metadata import fmt_sidx, rating_to_stars diff --git a/src/calibre/gui2/library/annotations.py b/src/calibre/gui2/library/annotations.py index 0a53a414c9..2ef18eb728 100644 --- a/src/calibre/gui2/library/annotations.py +++ b/src/calibre/gui2/library/annotations.py @@ -6,25 +6,45 @@ import json import os import re from functools import lru_cache, partial -from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QComboBox, QDateTime, QDialog, - QDialogButtonBox, QFont, QFormLayout, QFrame, QHBoxLayout, QIcon, QKeySequence, - QLabel, QLocale, QMenu, QPalette, QPlainTextEdit, QSize, QSplitter, Qt, - QTextBrowser, QTimer, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, - QWidget, pyqtSignal, -) from urllib.parse import quote -from calibre import prepare_string_for_xml -from calibre.constants import ( - builtin_colors_dark, builtin_colors_light, builtin_decorations, +from qt.core import ( + QAbstractItemView, + QApplication, + QCheckBox, + QComboBox, + QDateTime, + QDialog, + QDialogButtonBox, + QFont, + QFormLayout, + QFrame, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QLocale, + QMenu, + QPalette, + QPlainTextEdit, + QSize, + QSplitter, + Qt, + QTextBrowser, + QTimer, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, ) + +from calibre import prepare_string_for_xml +from calibre.constants import builtin_colors_dark, builtin_colors_light, builtin_decorations from calibre.db.backend import FTSQueryError from calibre.ebooks.metadata import authors_to_string, fmt_sidx -from calibre.gui2 import ( - Application, choose_save_file, config, error_dialog, gprefs, is_dark_theme, - safe_open_url, -) +from calibre.gui2 import Application, choose_save_file, config, error_dialog, gprefs, is_dark_theme, safe_open_url from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.viewer.widgets import ResultsDelegate, SearchBox from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/library/caches.py b/src/calibre/gui2/library/caches.py index 4fc79f7b11..9d85bb3508 100644 --- a/src/calibre/gui2/library/caches.py +++ b/src/calibre/gui2/library/caches.py @@ -4,8 +4,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from threading import Lock, current_thread from collections import OrderedDict +from threading import Lock, current_thread from qt.core import QImage, QPixmap diff --git a/src/calibre/gui2/library/delegates.py b/src/calibre/gui2/library/delegates.py index a83465682d..39718265b7 100644 --- a/src/calibre/gui2/library/delegates.py +++ b/src/calibre/gui2/library/delegates.py @@ -8,12 +8,35 @@ __docformat__ = 'restructuredtext en' import os import sys from datetime import datetime + from qt.core import ( - QAbstractTextDocumentLayout, QApplication, QComboBox, QDate, QDateTime, - QDateTimeEdit, QDialog, QDoubleSpinBox, QEvent, QFont, QFontInfo, QIcon, - QKeySequence, QLineEdit, QLocale, QMenu, QPalette, QSize, QSpinBox, QStyle, - QStyledItemDelegate, QStyleOptionComboBox, QStyleOptionSpinBox, - QStyleOptionViewItem, Qt, QTextDocument, QUrl, + QAbstractTextDocumentLayout, + QApplication, + QComboBox, + QDate, + QDateTime, + QDateTimeEdit, + QDialog, + QDoubleSpinBox, + QEvent, + QFont, + QFontInfo, + QIcon, + QKeySequence, + QLineEdit, + QLocale, + QMenu, + QPalette, + QSize, + QSpinBox, + QStyle, + QStyledItemDelegate, + QStyleOptionComboBox, + QStyleOptionSpinBox, + QStyleOptionViewItem, + Qt, + QTextDocument, + QUrl, ) from calibre.constants import iswindows @@ -25,16 +48,11 @@ from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.languages import LanguagesEdit from calibre.gui2.markdown_editor import MarkdownEditDialog from calibre.gui2.widgets import EnLineEdit -from calibre.gui2.widgets2 import ( - DateTimeEdit as DateTimeEditBase, RatingEditor, - populate_standard_spinbox_context_menu, -) +from calibre.gui2.widgets2 import DateTimeEdit as DateTimeEditBase +from calibre.gui2.widgets2 import RatingEditor, populate_standard_spinbox_context_menu from calibre.library.comments import markdown from calibre.utils.config import tweaks -from calibre.utils.date import ( - format_date, internal_iso_format_string, is_date_undefined, now, qt_from_dt, - qt_to_dt, -) +from calibre.utils.date import format_date, internal_iso_format_string, is_date_undefined, now, qt_from_dt, qt_to_dt from calibre.utils.icu import sort_key diff --git a/src/calibre/gui2/library/models.py b/src/calibre/gui2/library/models.py index 77b99d2e6d..95d02f39c7 100644 --- a/src/calibre/gui2/library/models.py +++ b/src/calibre/gui2/library/models.py @@ -14,17 +14,11 @@ import time import traceback from collections import defaultdict, namedtuple from itertools import groupby -from qt.core import ( - QAbstractTableModel, QApplication, QColor, QFont, QFontMetrics, QIcon, QImage, - QModelIndex, QPainter, QPixmap, Qt, pyqtSignal, -) -from calibre import ( - fit_image, human_readable, isbytestring, prepare_string_for_xml, strftime, -) -from calibre.constants import ( - DEBUG, config_dir, dark_link_color, filesystem_encoding -) +from qt.core import QAbstractTableModel, QApplication, QColor, QFont, QFontMetrics, QIcon, QImage, QModelIndex, QPainter, QPixmap, Qt, pyqtSignal + +from calibre import fit_image, human_readable, isbytestring, prepare_string_for_xml, strftime +from calibre.constants import DEBUG, config_dir, dark_link_color, filesystem_encoding from calibre.db.search import CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH, _match from calibre.db.utils import force_to_bool from calibre.ebooks.metadata import authors_to_string, fmt_sidx, string_to_authors @@ -35,9 +29,7 @@ from calibre.library.coloring import color_row_key from calibre.library.save_to_disk import find_plugboard from calibre.ptempfile import PersistentTemporaryFile from calibre.utils.config import device_prefs, prefs, tweaks -from calibre.utils.date import ( - UNDEFINED_DATE, dt_factory, is_date_undefined, qt_from_dt, qt_to_dt, -) +from calibre.utils.date import UNDEFINED_DATE, dt_factory, is_date_undefined, qt_from_dt, qt_to_dt from calibre.utils.icu import sort_key from calibre.utils.localization import calibre_langcode_to_name, ngettext from calibre.utils.resources import get_path as P diff --git a/src/calibre/gui2/library/notes.py b/src/calibre/gui2/library/notes.py index 963b804f52..2988b17fa2 100644 --- a/src/calibre/gui2/library/notes.py +++ b/src/calibre/gui2/library/notes.py @@ -3,10 +3,29 @@ import os from functools import partial + from qt.core import ( - QAbstractItemView, QCheckBox, QDialog, QDialogButtonBox, QFont, QHBoxLayout, QIcon, - QKeySequence, QLabel, QMenu, QPushButton, QSize, QSplitter, Qt, QTimer, QToolButton, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QCheckBox, + QDialog, + QDialogButtonBox, + QFont, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QMenu, + QPushButton, + QSize, + QSplitter, + Qt, + QTimer, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import sanitize_file_name diff --git a/src/calibre/gui2/library/views.py b/src/calibre/gui2/library/views.py index 99eb8f8184..2d60f4cdfb 100644 --- a/src/calibre/gui2/library/views.py +++ b/src/calibre/gui2/library/views.py @@ -9,29 +9,62 @@ import itertools import operator from collections import OrderedDict from functools import partial + from qt.core import ( - QAbstractItemView, QDialog, QDialogButtonBox, QDrag, QEvent, QFont, QFontMetrics, - QGridLayout, QHeaderView, QIcon, QItemSelection, QItemSelectionModel, QLabel, QMenu, - QMimeData, QModelIndex, QPoint, QPushButton, QSize, QSpinBox, QStyle, - QStyleOptionHeader, Qt, QTableView, QTimer, QUrl, pyqtSignal, + QAbstractItemView, + QDialog, + QDialogButtonBox, + QDrag, + QEvent, + QFont, + QFontMetrics, + QGridLayout, + QHeaderView, + QIcon, + QItemSelection, + QItemSelectionModel, + QLabel, + QMenu, + QMimeData, + QModelIndex, + QPoint, + QPushButton, + QSize, + QSpinBox, + QStyle, + QStyleOptionHeader, + Qt, + QTableView, + QTimer, + QUrl, + pyqtSignal, ) from calibre import force_unicode from calibre.constants import filesystem_encoding, islinux -from calibre.gui2 import ( - BOOK_DETAILS_DISPLAY_DEBOUNCE_DELAY, FunctionDispatcher, error_dialog, gprefs, -) +from calibre.gui2 import BOOK_DETAILS_DISPLAY_DEBOUNCE_DELAY, FunctionDispatcher, error_dialog, gprefs from calibre.gui2.dialogs.enum_values_edit import EnumValuesEdit from calibre.gui2.gestures import GestureManager from calibre.gui2.library import DEFAULT_SORT -from calibre.gui2.library.alternate_views import ( - AlternateViews, handle_enter_press, setup_dnd_interface, -) +from calibre.gui2.library.alternate_views import AlternateViews, handle_enter_press, setup_dnd_interface from calibre.gui2.library.delegates import ( - CcBoolDelegate, CcCommentsDelegate, CcDateDelegate, CcEnumDelegate, - CcLongTextDelegate, CcMarkdownDelegate, CcNumberDelegate, CcSeriesDelegate, - CcTemplateDelegate, CcTextDelegate, CompleteDelegate, DateDelegate, - LanguagesDelegate, PubDateDelegate, RatingDelegate, SeriesDelegate, TextDelegate, + CcBoolDelegate, + CcCommentsDelegate, + CcDateDelegate, + CcEnumDelegate, + CcLongTextDelegate, + CcMarkdownDelegate, + CcNumberDelegate, + CcSeriesDelegate, + CcTemplateDelegate, + CcTextDelegate, + CompleteDelegate, + DateDelegate, + LanguagesDelegate, + PubDateDelegate, + RatingDelegate, + SeriesDelegate, + TextDelegate, ) from calibre.gui2.library.models import BooksModel, DeviceBooksModel from calibre.gui2.pin_columns import PinTableView diff --git a/src/calibre/gui2/listener.py b/src/calibre/gui2/listener.py index 557165c83b..babf5a0f56 100644 --- a/src/calibre/gui2/listener.py +++ b/src/calibre/gui2/listener.py @@ -7,9 +7,8 @@ import socket from contextlib import closing from functools import partial from itertools import count -from qt.core import ( - QAbstractSocket, QByteArray, QLocalServer, QLocalSocket, pyqtSignal -) + +from qt.core import QAbstractSocket, QByteArray, QLocalServer, QLocalSocket, pyqtSignal from calibre.utils.ipc import gui_socket_address diff --git a/src/calibre/gui2/lrf_renderer/document.py b/src/calibre/gui2/lrf_renderer/document.py index 54a80a59ac..bd65174ccc 100644 --- a/src/calibre/gui2/lrf_renderer/document.py +++ b/src/calibre/gui2/lrf_renderer/document.py @@ -4,12 +4,11 @@ __copyright__ = '2008, Kovid Goyal ' import collections import glob import itertools -from qt.core import ( - QBrush, QByteArray, QColor, QFontDatabase, QGraphicsItem, QGraphicsLineItem, - QGraphicsRectItem, QGraphicsScene, QPen, Qt, pyqtSignal, -) -from calibre.ebooks.lrf.objects import Canvas as __Canvas, RuledLine as _RuledLine +from qt.core import QBrush, QByteArray, QColor, QFontDatabase, QGraphicsItem, QGraphicsLineItem, QGraphicsRectItem, QGraphicsScene, QPen, Qt, pyqtSignal + +from calibre.ebooks.lrf.objects import Canvas as __Canvas +from calibre.ebooks.lrf.objects import RuledLine as _RuledLine from calibre.gui2.lrf_renderer.text import COLOR, FontLoader, PixmapItem, TextBlock from calibre.utils.resources import get_path as P diff --git a/src/calibre/gui2/lrf_renderer/main.py b/src/calibre/gui2/lrf_renderer/main.py index b3fb4405b2..15af0abb16 100644 --- a/src/calibre/gui2/lrf_renderer/main.py +++ b/src/calibre/gui2/lrf_renderer/main.py @@ -1,23 +1,22 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, logging, os, traceback, time +import logging +import os +import sys +import time +import traceback -from qt.core import ( - QKeySequence, QPainter, QDialog, QSpinBox, QSlider, QIcon, Qt, QCoreApplication, QThread, QScrollBar) +from qt.core import QCoreApplication, QDialog, QIcon, QKeySequence, QPainter, QScrollBar, QSlider, QSpinBox, Qt, QThread -from calibre import __appname__, setup_cli_handlers, islinux, isbsd, as_unicode -from calibre.gui2 import gprefs +from calibre import __appname__, as_unicode, isbsd, islinux, setup_cli_handlers from calibre.ebooks.lrf.lrfparser import LRFDocument - -from calibre.gui2 import ( - error_dialog, choose_files, Application - ) +from calibre.gui2 import Application, choose_files, error_dialog, gprefs from calibre.gui2.dialogs.conversion_error import ConversionErrorDialog -from calibre.gui2.lrf_renderer.main_ui import Ui_MainWindow from calibre.gui2.lrf_renderer.config_ui import Ui_ViewerConfig -from calibre.gui2.main_window import MainWindow from calibre.gui2.lrf_renderer.document import Document +from calibre.gui2.lrf_renderer.main_ui import Ui_MainWindow +from calibre.gui2.main_window import MainWindow from calibre.gui2.search_box import SearchBox2 diff --git a/src/calibre/gui2/lrf_renderer/text.py b/src/calibre/gui2/lrf_renderer/text.py index 3c553079ad..53ab890a58 100644 --- a/src/calibre/gui2/lrf_renderer/text.py +++ b/src/calibre/gui2/lrf_renderer/text.py @@ -1,16 +1,20 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import sys, collections, operator, copy, re, numbers +import collections +import copy +import numbers +import operator +import re +import sys -from qt.core import ( - Qt, QRectF, QFont, QColor, QPixmap, QGraphicsPixmapItem, QGraphicsItem, - QFontMetrics, QPen, QBrush, QGraphicsRectItem) +from qt.core import QBrush, QColor, QFont, QFontMetrics, QGraphicsItem, QGraphicsPixmapItem, QGraphicsRectItem, QPen, QPixmap, QRectF, Qt -from calibre.ebooks.lrf.fonts import LIBERATION_FONT_MAP from calibre.ebooks.hyphenate import hyphenate_word +from calibre.ebooks.lrf.fonts import LIBERATION_FONT_MAP from polyglot.builtins import string_or_bytes + def WEIGHT_MAP(wt): return int(wt / 10 - 1) def NULL(a, b): diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 54f849fc0f..5b3966c35a 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -2,23 +2,18 @@ # License: GPLv3 Copyright: 2015, Kovid Goyal -import apsw import os import re import sys import time import traceback + +import apsw from qt.core import QCoreApplication, QIcon, QObject, QTimer from calibre import force_unicode, prints -from calibre.constants import ( - DEBUG, MAIN_APP_UID, __appname__, filesystem_encoding, get_portable_base, islinux, - ismacos, iswindows, -) -from calibre.gui2 import ( - Application, choose_dir, error_dialog, gprefs, initialize_file_icon_provider, - question_dialog, setup_gui_option_parser, timed_print, -) +from calibre.constants import DEBUG, MAIN_APP_UID, __appname__, filesystem_encoding, get_portable_base, islinux, ismacos, iswindows +from calibre.gui2 import Application, choose_dir, error_dialog, gprefs, initialize_file_icon_provider, question_dialog, setup_gui_option_parser, timed_print from calibre.gui2.listener import send_message_in_process from calibre.gui2.main_window import option_parser as _option_parser from calibre.gui2.splash_screen import SplashScreen diff --git a/src/calibre/gui2/main_window.py b/src/calibre/gui2/main_window.py index e6e8e8798a..fae1b3f9d3 100644 --- a/src/calibre/gui2/main_window.py +++ b/src/calibre/gui2/main_window.py @@ -2,13 +2,12 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal ' -import gc, os +import gc +import os import sys import weakref -from qt.core import ( - QAction, QIcon, QKeySequence, QMainWindow, QMenu, QMenuBar, QObject, Qt, QTimer, - pyqtSignal -) + +from qt.core import QAction, QIcon, QKeySequence, QMainWindow, QMenu, QMenuBar, QObject, Qt, QTimer, pyqtSignal from calibre import as_unicode, prepare_string_for_xml, prints from calibre.constants import iswindows @@ -137,8 +136,9 @@ class MainWindow(QMainWindow): def show_possible_sharing_violation(self, e: Exception, det_msg: str = '') -> bool: if not iswindows or not isinstance(e, OSError): return False - from calibre_extensions import winutil import errno + + from calibre_extensions import winutil if not (e.winerror == winutil.ERROR_SHARING_VIOLATION or e.errno == errno.EACCES or isinstance(e, PermissionError)): return False msg = getattr(e, 'locking_violation_msg', '') diff --git a/src/calibre/gui2/markdown_editor.py b/src/calibre/gui2/markdown_editor.py index 3d101cd8b2..52ff74fa28 100644 --- a/src/calibre/gui2/markdown_editor.py +++ b/src/calibre/gui2/markdown_editor.py @@ -2,12 +2,10 @@ # License: GPLv3 Copyright: 2023, un_pogaz import os -from qt.core import ( - QDialog, QDialogButtonBox, QPlainTextEdit, QSize, Qt, QTabWidget, QUrl, - QVBoxLayout, QWidget, pyqtSignal, -) -from calibre.gui2 import safe_open_url, gprefs +from qt.core import QDialog, QDialogButtonBox, QPlainTextEdit, QSize, Qt, QTabWidget, QUrl, QVBoxLayout, QWidget, pyqtSignal + +from calibre.gui2 import gprefs, safe_open_url from calibre.gui2.book_details import resolved_css from calibre.gui2.widgets2 import HTMLDisplay from calibre.library.comments import markdown as get_markdown diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py index 693f43d6b9..aef2ef48f3 100644 --- a/src/calibre/gui2/markdown_syntax_highlighter.py +++ b/src/calibre/gui2/markdown_syntax_highlighter.py @@ -3,10 +3,8 @@ import re -from qt.core import ( - QApplication, QBrush, QColor, QFont, QSyntaxHighlighter, QTextCharFormat, - QTextCursor, QTextLayout, -) + +from qt.core import QApplication, QBrush, QColor, QFont, QSyntaxHighlighter, QTextCharFormat, QTextCursor, QTextLayout from calibre.gui2.palette import dark_link_color, light_link_color diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index c7ee6ecc80..74d2f13973 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -11,11 +11,35 @@ import shutil import textwrap import weakref from datetime import date, datetime + from qt.core import ( - QAbstractItemView, QAction, QApplication, QComboBox, QDateTime, QDialog, - QDialogButtonBox, QDoubleSpinBox, QGridLayout, QIcon, QKeySequence, QLabel, - QLineEdit, QListWidgetItem, QMenu, QMessageBox, QPixmap, QPlainTextEdit, QSize, - QSizePolicy, Qt, QToolButton, QUndoCommand, QUndoStack, QUrl, QVBoxLayout, QWidget, + QAbstractItemView, + QAction, + QApplication, + QComboBox, + QDateTime, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QGridLayout, + QIcon, + QKeySequence, + QLabel, + QLineEdit, + QListWidgetItem, + QMenu, + QMessageBox, + QPixmap, + QPlainTextEdit, + QSize, + QSizePolicy, + Qt, + QToolButton, + QUndoCommand, + QUndoStack, + QUrl, + QVBoxLayout, + QWidget, pyqtSignal, ) @@ -24,31 +48,29 @@ from calibre.constants import iswindows from calibre.customize.ui import run_plugins_on_import from calibre.db import SPOOL_SIZE from calibre.ebooks import BOOK_EXTENSIONS -from calibre.ebooks.metadata import ( - authors_to_sort_string, check_isbn, string_to_authors, title_sort, -) +from calibre.ebooks.metadata import authors_to_sort_string, check_isbn, string_to_authors, title_sort from calibre.ebooks.metadata.meta import get_metadata -from calibre.gui2 import ( - choose_files_and_remember_all_files, choose_images, error_dialog, - file_icon_provider, gprefs, -) +from calibre.gui2 import choose_files_and_remember_all_files, choose_images, error_dialog, file_icon_provider, gprefs from calibre.gui2.comments_editor import Editor from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.dialogs.tag_editor import TagEditor from calibre.gui2.languages import LanguagesEdit as LE -from calibre.gui2.widgets import ( - EnLineEdit, FormatList as _FormatList, ImageView, LineEditIndicators, -) -from calibre.gui2.widgets2 import ( - DateTimeEdit, Dialog, RatingEditor, RightClickButton, access_key, - populate_standard_spinbox_context_menu, -) +from calibre.gui2.widgets import EnLineEdit, ImageView, LineEditIndicators +from calibre.gui2.widgets import FormatList as _FormatList +from calibre.gui2.widgets2 import DateTimeEdit, Dialog, RatingEditor, RightClickButton, access_key, populate_standard_spinbox_context_menu from calibre.library.comments import comments_to_html from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile from calibre.utils.config import prefs, tweaks from calibre.utils.date import ( - UNDEFINED_DATE, as_local_time, internal_iso_format_string, is_date_undefined, - local_tz, parse_only_date, qt_from_dt, qt_to_dt, utcfromtimestamp, + UNDEFINED_DATE, + as_local_time, + internal_iso_format_string, + is_date_undefined, + local_tz, + parse_only_date, + qt_from_dt, + qt_to_dt, + utcfromtimestamp, ) from calibre.utils.filenames import make_long_path_useable from calibre.utils.icu import sort_key, strcmp @@ -1252,9 +1274,7 @@ class Cover(ImageView): # {{{ cdata = self.current_val if not cdata: return - from calibre.utils.img import ( - image_from_data, image_to_data, remove_borders_from_image, - ) + from calibre.utils.img import image_from_data, image_to_data, remove_borders_from_image img = image_from_data(cdata) nimg = remove_borders_from_image(img) if nimg is not img: diff --git a/src/calibre/gui2/metadata/bulk_download.py b/src/calibre/gui2/metadata/bulk_download.py index b744635ce9..e238aad475 100644 --- a/src/calibre/gui2/metadata/bulk_download.py +++ b/src/calibre/gui2/metadata/bulk_download.py @@ -8,9 +8,10 @@ __docformat__ = 'restructuredtext en' import os import shutil import time -from qt.core import QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, Qt from threading import Thread +from qt.core import QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, Qt + from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.gui2.threaded_jobs import ThreadedJob from calibre.ptempfile import PersistentTemporaryDirectory, PersistentTemporaryFile diff --git a/src/calibre/gui2/metadata/config.py b/src/calibre/gui2/metadata/config.py index 67c99c1d7e..846c360432 100644 --- a/src/calibre/gui2/metadata/config.py +++ b/src/calibre/gui2/metadata/config.py @@ -7,10 +7,8 @@ __docformat__ = 'restructuredtext en' import numbers import textwrap -from qt.core import ( - QCheckBox, QComboBox, QDoubleSpinBox, QGridLayout, QGroupBox, QLabel, QLineEdit, - QListView, QSpinBox, Qt, QVBoxLayout, QWidget -) + +from qt.core import QCheckBox, QComboBox, QDoubleSpinBox, QGridLayout, QGroupBox, QLabel, QLineEdit, QListView, QSpinBox, Qt, QVBoxLayout, QWidget from calibre.gui2.preferences.metadata_sources import FieldsModel as FM from calibre.utils.icu import sort_key diff --git a/src/calibre/gui2/metadata/diff.py b/src/calibre/gui2/metadata/diff.py index e9c9f4b872..fcf279b6cc 100644 --- a/src/calibre/gui2/metadata/diff.py +++ b/src/calibre/gui2/metadata/diff.py @@ -8,11 +8,33 @@ import os import weakref from collections import OrderedDict, namedtuple from functools import partial + from qt.core import ( - QAction, QApplication, QCheckBox, QColor, QDialog, QDialogButtonBox, QFont, - QGridLayout, QHBoxLayout, QIcon, QKeySequence, QLabel, QMenu, QPainter, QPen, - QPixmap, QScrollArea, QSize, QSizePolicy, QStackedLayout, Qt, QToolButton, - QVBoxLayout, QWidget, pyqtSignal, + QAction, + QApplication, + QCheckBox, + QColor, + QDialog, + QDialogButtonBox, + QFont, + QGridLayout, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QMenu, + QPainter, + QPen, + QPixmap, + QScrollArea, + QSize, + QSizePolicy, + QStackedLayout, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import fit_image diff --git a/src/calibre/gui2/metadata/pdf_covers.py b/src/calibre/gui2/metadata/pdf_covers.py index 3c6078734a..721d297290 100644 --- a/src/calibre/gui2/metadata/pdf_covers.py +++ b/src/calibre/gui2/metadata/pdf_covers.py @@ -8,13 +8,27 @@ __docformat__ = 'restructuredtext en' import os import shutil import sys -from qt.core import ( - QAbstractItemView, QApplication, QDialog, QDialogButtonBox, QLabel, QListView, - QListWidget, QListWidgetItem, QPixmap, QSize, QStyledItemDelegate, Qt, QTimer, - QVBoxLayout, pyqtSignal, sip, -) from threading import Thread +from qt.core import ( + QAbstractItemView, + QApplication, + QDialog, + QDialogButtonBox, + QLabel, + QListView, + QListWidget, + QListWidgetItem, + QPixmap, + QSize, + QStyledItemDelegate, + Qt, + QTimer, + QVBoxLayout, + pyqtSignal, + sip, +) + from calibre import as_unicode from calibre.ebooks.metadata.archive import get_comic_images from calibre.ebooks.metadata.pdf import page_images diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index ceaa5efbdb..940e16ea5d 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -8,25 +8,58 @@ __docformat__ = 'restructuredtext en' import os from datetime import datetime from functools import partial + from qt.core import ( - QDialog, QDialogButtonBox, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, - QInputDialog, QKeySequence, QMenu, QPushButton, QScrollArea, QShortcut, QSize, - QSizePolicy, QSpacerItem, QSplitter, Qt, QTabWidget, QToolButton, QVBoxLayout, - QWidget, pyqtSignal, + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QInputDialog, + QKeySequence, + QMenu, + QPushButton, + QScrollArea, + QShortcut, + QSize, + QSizePolicy, + QSpacerItem, + QSplitter, + Qt, + QTabWidget, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.constants import ismacos from calibre.ebooks.metadata import authors_to_string, string_to_authors from calibre.ebooks.metadata.book.base import Metadata from calibre.gui2 import error_dialog, gprefs, pixmap_to_data -from calibre.gui2.custom_column_widgets import ( - Comments, populate_metadata_page, get_custom_columns_to_display_in_editor) +from calibre.gui2.custom_column_widgets import Comments, get_custom_columns_to_display_in_editor, populate_metadata_page from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.metadata.basic_widgets import ( - AuthorsEdit, AuthorSortEdit, BuddyLabel, CommentsEdit, Cover, DateEdit, - FormatsManager, IdentifiersEdit, LanguagesEdit, PubdateEdit, PublisherEdit, - RatingEdit, RightClickButton, SeriesEdit, SeriesIndexEdit, TagsEdit, TitleEdit, - TitleSortEdit + AuthorsEdit, + AuthorSortEdit, + BuddyLabel, + CommentsEdit, + Cover, + DateEdit, + FormatsManager, + IdentifiersEdit, + LanguagesEdit, + PubdateEdit, + PublisherEdit, + RatingEdit, + RightClickButton, + SeriesEdit, + SeriesIndexEdit, + TagsEdit, + TitleEdit, + TitleSortEdit, ) from calibre.gui2.metadata.single_download import FullFetch from calibre.gui2.widgets2 import CenteredToolButton diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index efc8916fb9..955125dfc2 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -12,16 +12,46 @@ import os import time from io import BytesIO from operator import attrgetter -from qt.core import ( - QAbstractItemView, QAbstractListModel, QAbstractTableModel, QApplication, QCursor, - QDialog, QDialogButtonBox, QGridLayout, QHBoxLayout, QIcon, QItemSelectionModel, - QLabel, QListView, QMenu, QModelIndex, QPalette, QPixmap, QPushButton, QRect, - QRectF, QSize, QSizePolicy, QSplitter, QStackedWidget, QStringListModel, QStyle, - QStyledItemDelegate, Qt, QTableView, QTextBrowser, QTextDocument, QTimer, - QVBoxLayout, QWidget, pyqtSignal, -) from threading import Event, Thread +from qt.core import ( + QAbstractItemView, + QAbstractListModel, + QAbstractTableModel, + QApplication, + QCursor, + QDialog, + QDialogButtonBox, + QGridLayout, + QHBoxLayout, + QIcon, + QItemSelectionModel, + QLabel, + QListView, + QMenu, + QModelIndex, + QPalette, + QPixmap, + QPushButton, + QRect, + QRectF, + QSize, + QSizePolicy, + QSplitter, + QStackedWidget, + QStringListModel, + QStyle, + QStyledItemDelegate, + Qt, + QTableView, + QTextBrowser, + QTextDocument, + QTimer, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import force_unicode from calibre.customize.ui import metadata_plugins from calibre.db.constants import COVER_FILE_NAME, DATA_DIR_NAME @@ -29,9 +59,7 @@ from calibre.ebooks.metadata import authors_to_string, rating_to_stars from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.opf2 import OPF from calibre.ebooks.metadata.sources.identify import urls_from_identifiers -from calibre.gui2 import ( - choose_save_file, error_dialog, gprefs, rating_font, -) +from calibre.gui2 import choose_save_file, error_dialog, gprefs, rating_font from calibre.gui2.progress_indicator import SpinAnimator from calibre.gui2.widgets2 import HTMLDisplay from calibre.library.comments import comments_to_html diff --git a/src/calibre/gui2/open_with.py b/src/calibre/gui2/open_with.py index 971da327cf..3d45ee233c 100644 --- a/src/calibre/gui2/open_with.py +++ b/src/calibre/gui2/open_with.py @@ -8,19 +8,32 @@ import os import uuid from contextlib import suppress from functools import partial -from qt.core import ( - QAction, QBuffer, QByteArray, QDialogButtonBox, QIcon, QInputDialog, QIODevice, - QKeySequence, QLabel, QListWidget, QListWidgetItem, QPixmap, QSize, QStackedLayout, - Qt, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread +from qt.core import ( + QAction, + QBuffer, + QByteArray, + QDialogButtonBox, + QIcon, + QInputDialog, + QIODevice, + QKeySequence, + QLabel, + QListWidget, + QListWidgetItem, + QPixmap, + QSize, + QStackedLayout, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import as_unicode from calibre.constants import ismacos, iswindows -from calibre.gui2 import ( - Application, choose_files, choose_images, choose_osx_app, elided_text, error_dialog, - sanitize_env_vars, -) +from calibre.gui2 import Application, choose_files, choose_images, choose_osx_app, elided_text, error_dialog, sanitize_env_vars from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.widgets2 import Dialog from calibre.utils.config import JSONConfig @@ -80,9 +93,7 @@ if iswindows: # Windows {{{ import subprocess - from calibre.utils.open_with.windows import ( - load_icon_for_cmdline, load_icon_resource, - ) + from calibre.utils.open_with.windows import load_icon_for_cmdline, load_icon_resource from calibre.utils.winreg.default_programs import find_programs, friendly_app_name from calibre_extensions import winutil oprefs = JSONConfig('windows_open_with') @@ -174,9 +185,7 @@ if iswindows: elif ismacos: # macOS {{{ oprefs = JSONConfig('osx_open_with') - from calibre.utils.open_with.osx import ( - entry_to_cmdline, find_programs, get_bundle_data, get_icon, - ) + from calibre.utils.open_with.osx import entry_to_cmdline, find_programs, get_bundle_data, get_icon def entry_sort_key(entry): return sort_key(entry.get('name') or '') @@ -224,9 +233,7 @@ elif ismacos: else: # XDG {{{ oprefs = JSONConfig('xdg_open_with') - from calibre.utils.open_with.linux import ( - entry_sort_key, entry_to_cmdline, find_programs, - ) + from calibre.utils.open_with.linux import entry_sort_key, entry_to_cmdline, find_programs def change_name_in_entry(entry, newname): entry['Name'] = newname diff --git a/src/calibre/gui2/palette.py b/src/calibre/gui2/palette.py index 92a4af8896..00ebc471fa 100644 --- a/src/calibre/gui2/palette.py +++ b/src/calibre/gui2/palette.py @@ -5,10 +5,8 @@ import os import sys from contextlib import contextmanager, suppress from functools import lru_cache -from qt.core import ( - QApplication, QByteArray, QColor, QDataStream, QIcon, QIODeviceBase, QObject, - QPalette, QProxyStyle, QStyle, Qt, -) + +from qt.core import QApplication, QByteArray, QColor, QDataStream, QIcon, QIODeviceBase, QObject, QPalette, QProxyStyle, QStyle, Qt from calibre.constants import DEBUG, dark_link_color, ismacos, iswindows diff --git a/src/calibre/gui2/pin_columns.py b/src/calibre/gui2/pin_columns.py index f7da595886..28f6b183fb 100644 --- a/src/calibre/gui2/pin_columns.py +++ b/src/calibre/gui2/pin_columns.py @@ -2,10 +2,10 @@ # License: GPLv3 Copyright: 2018, Kovid Goyal -from qt.core import QTableView, QSplitter +from qt.core import QSplitter, QTableView -from calibre.gui2.library import DEFAULT_SORT from calibre.gui2 import gprefs +from calibre.gui2.library import DEFAULT_SORT class PinTableView(QTableView): diff --git a/src/calibre/gui2/preferences/__init__.py b/src/calibre/gui2/preferences/__init__.py index 57324e59f9..40a6d1a1a8 100644 --- a/src/calibre/gui2/preferences/__init__.py +++ b/src/calibre/gui2/preferences/__init__.py @@ -7,14 +7,29 @@ __docformat__ = 'restructuredtext en' import textwrap -from qt.core import (QWidget, pyqtSignal, QCheckBox, QAbstractSpinBox, QApplication, - QLineEdit, QComboBox, Qt, QIcon, QDialog, QVBoxLayout, - QDialogButtonBox, QListView, QEvent, QListWidget, QTableWidget) +from qt.core import ( + QAbstractSpinBox, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QEvent, + QIcon, + QLineEdit, + QListView, + QListWidget, + Qt, + QTableWidget, + QVBoxLayout, + QWidget, + pyqtSignal, +) from calibre.customize.ui import preferences_plugins -from calibre.utils.config import ConfigProxy from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.widgets import HistoryLineEdit +from calibre.utils.config import ConfigProxy from polyglot.builtins import string_or_bytes @@ -337,8 +352,8 @@ class ConfigDialog(QDialog): def init_gui(): - from calibre.gui2.ui import Main from calibre.gui2.main import option_parser + from calibre.gui2.ui import Main from calibre.library import db parser = option_parser() opts, args = parser.parse_args([]) diff --git a/src/calibre/gui2/preferences/adding.py b/src/calibre/gui2/preferences/adding.py index ee1235491e..5170ca613e 100644 --- a/src/calibre/gui2/preferences/adding.py +++ b/src/calibre/gui2/preferences/adding.py @@ -7,15 +7,14 @@ __docformat__ = 'restructuredtext en' import os -from qt.core import Qt, QVBoxLayout, QFormLayout, QDialog +from qt.core import QDialog, QFormLayout, Qt, QVBoxLayout -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ - CommaSeparatedList, AbortCommit -from calibre.gui2.preferences.adding_ui import Ui_Form -from calibre.utils.config import prefs -from calibre.gui2.widgets import FilenamePattern +from calibre.gui2 import choose_dir, error_dialog, gprefs, question_dialog from calibre.gui2.auto_add import AUTO_ADDED -from calibre.gui2 import gprefs, choose_dir, error_dialog, question_dialog +from calibre.gui2.preferences import AbortCommit, CommaSeparatedList, ConfigWidgetBase, test_widget +from calibre.gui2.preferences.adding_ui import Ui_Form +from calibre.gui2.widgets import FilenamePattern +from calibre.utils.config import prefs class ConfigWidget(ConfigWidgetBase, Ui_Form): diff --git a/src/calibre/gui2/preferences/behavior.py b/src/calibre/gui2/preferences/behavior.py index 15d38ed0a8..ba758ca7d2 100644 --- a/src/calibre/gui2/preferences/behavior.py +++ b/src/calibre/gui2/preferences/behavior.py @@ -8,17 +8,17 @@ __docformat__ = 'restructuredtext en' import re from functools import partial -from qt.core import Qt, QListWidgetItem +from qt.core import QListWidgetItem, Qt -from calibre.gui2.actions.choose_library import get_change_library_action_plugin -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, Setting -from calibre.gui2.preferences.behavior_ui import Ui_Form -from calibre.gui2 import config, info_dialog, dynamic, gprefs -from calibre.utils.config import prefs -from calibre.customize.ui import available_output_formats, all_input_formats +from calibre.constants import iswindows +from calibre.customize.ui import all_input_formats, available_output_formats from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.oeb.iterator import is_supported -from calibre.constants import iswindows +from calibre.gui2 import config, dynamic, gprefs, info_dialog +from calibre.gui2.actions.choose_library import get_change_library_action_plugin +from calibre.gui2.preferences import ConfigWidgetBase, Setting, test_widget +from calibre.gui2.preferences.behavior_ui import Ui_Form +from calibre.utils.config import prefs from calibre.utils.icu import sort_key diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py index 76544c7a35..fd7a9cb32d 100644 --- a/src/calibre/gui2/preferences/coloring.py +++ b/src/calibre/gui2/preferences/coloring.py @@ -9,28 +9,50 @@ import json import os import textwrap from functools import partial + from qt.core import ( - QAbstractItemView, QAbstractListModel, QApplication, QCheckBox, QComboBox, QDialog, - QDialogButtonBox, QDoubleValidator, QFrame, QGridLayout, QIcon, QIntValidator, - QItemSelection, QItemSelectionModel, QLabel, QLineEdit, QListView, QListWidget, - QListWidgetItem, QPalette, QPushButton, QScrollArea, QSize, QSizePolicy, - QSpacerItem, QStandardItem, QStandardItemModel, Qt, QToolButton, QVBoxLayout, - QWidget, pyqtSignal, + QAbstractItemView, + QAbstractListModel, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QDoubleValidator, + QFrame, + QGridLayout, + QIcon, + QIntValidator, + QItemSelection, + QItemSelectionModel, + QLabel, + QLineEdit, + QListView, + QListWidget, + QListWidgetItem, + QPalette, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QSpacerItem, + QStandardItem, + QStandardItemModel, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import as_unicode, prepare_string_for_xml, sanitize_file_name from calibre.constants import config_dir -from calibre.gui2 import ( - choose_files, choose_save_file, error_dialog, gprefs, open_local_file, - pixmap_to_data, question_dialog, -) +from calibre.gui2 import choose_files, choose_save_file, error_dialog, gprefs, open_local_file, pixmap_to_data, question_dialog from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.metadata.single_download import RichTextDelegate from calibre.gui2.preferences import ListViewWithMoveByKeyPress from calibre.gui2.widgets2 import ColorButton, FlowLayout, Separator -from calibre.library.coloring import ( - Rule, color_row_key, conditionable_columns, displayable_columns, rule_from_template, -) +from calibre.library.coloring import Rule, color_row_key, conditionable_columns, displayable_columns, rule_from_template from calibre.utils.icu import lower, sort_key from calibre.utils.localization import lang_map, ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/columns.py b/src/calibre/gui2/preferences/columns.py index a145b6e6a5..eb27a61863 100644 --- a/src/calibre/gui2/preferences/columns.py +++ b/src/calibre/gui2/preferences/columns.py @@ -5,16 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import copy, sys +import copy +import sys from contextlib import suppress -from qt.core import Qt, QTableWidgetItem, QIcon, QAbstractItemView +from qt.core import QAbstractItemView, QIcon, Qt, QTableWidgetItem -from calibre.gui2 import gprefs, Application +from calibre.gui2 import Application, error_dialog, gprefs, question_dialog from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.columns_ui import Ui_Form from calibre.gui2.preferences.create_custom_column import CreateCustomColumn -from calibre.gui2 import error_dialog, question_dialog class ConfigWidget(ConfigWidgetBase, Ui_Form): diff --git a/src/calibre/gui2/preferences/conversion.py b/src/calibre/gui2/preferences/conversion.py index 91ecbf0ae4..3bab6fb70a 100644 --- a/src/calibre/gui2/preferences/conversion.py +++ b/src/calibre/gui2/preferences/conversion.py @@ -7,21 +7,19 @@ __docformat__ = 'restructuredtext en' import importlib -from qt.core import ( - QIcon, Qt, QStringListModel, QListView, QSizePolicy, QHBoxLayout, QSize, - QStackedWidget, pyqtSignal, QScrollArea) +from qt.core import QHBoxLayout, QIcon, QListView, QScrollArea, QSize, QSizePolicy, QStackedWidget, QStringListModel, Qt, pyqtSignal -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, AbortCommit +from calibre.customize.ui import input_format_plugins, output_format_plugins from calibre.ebooks.conversion.plumber import Plumber -from calibre.utils.logging import Log -from calibre.gui2.convert.look_and_feel import LookAndFeelWidget +from calibre.gui2.convert import config_widget_for_input_plugin from calibre.gui2.convert.heuristics import HeuristicsWidget -from calibre.gui2.convert.search_and_replace import SearchAndReplaceWidget +from calibre.gui2.convert.look_and_feel import LookAndFeelWidget from calibre.gui2.convert.page_setup import PageSetupWidget +from calibre.gui2.convert.search_and_replace import SearchAndReplaceWidget from calibre.gui2.convert.structure_detection import StructureDetectionWidget from calibre.gui2.convert.toc import TOCWidget -from calibre.customize.ui import input_format_plugins, output_format_plugins -from calibre.gui2.convert import config_widget_for_input_plugin +from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget +from calibre.utils.logging import Log class Model(QStringListModel): diff --git a/src/calibre/gui2/preferences/create_custom_column.py b/src/calibre/gui2/preferences/create_custom_column.py index 3e4aaf76c4..3480936c2c 100644 --- a/src/calibre/gui2/preferences/create_custom_column.py +++ b/src/calibre/gui2/preferences/create_custom_column.py @@ -10,9 +10,23 @@ import copy import re from enum import Enum from functools import partial + from qt.core import ( - QCheckBox, QColor, QComboBox, QDialog, QDialogButtonBox, QGridLayout, QGroupBox, - QHBoxLayout, QIcon, QLabel, QLineEdit, QRadioButton, QSpinBox, Qt, QVBoxLayout, + QCheckBox, + QColor, + QComboBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QRadioButton, + QSpinBox, + Qt, + QVBoxLayout, QWidget, ) diff --git a/src/calibre/gui2/preferences/device_debug.py b/src/calibre/gui2/preferences/device_debug.py index 3e07b77458..b5494b15bc 100644 --- a/src/calibre/gui2/preferences/device_debug.py +++ b/src/calibre/gui2/preferences/device_debug.py @@ -6,8 +6,7 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from qt.core import QDialog, QVBoxLayout, QPlainTextEdit, QTimer, \ - QDialogButtonBox, QPushButton, QApplication, QIcon +from qt.core import QApplication, QDialog, QDialogButtonBox, QIcon, QPlainTextEdit, QPushButton, QTimer, QVBoxLayout from calibre.gui2 import error_dialog diff --git a/src/calibre/gui2/preferences/device_user_defined.py b/src/calibre/gui2/preferences/device_user_defined.py index 29529ee556..84f6a7fbe3 100644 --- a/src/calibre/gui2/preferences/device_user_defined.py +++ b/src/calibre/gui2/preferences/device_user_defined.py @@ -7,8 +7,8 @@ __docformat__ = 'restructuredtext en' import numbers -from qt.core import QDialog, QVBoxLayout, QPlainTextEdit, QTimer, \ - QDialogButtonBox, QPushButton, QApplication, QIcon, QMessageBox + +from qt.core import QApplication, QDialog, QDialogButtonBox, QIcon, QMessageBox, QPlainTextEdit, QPushButton, QTimer, QVBoxLayout def step_dialog(parent, title, msg, det_msg=''): diff --git a/src/calibre/gui2/preferences/emailp.py b/src/calibre/gui2/preferences/emailp.py index 3b4c34b0a7..2ae7ca1530 100644 --- a/src/calibre/gui2/preferences/emailp.py +++ b/src/calibre/gui2/preferences/emailp.py @@ -4,6 +4,7 @@ import re import textwrap + from qt.core import QAbstractItemView, QAbstractTableModel, QFont, Qt from calibre.gui2 import gprefs diff --git a/src/calibre/gui2/preferences/ignored_devices.py b/src/calibre/gui2/preferences/ignored_devices.py index aea7328319..1cc65acbbe 100644 --- a/src/calibre/gui2/preferences/ignored_devices.py +++ b/src/calibre/gui2/preferences/ignored_devices.py @@ -4,9 +4,7 @@ import textwrap -from qt.core import ( - QIcon, QLabel, QListWidget, QListWidgetItem, QPushButton, Qt, QVBoxLayout -) +from qt.core import QIcon, QLabel, QListWidget, QListWidgetItem, QPushButton, Qt, QVBoxLayout from calibre.customize.ui import enable_plugin from calibre.gui2 import gprefs diff --git a/src/calibre/gui2/preferences/keyboard.py b/src/calibre/gui2/preferences/keyboard.py index 061d70d456..44b5fcd258 100644 --- a/src/calibre/gui2/preferences/keyboard.py +++ b/src/calibre/gui2/preferences/keyboard.py @@ -7,8 +7,8 @@ __docformat__ = 'restructuredtext en' from qt.core import QVBoxLayout -from calibre.gui2.preferences import (ConfigWidgetBase, test_widget) from calibre.gui2.keyboard import ShortcutConfig +from calibre.gui2.preferences import ConfigWidgetBase, test_widget class ConfigWidget(ConfigWidgetBase): diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 9fbf058d62..f4779d6125 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -8,23 +8,57 @@ __docformat__ = 'restructuredtext en' import json from collections import defaultdict from functools import partial -from qt.core import ( - QAbstractListModel, QApplication, QBrush, QColor, QColorDialog, QComboBox, QDialog, - QDialogButtonBox, QFont, QFontDialog, QFontInfo, QFormLayout, QHeaderView, QIcon, - QItemSelectionModel, QKeySequence, QLabel, QLineEdit, QListWidgetItem, QPainter, - QPixmap, QPushButton, QSize, QSizePolicy, Qt, QTableWidget, QTableWidgetItem, - QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread +from qt.core import ( + QAbstractListModel, + QApplication, + QBrush, + QColor, + QColorDialog, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QFontDialog, + QFontInfo, + QFormLayout, + QHeaderView, + QIcon, + QItemSelectionModel, + QKeySequence, + QLabel, + QLineEdit, + QListWidgetItem, + QPainter, + QPixmap, + QPushButton, + QSize, + QSizePolicy, + Qt, + QTableWidget, + QTableWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import human_readable from calibre.constants import ismacos, iswindows from calibre.db.categories import is_standard_category from calibre.ebooks.metadata.book.render import DEFAULT_AUTHOR_LINK from calibre.ebooks.metadata.sources.prefs import msprefs from calibre.gui2 import ( - choose_files, choose_save_file, config, default_author_link, error_dialog, gprefs, - icon_resource_manager, open_local_file, qt_app, question_dialog, + choose_files, + choose_save_file, + config, + default_author_link, + error_dialog, + gprefs, + icon_resource_manager, + open_local_file, + qt_app, + question_dialog, ) from calibre.gui2.actions.show_quickview import get_quickview_action_plugin from calibre.gui2.book_details import get_field_list @@ -32,9 +66,7 @@ from calibre.gui2.custom_column_widgets import get_field_list as em_get_field_li from calibre.gui2.dialogs.quickview import get_qv_field_list from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.library.alternate_views import CM_TO_INCH, auto_height -from calibre.gui2.preferences import ( - ConfigWidgetBase, Setting, set_help_tips, test_widget, -) +from calibre.gui2.preferences import ConfigWidgetBase, Setting, set_help_tips, test_widget from calibre.gui2.preferences.coloring import EditRules from calibre.gui2.preferences.look_feel_ui import Ui_Form from calibre.gui2.widgets import BusyCursor @@ -43,7 +75,8 @@ from calibre.startup import connect_lambda from calibre.utils.config import prefs from calibre.utils.icu import sort_key from calibre.utils.localization import available_translations, get_lang, get_language -from calibre.utils.resources import get_path as P, set_data +from calibre.utils.resources import get_path as P +from calibre.utils.resources import set_data from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/main.py b/src/calibre/gui2/preferences/main.py index 0d331ad5f3..8b78916b04 100644 --- a/src/calibre/gui2/preferences/main.py +++ b/src/calibre/gui2/preferences/main.py @@ -9,22 +9,38 @@ import re import textwrap from collections import OrderedDict from functools import partial + from qt.core import ( - QApplication, QDialog, QDialogButtonBox, QFont, QFrame, QHBoxLayout, QIcon, - QLabel, QPainter, QPointF, QPushButton, QScrollArea, QSize, QSizePolicy, - QStackedWidget, QStatusTipEvent, Qt, QTabWidget, QTextLayout, QToolBar, - QVBoxLayout, QWidget, pyqtSignal + QApplication, + QDialog, + QDialogButtonBox, + QFont, + QFrame, + QHBoxLayout, + QIcon, + QLabel, + QPainter, + QPointF, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QStackedWidget, + QStatusTipEvent, + Qt, + QTabWidget, + QTextLayout, + QToolBar, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.constants import __appname__, __version__ from calibre.customize.ui import preferences_plugins -from calibre.gui2 import ( - gprefs, show_restart_warning -) +from calibre.gui2 import gprefs, show_restart_warning from calibre.gui2.dialogs.message_box import Icon -from calibre.gui2.preferences import ( - AbortCommit, AbortInitialize, get_plugin, init_gui -) +from calibre.gui2.preferences import AbortCommit, AbortInitialize, get_plugin, init_gui ICON_SIZE = 32 diff --git a/src/calibre/gui2/preferences/metadata_sources.py b/src/calibre/gui2/preferences/metadata_sources.py index cb9bfe4e97..0ed73a71f1 100644 --- a/src/calibre/gui2/preferences/metadata_sources.py +++ b/src/calibre/gui2/preferences/metadata_sources.py @@ -6,15 +6,25 @@ __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' from operator import attrgetter + from qt.core import ( - QAbstractListModel, QAbstractTableModel, QCursor, QDialog, QDialogButtonBox, QFrame, - QIcon, QLabel, QMenu, QScrollArea, Qt, QVBoxLayout, QWidget, pyqtSignal, + QAbstractListModel, + QAbstractTableModel, + QCursor, + QDialog, + QDialogButtonBox, + QFrame, + QIcon, + QLabel, + QMenu, + QScrollArea, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, ) -from calibre.customize.ui import ( - all_metadata_plugins, default_disabled_plugins, disable_plugin, enable_plugin, - is_disabled, -) +from calibre.customize.ui import all_metadata_plugins, default_disabled_plugins, disable_plugin, enable_plugin, is_disabled from calibre.ebooks.metadata.sources.prefs import msprefs from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.preferences import ConfigWidgetBase, test_widget diff --git a/src/calibre/gui2/preferences/misc.py b/src/calibre/gui2/preferences/misc.py index 9ddc27bacc..4f8913dae4 100644 --- a/src/calibre/gui2/preferences/misc.py +++ b/src/calibre/gui2/preferences/misc.py @@ -7,10 +7,10 @@ __docformat__ = 'restructuredtext en' import textwrap -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, Setting -from calibre.gui2.preferences.misc_ui import Ui_Form -from calibre.gui2 import config, open_local_file, gprefs from calibre import get_proxies +from calibre.gui2 import config, gprefs, open_local_file +from calibre.gui2.preferences import ConfigWidgetBase, Setting, test_widget +from calibre.gui2.preferences.misc_ui import Ui_Form from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/plugboard.py b/src/calibre/gui2/preferences/plugboard.py index b8458d5927..123bd86bf1 100644 --- a/src/calibre/gui2/preferences/plugboard.py +++ b/src/calibre/gui2/preferences/plugboard.py @@ -8,20 +8,17 @@ __docformat__ = 'restructuredtext en' import copy from collections import defaultdict -from qt.core import Qt, QComboBox, QListWidgetItem +from qt.core import QComboBox, QListWidgetItem, Qt -from calibre.customize.ui import is_disabled +from calibre.customize.ui import device_plugins, disabled_device_plugins, is_disabled, metadata_writers from calibre.gui2 import error_dialog, question_dialog, warning_dialog from calibre.gui2.device import device_name_for_plugboards from calibre.gui2.dialogs.template_line_editor import TemplateLineEditor +from calibre.gui2.email import plugboard_email_formats, plugboard_email_value from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.plugboard_ui import Ui_Form -from calibre.customize.ui import metadata_writers, device_plugins, disabled_device_plugins -from calibre.library.save_to_disk import plugboard_any_format_value, \ - plugboard_any_device_value, plugboard_save_to_disk_value, \ - find_plugboard -from calibre.srv.content import plugboard_content_server_value, plugboard_content_server_formats -from calibre.gui2.email import plugboard_email_value, plugboard_email_formats +from calibre.library.save_to_disk import find_plugboard, plugboard_any_device_value, plugboard_any_format_value, plugboard_save_to_disk_value +from calibre.srv.content import plugboard_content_server_formats, plugboard_content_server_value from calibre.utils.formatter import validation_formatter diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 3e21f2829d..8719eefbc8 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -5,24 +5,21 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap, os +import os +import textwrap from collections import OrderedDict -from qt.core import (Qt, QMenu, QModelIndex, QAbstractItemModel, QIcon, - QBrush, QDialog, QItemSelectionModel, QAbstractItemView) +from qt.core import QAbstractItemModel, QAbstractItemView, QBrush, QDialog, QIcon, QItemSelectionModel, QMenu, QModelIndex, Qt +from calibre.constants import iswindows +from calibre.customize import PluginInstallationType +from calibre.customize.ui import NameConflict, add_plugin, disable_plugin, enable_plugin, initialized_plugins, is_disabled, plugin_customization, remove_plugin +from calibre.gui2 import choose_files, error_dialog, gprefs, info_dialog, question_dialog +from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.plugins_ui import Ui_Form -from calibre.customize import PluginInstallationType -from calibre.customize.ui import (initialized_plugins, is_disabled, enable_plugin, - disable_plugin, plugin_customization, add_plugin, - remove_plugin, NameConflict) -from calibre.gui2 import (error_dialog, info_dialog, choose_files, - question_dialog, gprefs) -from calibre.gui2.dialogs.confirm_delete import confirm -from calibre.utils.search_query_parser import SearchQueryParser from calibre.utils.icu import lower -from calibre.constants import iswindows +from calibre.utils.search_query_parser import SearchQueryParser from polyglot.builtins import iteritems, itervalues @@ -402,8 +399,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.update_plugins(not_installed=True) def update_plugins(self, not_installed=False): - from calibre.gui2.dialogs.plugin_updater import (PluginUpdaterDialog, - FILTER_UPDATE_AVAILABLE, FILTER_NOT_INSTALLED) + from calibre.gui2.dialogs.plugin_updater import FILTER_NOT_INSTALLED, FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog mode = FILTER_NOT_INSTALLED if not_installed else FILTER_UPDATE_AVAILABLE d = PluginUpdaterDialog(self.gui, initial_filter=mode) d.exec() @@ -420,8 +416,8 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.gui.iactions['Store'].load_menu() def check_for_add_to_toolbars(self, plugin, previously_installed=True): + from calibre.customize import EditBookToolPlugin, InterfaceActionBase from calibre.gui2.preferences.toolbar import ConfigWidget - from calibre.customize import InterfaceActionBase, EditBookToolPlugin if isinstance(plugin, EditBookToolPlugin): return self.check_for_add_to_editor_toolbar(plugin, previously_installed) diff --git a/src/calibre/gui2/preferences/save_template.py b/src/calibre/gui2/preferences/save_template.py index f3e573e5d3..f9ed14604b 100644 --- a/src/calibre/gui2/preferences/save_template.py +++ b/src/calibre/gui2/preferences/save_template.py @@ -8,10 +8,10 @@ __docformat__ = 'restructuredtext en' from qt.core import QWidget, pyqtSignal from calibre.gui2 import error_dialog, question_dialog +from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.preferences.save_template_ui import Ui_Form from calibre.library.save_to_disk import FORMAT_ARG_DESCS, preprocess_template from calibre.utils.formatter import validation_formatter -from calibre.gui2.dialogs.template_dialog import TemplateDialog class SaveTemplate(QWidget, Ui_Form): diff --git a/src/calibre/gui2/preferences/saving.py b/src/calibre/gui2/preferences/saving.py index 7325dafd68..d2280760c0 100644 --- a/src/calibre/gui2/preferences/saving.py +++ b/src/calibre/gui2/preferences/saving.py @@ -6,12 +6,11 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ - AbortCommit -from calibre.gui2.preferences.saving_ui import Ui_Form -from calibre.utils.config import ConfigProxy -from calibre.library.save_to_disk import config from calibre.gui2 import gprefs +from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget +from calibre.gui2.preferences.saving_ui import Ui_Form +from calibre.library.save_to_disk import config +from calibre.utils.config import ConfigProxy class ConfigWidget(ConfigWidgetBase, Ui_Form): diff --git a/src/calibre/gui2/preferences/search.py b/src/calibre/gui2/preferences/search.py index 961c7cc1a6..6ec50332c5 100644 --- a/src/calibre/gui2/preferences/search.py +++ b/src/calibre/gui2/preferences/search.py @@ -8,13 +8,12 @@ __docformat__ = 'restructuredtext en' from qt.core import QApplication, QTimer from calibre.gui2 import config, error_dialog, gprefs -from calibre.gui2.preferences import ( - AbortCommit, CommaSeparatedList, ConfigWidgetBase, test_widget, -) +from calibre.gui2.preferences import AbortCommit, CommaSeparatedList, ConfigWidgetBase, test_widget from calibre.gui2.preferences.search_ui import Ui_Form from calibre.library.caches import set_use_primary_find_in_search from calibre.utils.config import prefs -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/preferences/sending.py b/src/calibre/gui2/preferences/sending.py index 93e108cf7d..14df6ce7b2 100644 --- a/src/calibre/gui2/preferences/sending.py +++ b/src/calibre/gui2/preferences/sending.py @@ -6,12 +6,10 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.gui2.preferences import ConfigWidgetBase, test_widget, \ - AbortCommit +from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget from calibre.gui2.preferences.sending_ui import Ui_Form -from calibre.utils.config import ConfigProxy from calibre.library.save_to_disk import config -from calibre.utils.config import prefs +from calibre.utils.config import ConfigProxy, prefs class ConfigWidget(ConfigWidgetBase, Ui_Form): diff --git a/src/calibre/gui2/preferences/server.py b/src/calibre/gui2/preferences/server.py index 33f1e87489..2aeaeac5c5 100644 --- a/src/calibre/gui2/preferences/server.py +++ b/src/calibre/gui2/preferences/server.py @@ -8,19 +8,42 @@ import os import sys import textwrap import time + from qt.core import ( - QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QDoubleSpinBox, - QFormLayout, QFrame, QHBoxLayout, QIcon, QLabel, QLayout, QLineEdit, QListWidget, - QPlainTextEdit, QPushButton, QScrollArea, QSize, QSizePolicy, QSpinBox, Qt, - QTabWidget, QTimer, QToolButton, QUrl, QVBoxLayout, QWidget, pyqtSignal, sip, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFormLayout, + QFrame, + QHBoxLayout, + QIcon, + QLabel, + QLayout, + QLineEdit, + QListWidget, + QPlainTextEdit, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QSpinBox, + Qt, + QTabWidget, + QTimer, + QToolButton, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, + sip, ) from calibre import as_unicode from calibre.constants import isportable, iswindows -from calibre.gui2 import ( - choose_files, choose_save_file, config, error_dialog, gprefs, info_dialog, open_url, - warning_dialog, -) +from calibre.gui2 import choose_files, choose_save_file, config, error_dialog, gprefs, info_dialog, open_url, warning_dialog from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget from calibre.gui2.widgets import HistoryLineEdit from calibre.srv.code import custom_list_template as default_custom_list_template @@ -28,9 +51,7 @@ from calibre.srv.embedded import custom_list_template, search_the_net_urls from calibre.srv.library_broker import load_gui_libraries from calibre.srv.loop import parse_trusted_ips from calibre.srv.opts import change_settings, options, server_config -from calibre.srv.users import ( - UserManager, create_user_data, validate_password, validate_username, -) +from calibre.srv.users import UserManager, create_user_data, validate_password, validate_username from calibre.utils.icu import primary_sort_key from calibre.utils.localization import ngettext from calibre.utils.shared_file import share_open diff --git a/src/calibre/gui2/preferences/template_functions.py b/src/calibre/gui2/preferences/template_functions.py index 097e4f4621..68fab7cb73 100644 --- a/src/calibre/gui2/preferences/template_functions.py +++ b/src/calibre/gui2/preferences/template_functions.py @@ -4,6 +4,7 @@ import copy import json import traceback + from qt.core import QDialog, QDialogButtonBox from calibre.gui2 import error_dialog, gprefs, question_dialog, warning_dialog @@ -12,8 +13,12 @@ from calibre.gui2.preferences import AbortInitialize, ConfigWidgetBase, test_wid from calibre.gui2.preferences.template_functions_ui import Ui_Form from calibre.gui2.widgets import PythonHighlighter from calibre.utils.formatter_functions import ( - StoredObjectType, compile_user_function, compile_user_template_functions, - formatter_functions, function_object_type, function_pref_name, + StoredObjectType, + compile_user_function, + compile_user_template_functions, + formatter_functions, + function_object_type, + function_pref_name, load_user_template_functions, ) from calibre.utils.resources import get_path as P diff --git a/src/calibre/gui2/preferences/texture_chooser.py b/src/calibre/gui2/preferences/texture_chooser.py index 08ac8ab07d..b3659c05ee 100644 --- a/src/calibre/gui2/preferences/texture_chooser.py +++ b/src/calibre/gui2/preferences/texture_chooser.py @@ -8,9 +8,21 @@ import glob import os import shutil from functools import partial + from qt.core import ( - QAbstractItemView, QApplication, QDialog, QDialogButtonBox, QIcon, QLabel, - QListView, QListWidget, QListWidgetItem, QSize, Qt, QTimer, QVBoxLayout, + QAbstractItemView, + QApplication, + QDialog, + QDialogButtonBox, + QIcon, + QLabel, + QListView, + QListWidget, + QListWidgetItem, + QSize, + Qt, + QTimer, + QVBoxLayout, ) from calibre.constants import config_dir diff --git a/src/calibre/gui2/preferences/tweaks.py b/src/calibre/gui2/preferences/tweaks.py index f260400c8d..a0f1e17a70 100644 --- a/src/calibre/gui2/preferences/tweaks.py +++ b/src/calibre/gui2/preferences/tweaks.py @@ -7,23 +7,41 @@ from collections import OrderedDict from functools import partial from operator import attrgetter +from qt.core import ( + QAbstractItemView, + QAbstractListModel, + QApplication, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QGridLayout, + QGroupBox, + QIcon, + QItemSelectionModel, + QLabel, + QListView, + QMenu, + QModelIndex, + QPlainTextEdit, + QPushButton, + QSizePolicy, + QSplitter, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import isbytestring, prepare_string_for_xml from calibre.gui2 import error_dialog, info_dialog from calibre.gui2.preferences import AbortCommit, ConfigWidgetBase, test_widget from calibre.gui2.search_box import SearchBox2 from calibre.gui2.widgets import PythonHighlighter -from calibre.utils.config_base import (default_tweaks_raw, exec_tweaks, - normalize_tweak, read_custom_tweaks, - write_custom_tweaks) +from calibre.utils.config_base import default_tweaks_raw, exec_tweaks, normalize_tweak, read_custom_tweaks, write_custom_tweaks from calibre.utils.icu import lower from calibre.utils.search_query_parser import ParseException, SearchQueryParser from polyglot.builtins import iteritems -from qt.core import (QAbstractItemView, QAbstractListModel, QApplication, - QComboBox, QDialog, QDialogButtonBox, QFont, QGridLayout, - QGroupBox, QIcon, QItemSelectionModel, QLabel, QListView, - QMenu, QModelIndex, QPlainTextEdit, QPushButton, - QSizePolicy, Qt, QVBoxLayout, QWidget, QSplitter, - pyqtSignal) ROOT = QModelIndex() diff --git a/src/calibre/gui2/proceed.py b/src/calibre/gui2/proceed.py index 96beb32f39..532df23744 100644 --- a/src/calibre/gui2/proceed.py +++ b/src/calibre/gui2/proceed.py @@ -6,11 +6,34 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' from collections import namedtuple + from qt.core import ( - QApplication, QCheckBox, QDialogButtonBox, QEasingCurve, QEvent, QFontMetrics, - QHBoxLayout, QIcon, QImage, QLabel, QPainter, QPainterPath, QPalette, QPixmap, - QPlainTextEdit, QPropertyAnimation, QRectF, QSize, QSizePolicy, Qt, QTimer, - QVBoxLayout, QWidget, pyqtProperty, pyqtSignal, sip, + QApplication, + QCheckBox, + QDialogButtonBox, + QEasingCurve, + QEvent, + QFontMetrics, + QHBoxLayout, + QIcon, + QImage, + QLabel, + QPainter, + QPainterPath, + QPalette, + QPixmap, + QPlainTextEdit, + QPropertyAnimation, + QRectF, + QSize, + QSizePolicy, + Qt, + QTimer, + QVBoxLayout, + QWidget, + pyqtProperty, + pyqtSignal, + sip, ) from calibre.constants import __version__ diff --git a/src/calibre/gui2/progress_indicator/__init__.py b/src/calibre/gui2/progress_indicator/__init__.py index 052be0695a..24c797bec2 100644 --- a/src/calibre/gui2/progress_indicator/__init__.py +++ b/src/calibre/gui2/progress_indicator/__init__.py @@ -1,14 +1,10 @@ #!/usr/bin/env python # License: GPLv3 Copyright: 2015, Kovid Goyal -from qt.core import ( - QDialog, QLabel, QObject, QSizePolicy, QStackedLayout, QStackedWidget, Qt, - QVBoxLayout, QWidget, pyqtSignal -) +from qt.core import QDialog, QLabel, QObject, QSizePolicy, QStackedLayout, QStackedWidget, Qt, QVBoxLayout, QWidget, pyqtSignal -from calibre_extensions.progress_indicator import ( - QProgressIndicator as ProgressIndicator, draw_snake_spinner -) +from calibre_extensions.progress_indicator import QProgressIndicator as ProgressIndicator +from calibre_extensions.progress_indicator import draw_snake_spinner draw_snake_spinner diff --git a/src/calibre/gui2/publisher_mapper.py b/src/calibre/gui2/publisher_mapper.py index f57c1f58fb..bb4a5bc1da 100644 --- a/src/calibre/gui2/publisher_mapper.py +++ b/src/calibre/gui2/publisher_mapper.py @@ -6,11 +6,12 @@ from collections import OrderedDict from calibre.ebooks.metadata.tag_mapper import map_tags from calibre.gui2 import Application, elided_text -from calibre.gui2.tag_mapper import ( - RuleEdit as RuleEditBase, RuleEditDialog as RuleEditDialogBase, - RuleItem as RuleItemBase, Rules as RulesBase, RulesDialog as RulesDialogBase, - Tester as TesterBase, -) +from calibre.gui2.tag_mapper import RuleEdit as RuleEditBase +from calibre.gui2.tag_mapper import RuleEditDialog as RuleEditDialogBase +from calibre.gui2.tag_mapper import RuleItem as RuleItemBase +from calibre.gui2.tag_mapper import Rules as RulesBase +from calibre.gui2.tag_mapper import RulesDialog as RulesDialogBase +from calibre.gui2.tag_mapper import Tester as TesterBase from calibre.utils.config import JSONConfig publisher_maps = JSONConfig('publisher-mapping-rules') diff --git a/src/calibre/gui2/pyqt6_compat.py b/src/calibre/gui2/pyqt6_compat.py index c90507efcc..05fa05018f 100644 --- a/src/calibre/gui2/pyqt6_compat.py +++ b/src/calibre/gui2/pyqt6_compat.py @@ -6,11 +6,33 @@ # party plugin code, we NEED backward compat. from qt.core import ( - QAbstractItemView, QAction, QComboBox, QCoreApplication, QDialog, - QDialogButtonBox, QDrag, QDropEvent, QEvent, QEventLoop, QFontMetrics, - QFormLayout, QFrame, QHoverEvent, QImage, QIODevice, QLayout, QLineEdit, QMenu, - QMessageBox, QModelIndex, QPalette, QSinglePointEvent, QSizePolicy, Qt, QThread, - QToolButton + QAbstractItemView, + QAction, + QComboBox, + QCoreApplication, + QDialog, + QDialogButtonBox, + QDrag, + QDropEvent, + QEvent, + QEventLoop, + QFontMetrics, + QFormLayout, + QFrame, + QHoverEvent, + QImage, + QIODevice, + QLayout, + QLineEdit, + QMenu, + QMessageBox, + QModelIndex, + QPalette, + QSinglePointEvent, + QSizePolicy, + Qt, + QThread, + QToolButton, ) from calibre_extensions import progress_indicator diff --git a/src/calibre/gui2/qt_file_dialogs.py b/src/calibre/gui2/qt_file_dialogs.py index b7c387c1b3..da27487567 100644 --- a/src/calibre/gui2/qt_file_dialogs.py +++ b/src/calibre/gui2/qt_file_dialogs.py @@ -4,7 +4,7 @@ import os -from qt.core import QFileDialog, QObject, QDialog +from qt.core import QDialog, QFileDialog, QObject from calibre.gui2.linux_file_dialogs import dialog_name, image_extensions from polyglot.builtins import string_or_bytes diff --git a/src/calibre/gui2/save.py b/src/calibre/gui2/save.py index 6be6703b0e..b21dde9b93 100644 --- a/src/calibre/gui2/save.py +++ b/src/calibre/gui2/save.py @@ -10,20 +10,19 @@ import shutil import time import traceback from collections import defaultdict, namedtuple + from qt.core import QObject, Qt, pyqtSignal from calibre import force_unicode, prints from calibre.constants import DEBUG from calibre.customize.ui import can_set_metadata -from calibre.db.errors import NoSuchFormat from calibre.db.constants import DATA_FILE_PATTERN +from calibre.db.errors import NoSuchFormat from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.gui2 import error_dialog, gprefs, open_local_file, warning_dialog from calibre.gui2.dialogs.progress import ProgressDialog -from calibre.library.save_to_disk import ( - find_plugboard, get_path_components, plugboard_save_to_disk_value, sanitize_args, -) +from calibre.library.save_to_disk import find_plugboard, get_path_components, plugboard_save_to_disk_value, sanitize_args from calibre.ptempfile import PersistentTemporaryDirectory, SpooledTemporaryFile from calibre.utils.filenames import make_long_path_useable from calibre.utils.ipc.pool import Failure, Pool diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py index d676b7c35b..92953f3067 100644 --- a/src/calibre/gui2/search_box.py +++ b/src/calibre/gui2/search_box.py @@ -8,10 +8,8 @@ __docformat__ = 'restructuredtext en' import re import time from functools import partial -from qt.core import ( - QAction, QApplication, QComboBox, QCompleter, QDialog, QEvent, QIcon, QKeyEvent, - QKeySequence, QLineEdit, Qt, QTimer, pyqtSignal, pyqtSlot, -) + +from qt.core import QAction, QApplication, QComboBox, QCompleter, QDialog, QEvent, QIcon, QKeyEvent, QKeySequence, QLineEdit, Qt, QTimer, pyqtSignal, pyqtSlot from calibre.gui2 import QT_HIDDEN_CLEAR_ACTION, config, gprefs, question_dialog from calibre.gui2.dialogs.saved_search_editor import SavedSearchEditor diff --git a/src/calibre/gui2/search_restriction_mixin.py b/src/calibre/gui2/search_restriction_mixin.py index f6912d7576..3fdcef8812 100644 --- a/src/calibre/gui2/search_restriction_mixin.py +++ b/src/calibre/gui2/search_restriction_mixin.py @@ -5,10 +5,27 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from functools import partial + from qt.core import ( - QAbstractItemView, QAction, QComboBox, QDialog, QDialogButtonBox, QFrame, - QGridLayout, QIcon, QLabel, QLineEdit, QListView, QMenu, QRadioButton, QSize, - QSortFilterProxyModel, QStringListModel, Qt, QTextBrowser, QVBoxLayout, + QAbstractItemView, + QAction, + QComboBox, + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QIcon, + QLabel, + QLineEdit, + QListView, + QMenu, + QRadioButton, + QSize, + QSortFilterProxyModel, + QStringListModel, + Qt, + QTextBrowser, + QVBoxLayout, ) from calibre.gui2 import error_dialog, gprefs, question_dialog diff --git a/src/calibre/gui2/splash_screen.py b/src/calibre/gui2/splash_screen.py index 165f25873b..b7600e32fa 100644 --- a/src/calibre/gui2/splash_screen.py +++ b/src/calibre/gui2/splash_screen.py @@ -2,10 +2,7 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from qt.core import ( - QApplication, QBrush, QColor, QFont, QFontMetrics, QPainter, QPen, QPixmap, - QSplashScreen, Qt, -) +from qt.core import QApplication, QBrush, QColor, QFont, QFontMetrics, QPainter, QPen, QPixmap, QSplashScreen, Qt from calibre.constants import __appname__, numeric_version from calibre.utils.monotonic import monotonic diff --git a/src/calibre/gui2/store/amazon_base.py b/src/calibre/gui2/store/amazon_base.py index 825b0314c1..9275813382 100644 --- a/src/calibre/gui2/store/amazon_base.py +++ b/src/calibre/gui2/store/amazon_base.py @@ -1,12 +1,12 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2022, Kovid Goyal -from qt.core import QUrl from threading import Lock from time import monotonic -from calibre.gui2 import open_url +from qt.core import QUrl +from calibre.gui2 import open_url lock = Lock() cached_mod = None @@ -20,7 +20,7 @@ def live_module(): if now - cached_time > 3600: cached_mod = None if cached_mod is None: - from calibre.live import load_module, Strategy + from calibre.live import Strategy, load_module cached_mod = load_module('calibre.gui2.store.amazon_live', strategy=Strategy.fast) return cached_mod diff --git a/src/calibre/gui2/store/amazon_live.py b/src/calibre/gui2/store/amazon_live.py index 6a778c2bee..4aaba032bc 100644 --- a/src/calibre/gui2/store/amazon_live.py +++ b/src/calibre/gui2/store/amazon_live.py @@ -2,12 +2,12 @@ # License: GPL v3 Copyright: 2022, Kovid Goyal -from lxml import etree, html from urllib.parse import urlencode -from calibre.scraper.simple import read_url -from calibre.gui2.store.search_result import SearchResult +from lxml import etree, html +from calibre.gui2.store.search_result import SearchResult +from calibre.scraper.simple import read_url module_version = 1 # needed for live updates diff --git a/src/calibre/gui2/store/config/chooser/adv_search_builder.py b/src/calibre/gui2/store/config/chooser/adv_search_builder.py index 716c1c88f6..ca6129fddf 100644 --- a/src/calibre/gui2/store/config/chooser/adv_search_builder.py +++ b/src/calibre/gui2/store/config/chooser/adv_search_builder.py @@ -4,7 +4,7 @@ __docformat__ = 'restructuredtext en' import re -from qt.core import (QDialog, QDialogButtonBox) +from qt.core import QDialog, QDialogButtonBox from calibre.gui2.store.config.chooser.adv_search_builder_ui import Ui_Dialog from calibre.library.caches import CONTAINS_MATCH, EQUALS_MATCH diff --git a/src/calibre/gui2/store/config/chooser/chooser_dialog.py b/src/calibre/gui2/store/config/chooser/chooser_dialog.py index d1550251f9..2d379d620a 100644 --- a/src/calibre/gui2/store/config/chooser/chooser_dialog.py +++ b/src/calibre/gui2/store/config/chooser/chooser_dialog.py @@ -2,7 +2,7 @@ __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import (QDialog, QDialogButtonBox, QVBoxLayout) +from qt.core import QDialog, QDialogButtonBox, QVBoxLayout from calibre.gui2.store.config.chooser.chooser_widget import StoreChooserWidget diff --git a/src/calibre/gui2/store/config/chooser/chooser_widget.py b/src/calibre/gui2/store/config/chooser/chooser_widget.py index 275c8808f3..b611b24138 100644 --- a/src/calibre/gui2/store/config/chooser/chooser_widget.py +++ b/src/calibre/gui2/store/config/chooser/chooser_widget.py @@ -2,7 +2,7 @@ __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import QWidget, QIcon, QDialog, QComboBox, QLineEdit +from qt.core import QComboBox, QDialog, QIcon, QLineEdit, QWidget from calibre.gui2.store.config.chooser.adv_search_builder import AdvSearchBuilderDialog from calibre.gui2.store.config.chooser.chooser_widget_ui import Ui_Form diff --git a/src/calibre/gui2/store/config/chooser/models.py b/src/calibre/gui2/store/config/chooser/models.py index 8cf971d327..cb2270109d 100644 --- a/src/calibre/gui2/store/config/chooser/models.py +++ b/src/calibre/gui2/store/config/chooser/models.py @@ -3,9 +3,7 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import ( - QAbstractItemModel, QIcon, QModelIndex, QStyledItemDelegate, Qt -) +from qt.core import QAbstractItemModel, QIcon, QModelIndex, QStyledItemDelegate, Qt from calibre import fit_image from calibre.customize.ui import disable_plugin, enable_plugin, is_disabled diff --git a/src/calibre/gui2/store/config/chooser/results_view.py b/src/calibre/gui2/store/config/chooser/results_view.py index 3eafc6cdd2..50604f5c1f 100644 --- a/src/calibre/gui2/store/config/chooser/results_view.py +++ b/src/calibre/gui2/store/config/chooser/results_view.py @@ -4,11 +4,11 @@ __docformat__ = 'restructuredtext en' from functools import partial -from qt.core import (Qt, QTreeView, QSize, QMenu) +from qt.core import QMenu, QSize, Qt, QTreeView from calibre.customize.ui import store_plugins from calibre.gui2.metadata.single_download import RichTextDelegate -from calibre.gui2.store.config.chooser.models import Matches, Delegate +from calibre.gui2.store.config.chooser.models import Delegate, Matches class ResultsView(QTreeView): diff --git a/src/calibre/gui2/store/loader.py b/src/calibre/gui2/store/loader.py index 19595bde51..cd792ca88c 100644 --- a/src/calibre/gui2/store/loader.py +++ b/src/calibre/gui2/store/loader.py @@ -5,17 +5,20 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, time, io, re -from zlib import decompressobj +import io +import re +import sys +import time from collections import OrderedDict from threading import Thread +from zlib import decompressobj from calibre import prints -from calibre.constants import numeric_version, DEBUG +from calibre.constants import DEBUG, numeric_version from calibre.gui2.store import StorePlugin from calibre.utils.config import JSONConfig -from polyglot.urllib import urlencode from polyglot.builtins import iteritems, itervalues +from polyglot.urllib import urlencode class VersionMismatch(ValueError): diff --git a/src/calibre/gui2/store/opensearch_store.py b/src/calibre/gui2/store/opensearch_store.py index 110ed81e0b..f7c6577e6f 100644 --- a/src/calibre/gui2/store/opensearch_store.py +++ b/src/calibre/gui2/store/opensearch_store.py @@ -6,14 +6,14 @@ from contextlib import closing from qt.core import QUrl -from calibre import (browser, guess_extension) +from calibre import browser, guess_extension from calibre.gui2 import open_url -from calibre.utils.xml_parse import safe_xml_fromstring from calibre.gui2.store import StorePlugin from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog from calibre.utils.opensearch.description import Description from calibre.utils.opensearch.query import Query +from calibre.utils.xml_parse import safe_xml_fromstring def open_search(url, query, max_results=10, timeout=60): diff --git a/src/calibre/gui2/store/search/adv_search_builder.py b/src/calibre/gui2/store/search/adv_search_builder.py index a0b6c08ead..c6442c89ec 100644 --- a/src/calibre/gui2/store/search/adv_search_builder.py +++ b/src/calibre/gui2/store/search/adv_search_builder.py @@ -4,7 +4,7 @@ __docformat__ = 'restructuredtext en' import re -from qt.core import (QDialog, QDialogButtonBox) +from qt.core import QDialog, QDialogButtonBox from calibre.gui2.store.search.adv_search_builder_ui import Ui_Dialog from calibre.library.caches import CONTAINS_MATCH, EQUALS_MATCH diff --git a/src/calibre/gui2/store/search/download_thread.py b/src/calibre/gui2/store/search/download_thread.py index dbe3dcdf72..d34d889459 100644 --- a/src/calibre/gui2/store/search/download_thread.py +++ b/src/calibre/gui2/store/search/download_thread.py @@ -9,8 +9,8 @@ from threading import Thread from calibre import browser from calibre.constants import DEBUG from calibre.utils.img import scale_image -from polyglot.queue import Queue from polyglot.binary import from_base64_bytes +from polyglot.queue import Queue class GenericDownloadThreadPool: diff --git a/src/calibre/gui2/store/search/models.py b/src/calibre/gui2/store/search/models.py index 5dffa9a283..9cbdbf9e5d 100644 --- a/src/calibre/gui2/store/search/models.py +++ b/src/calibre/gui2/store/search/models.py @@ -5,16 +5,15 @@ __docformat__ = 'restructuredtext en' import re import string from operator import attrgetter -from qt.core import ( - QAbstractItemModel, QApplication, QIcon, QModelIndex, QPixmap, QSize, Qt, - pyqtSignal, -) + +from qt.core import QAbstractItemModel, QApplication, QIcon, QModelIndex, QPixmap, QSize, Qt, pyqtSignal from calibre import force_unicode from calibre.gui2 import FunctionDispatcher from calibre.gui2.store.search.download_thread import CoverThreadPool, DetailsThreadPool from calibre.gui2.store.search_result import SearchResult -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from calibre.utils.localization import pgettext from calibre.utils.search_query_parser import SearchQueryParser diff --git a/src/calibre/gui2/store/search/results_view.py b/src/calibre/gui2/store/search/results_view.py index b449521e60..cb3c5f163f 100644 --- a/src/calibre/gui2/store/search/results_view.py +++ b/src/calibre/gui2/store/search/results_view.py @@ -4,8 +4,7 @@ __docformat__ = 'restructuredtext en' from functools import partial -from qt.core import ( - pyqtSignal, QMenu, QTreeView, QStyledItemDelegate, Qt, QIcon) +from qt.core import QIcon, QMenu, QStyledItemDelegate, Qt, QTreeView, pyqtSignal from calibre import fit_image from calibre.gui2 import empty_index diff --git a/src/calibre/gui2/store/search/search.py b/src/calibre/gui2/store/search/search.py index f2f9a3aa84..9b870884ca 100644 --- a/src/calibre/gui2/store/search/search.py +++ b/src/calibre/gui2/store/search/search.py @@ -5,18 +5,16 @@ __docformat__ = 'restructuredtext en' import re from random import shuffle -from qt.core import (Qt, QDialog, QDialogButtonBox, QTimer, QCheckBox, QLabel, - QVBoxLayout, QIcon, QWidget, QTabWidget, QGridLayout, QSize, QStyle) +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QSize, QStyle, Qt, QTabWidget, QTimer, QVBoxLayout, QWidget -from calibre.gui2 import JSONConfig, info_dialog, error_dialog +from calibre.gui2 import JSONConfig, error_dialog, info_dialog from calibre.gui2.dialogs.choose_format import ChooseFormatDialog from calibre.gui2.ebook_download import show_download_info from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.store.config.chooser.chooser_widget import StoreChooserWidget from calibre.gui2.store.config.search.search_widget import StoreConfigWidget from calibre.gui2.store.search.adv_search_builder import AdvSearchBuilderDialog -from calibre.gui2.store.search.download_thread import SearchThreadPool, \ - CacheUpdateThreadPool +from calibre.gui2.store.search.download_thread import CacheUpdateThreadPool, SearchThreadPool from calibre.gui2.store.search.search_ui import Ui_Dialog from calibre.utils.filenames import ascii_filename @@ -451,9 +449,10 @@ class SearchDialog(QDialog, Ui_Dialog): if __name__ == '__main__': + import sys + from calibre.gui2 import Application from calibre.gui2.preferences.main import init_gui - import sys app = Application([]) app gui = init_gui() diff --git a/src/calibre/gui2/store/stores/amazon_au_plugin.py b/src/calibre/gui2/store/stores/amazon_au_plugin.py index 347e6e5fd3..4833411558 100644 --- a/src/calibre/gui2/store/stores/amazon_au_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_au_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 20 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_ca_plugin.py b/src/calibre/gui2/store/stores/amazon_ca_plugin.py index 1bacb9342c..31770ea66a 100644 --- a/src/calibre/gui2/store/stores/amazon_ca_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_ca_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 20 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_de_plugin.py b/src/calibre/gui2/store/stores/amazon_de_plugin.py index 491f2538fb..17c64fae3a 100644 --- a/src/calibre/gui2/store/stores/amazon_de_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_de_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 16 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_es_plugin.py b/src/calibre/gui2/store/stores/amazon_es_plugin.py index d9fca8e33c..64a2620d07 100644 --- a/src/calibre/gui2/store/stores/amazon_es_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_es_plugin.py @@ -6,13 +6,13 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 15 # Needed for dynamic plugin loading from contextlib import closing + try: from urllib.parse import urlencode except ImportError: from urllib import urlencode from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/amazon_fr_plugin.py b/src/calibre/gui2/store/stores/amazon_fr_plugin.py index f61624fbd9..b198da66be 100644 --- a/src/calibre/gui2/store/stores/amazon_fr_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_fr_plugin.py @@ -6,13 +6,13 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 16 # Needed for dynamic plugin loading from contextlib import closing + try: from urllib.parse import urlencode except ImportError: from urllib import urlencode -from lxml import html, etree - +from lxml import etree, html from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/amazon_in_plugin.py b/src/calibre/gui2/store/stores/amazon_in_plugin.py index 18fcd72c59..46894cdb1a 100644 --- a/src/calibre/gui2/store/stores/amazon_in_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_in_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 20 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_it_plugin.py b/src/calibre/gui2/store/stores/amazon_it_plugin.py index 58c72083fa..c7c2617729 100644 --- a/src/calibre/gui2/store/stores/amazon_it_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_it_plugin.py @@ -6,13 +6,13 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 15 # Needed for dynamic plugin loading from contextlib import closing + try: from urllib.parse import urlencode except ImportError: from urllib import urlencode from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/amazon_mx_plugin.py b/src/calibre/gui2/store/stores/amazon_mx_plugin.py index c648384600..1a334cec97 100644 --- a/src/calibre/gui2/store/stores/amazon_mx_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_mx_plugin.py @@ -5,6 +5,7 @@ store_version = 1 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_plugin.py b/src/calibre/gui2/store/stores/amazon_plugin.py index 605efb3b44..9b2c2aa477 100644 --- a/src/calibre/gui2/store/stores/amazon_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 20 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/amazon_uk_plugin.py b/src/calibre/gui2/store/stores/amazon_uk_plugin.py index 76a9615902..8a9c462134 100644 --- a/src/calibre/gui2/store/stores/amazon_uk_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_uk_plugin.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 20 # Needed for dynamic plugin loading from calibre.gui2.store import StorePlugin + try: from calibre.gui2.store.amazon_base import AmazonStore except ImportError: diff --git a/src/calibre/gui2/store/stores/baen_webscription_plugin.py b/src/calibre/gui2/store/stores/baen_webscription_plugin.py index d56b7243e9..b13d9ba674 100644 --- a/src/calibre/gui2/store/stores/baen_webscription_plugin.py +++ b/src/calibre/gui2/store/stores/baen_webscription_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import urlencode except ImportError: from urllib import urlencode from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/beam_ebooks_de_plugin.py b/src/calibre/gui2/store/stores/beam_ebooks_de_plugin.py index 1875e890fe..a296fb361b 100644 --- a/src/calibre/gui2/store/stores/beam_ebooks_de_plugin.py +++ b/src/calibre/gui2/store/stores/beam_ebooks_de_plugin.py @@ -14,7 +14,6 @@ except ImportError: from contextlib import closing from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/biblio_plugin.py b/src/calibre/gui2/store/stores/biblio_plugin.py index 63e7096857..d2ade944f5 100644 --- a/src/calibre/gui2/store/stores/biblio_plugin.py +++ b/src/calibre/gui2/store/stores/biblio_plugin.py @@ -12,14 +12,16 @@ try: except ImportError: from urllib import quote_plus +from contextlib import closing + +from lxml import html + from calibre import browser from calibre.gui2 import open_url -from calibre.gui2.store.basic_config import BasicStoreConfig from calibre.gui2.store import StorePlugin +from calibre.gui2.store.basic_config import BasicStoreConfig from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog -from contextlib import closing -from lxml import html class BiblioStore(BasicStoreConfig, StorePlugin): diff --git a/src/calibre/gui2/store/stores/bn_plugin.py b/src/calibre/gui2/store/stores/bn_plugin.py index 82201eddcd..d4eacf5cbc 100644 --- a/src/calibre/gui2/store/stores/bn_plugin.py +++ b/src/calibre/gui2/store/stores/bn_plugin.py @@ -5,13 +5,13 @@ from __future__ import absolute_import, division, print_function, unicode_litera store_version = 4 # Needed for dynamic plugin loading from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner @@ -22,7 +22,6 @@ from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog - def search_bn(query, max_results=10, timeout=60, write_html_to=''): url = 'https://www.barnesandnoble.com/s/%s?keyword=%s&store=ebook&view=list' % (query.replace(' ', '-'), quote_plus(query)) diff --git a/src/calibre/gui2/store/stores/bubok_portugal_plugin.py b/src/calibre/gui2/store/stores/bubok_portugal_plugin.py index 603afda8b1..8919e62d5c 100644 --- a/src/calibre/gui2/store/stores/bubok_portugal_plugin.py +++ b/src/calibre/gui2/store/stores/bubok_portugal_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2014, Rafael Vega ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/bubok_publishing_plugin.py b/src/calibre/gui2/store/stores/bubok_publishing_plugin.py index 5d9da5b50d..3edcecff3c 100644 --- a/src/calibre/gui2/store/stores/bubok_publishing_plugin.py +++ b/src/calibre/gui2/store/stores/bubok_publishing_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2014, Rafael Vega ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/chitanka_plugin.py b/src/calibre/gui2/store/stores/chitanka_plugin.py index 27da2ef28c..29fa910f3e 100644 --- a/src/calibre/gui2/store/stores/chitanka_plugin.py +++ b/src/calibre/gui2/store/stores/chitanka_plugin.py @@ -8,14 +8,14 @@ __copyright__ = '2011, Alex Stanev ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: - from urllib.parse import quote from urllib.error import HTTPError + from urllib.parse import quote except ImportError: - from urllib2 import quote, HTTPError + from urllib2 import HTTPError, quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/ebook_nl_plugin.py b/src/calibre/gui2/store/stores/ebook_nl_plugin.py index 8a3e053d25..a739333660 100644 --- a/src/calibre/gui2/store/stores/ebook_nl_plugin.py +++ b/src/calibre/gui2/store/stores/ebook_nl_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/ebookpoint_plugin.py b/src/calibre/gui2/store/stores/ebookpoint_plugin.py index 359dcd40c4..4f6ed24624 100644 --- a/src/calibre/gui2/store/stores/ebookpoint_plugin.py +++ b/src/calibre/gui2/store/stores/ebookpoint_plugin.py @@ -10,13 +10,13 @@ __docformat__ = 'restructuredtext en' import re from base64 import b64encode from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/ebookshoppe_uk_plugin.py b/src/calibre/gui2/store/stores/ebookshoppe_uk_plugin.py index 9fd8cbebdf..d9259366da 100644 --- a/src/calibre/gui2/store/stores/ebookshoppe_uk_plugin.py +++ b/src/calibre/gui2/store/stores/ebookshoppe_uk_plugin.py @@ -14,7 +14,6 @@ except ImportError: from contextlib import closing from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/empik_plugin.py b/src/calibre/gui2/store/stores/empik_plugin.py index 3280b2f2ce..a75c0c0e2e 100644 --- a/src/calibre/gui2/store/stores/empik_plugin.py +++ b/src/calibre/gui2/store/stores/empik_plugin.py @@ -9,13 +9,13 @@ __docformat__ = 'restructuredtext en' from base64 import b64encode from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/google_books_plugin.py b/src/calibre/gui2/store/stores/google_books_plugin.py index f81ca04099..63bcea6b89 100644 --- a/src/calibre/gui2/store/stores/google_books_plugin.py +++ b/src/calibre/gui2/store/stores/google_books_plugin.py @@ -8,6 +8,7 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: diff --git a/src/calibre/gui2/store/stores/gutenberg_plugin.py b/src/calibre/gui2/store/stores/gutenberg_plugin.py index 403d214614..f54748d22d 100644 --- a/src/calibre/gui2/store/stores/gutenberg_plugin.py +++ b/src/calibre/gui2/store/stores/gutenberg_plugin.py @@ -11,6 +11,7 @@ try: except ImportError: from urllib import quote_plus +from css_selectors import Select from html5_parser import parse from lxml import etree @@ -19,7 +20,6 @@ from calibre.gui2 import open_url from calibre.gui2.store import StorePlugin from calibre.gui2.store.search_result import SearchResult from calibre.gui2.store.web_store_dialog import WebStoreDialog -from css_selectors import Select def absurl(href): diff --git a/src/calibre/gui2/store/stores/legimi_plugin.py b/src/calibre/gui2/store/stores/legimi_plugin.py index 6d23ea4f23..2262f0edf4 100644 --- a/src/calibre/gui2/store/stores/legimi_plugin.py +++ b/src/calibre/gui2/store/stores/legimi_plugin.py @@ -9,13 +9,13 @@ __docformat__ = 'restructuredtext en' from base64 import b64encode from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/libri_de_plugin.py b/src/calibre/gui2/store/stores/libri_de_plugin.py index f3cbe7bc4a..ec65035726 100644 --- a/src/calibre/gui2/store/stores/libri_de_plugin.py +++ b/src/calibre/gui2/store/stores/libri_de_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser diff --git a/src/calibre/gui2/store/stores/litres_plugin.py b/src/calibre/gui2/store/stores/litres_plugin.py index 5fb5310870..51a231692c 100644 --- a/src/calibre/gui2/store/stores/litres_plugin.py +++ b/src/calibre/gui2/store/stores/litres_plugin.py @@ -9,16 +9,18 @@ __docformat__ = 'restructuredtext en' import random import re + try: from urllib.parse import quote except ImportError: from urllib import quote from contextlib import closing + from lxml import etree from qt.core import QUrl -from calibre import browser, url_slash_cleaner, prints +from calibre import browser, prints, url_slash_cleaner from calibre.ebooks.chardet import xml_to_unicode from calibre.gui2 import open_url from calibre.gui2.store import StorePlugin diff --git a/src/calibre/gui2/store/stores/mills_boon_uk_plugin.py b/src/calibre/gui2/store/stores/mills_boon_uk_plugin.py index 6ab36e07c3..19e9647980 100644 --- a/src/calibre/gui2/store/stores/mills_boon_uk_plugin.py +++ b/src/calibre/gui2/store/stores/mills_boon_uk_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/mobileread/adv_search_builder.py b/src/calibre/gui2/store/stores/mobileread/adv_search_builder.py index dbabd496eb..8ea8dbea80 100644 --- a/src/calibre/gui2/store/stores/mobileread/adv_search_builder.py +++ b/src/calibre/gui2/store/stores/mobileread/adv_search_builder.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' import re -from qt.core import (QDialog, QDialogButtonBox) +from qt.core import QDialog, QDialogButtonBox from calibre.gui2.store.stores.mobileread.adv_search_builder_ui import Ui_Dialog from calibre.library.caches import CONTAINS_MATCH, EQUALS_MATCH diff --git a/src/calibre/gui2/store/stores/mobileread/cache_progress_dialog.py b/src/calibre/gui2/store/stores/mobileread/cache_progress_dialog.py index bf3fa4017c..d2f982c203 100644 --- a/src/calibre/gui2/store/stores/mobileread/cache_progress_dialog.py +++ b/src/calibre/gui2/store/stores/mobileread/cache_progress_dialog.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' diff --git a/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py b/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py index 4a410e684f..e696e9da85 100644 --- a/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py +++ b/src/calibre/gui2/store/stores/mobileread/cache_update_thread.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' @@ -11,8 +10,7 @@ from contextlib import closing from threading import Thread from lxml import html - -from qt.core import (pyqtSignal, QObject) +from qt.core import QObject, pyqtSignal from calibre import browser from calibre.gui2.store.search_result import SearchResult diff --git a/src/calibre/gui2/store/stores/mobileread/mobileread_plugin.py b/src/calibre/gui2/store/stores/mobileread/mobileread_plugin.py index 470239ecdd..ed4062d067 100644 --- a/src/calibre/gui2/store/stores/mobileread/mobileread_plugin.py +++ b/src/calibre/gui2/store/stores/mobileread/mobileread_plugin.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' @@ -9,18 +8,18 @@ __docformat__ = 'restructuredtext en' import os from threading import Lock -from qt.core import (QUrl, QCoreApplication) +from qt.core import QCoreApplication, QUrl from calibre.constants import cache_dir from calibre.gui2 import open_url from calibre.gui2.store import StorePlugin from calibre.gui2.store.basic_config import BasicStoreConfig from calibre.gui2.store.search_result import SearchResult -from calibre.gui2.store.web_store_dialog import WebStoreDialog -from calibre.gui2.store.stores.mobileread.models import SearchFilter from calibre.gui2.store.stores.mobileread.cache_progress_dialog import CacheProgressDialog from calibre.gui2.store.stores.mobileread.cache_update_thread import CacheUpdateThread +from calibre.gui2.store.stores.mobileread.models import SearchFilter from calibre.gui2.store.stores.mobileread.store_dialog import MobileReadStoreDialog +from calibre.gui2.store.web_store_dialog import WebStoreDialog class MobileReadStore(BasicStoreConfig, StorePlugin): diff --git a/src/calibre/gui2/store/stores/mobileread/models.py b/src/calibre/gui2/store/stores/mobileread/models.py index 35a391074a..bed3d263a0 100644 --- a/src/calibre/gui2/store/stores/mobileread/models.py +++ b/src/calibre/gui2/store/stores/mobileread/models.py @@ -1,16 +1,15 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from operator import attrgetter -from qt.core import (Qt, QAbstractItemModel, QModelIndex, pyqtSignal) +from qt.core import QAbstractItemModel, QModelIndex, Qt, pyqtSignal -from calibre.db.search import _match, CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH +from calibre.db.search import CONTAINS_MATCH, EQUALS_MATCH, REGEXP_MATCH, _match from calibre.utils.config_base import prefs from calibre.utils.icu import sort_key from calibre.utils.search_query_parser import SearchQueryParser diff --git a/src/calibre/gui2/store/stores/mobileread/store_dialog.py b/src/calibre/gui2/store/stores/mobileread/store_dialog.py index c62efd1acd..8bc88d5bc0 100644 --- a/src/calibre/gui2/store/stores/mobileread/store_dialog.py +++ b/src/calibre/gui2/store/stores/mobileread/store_dialog.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function, unicode_literals - __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from qt.core import Qt, QDialog, QIcon, QComboBox +from qt.core import QComboBox, QDialog, QIcon, Qt from calibre.gui2.store.stores.mobileread.adv_search_builder import AdvSearchBuilderDialog from calibre.gui2.store.stores.mobileread.models import BooksModel diff --git a/src/calibre/gui2/store/stores/nexto_plugin.py b/src/calibre/gui2/store/stores/nexto_plugin.py index be746b9bbb..162c6f3f48 100644 --- a/src/calibre/gui2/store/stores/nexto_plugin.py +++ b/src/calibre/gui2/store/stores/nexto_plugin.py @@ -8,15 +8,15 @@ __copyright__ = '2011-2023, Tomasz Długosz ' __docformat__ = 'restructuredtext en' import re -from contextlib import closing from base64 import standard_b64encode +from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/ozon_ru_plugin.py b/src/calibre/gui2/store/stores/ozon_ru_plugin.py index 57fc4123fc..abc48a7164 100644 --- a/src/calibre/gui2/store/stores/ozon_ru_plugin.py +++ b/src/calibre/gui2/store/stores/ozon_ru_plugin.py @@ -8,6 +8,7 @@ __copyright__ = '2011-2013, Roman Mukhin ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: diff --git a/src/calibre/gui2/store/stores/publio_plugin.py b/src/calibre/gui2/store/stores/publio_plugin.py index b351590ae4..f273b159db 100644 --- a/src/calibre/gui2/store/stores/publio_plugin.py +++ b/src/calibre/gui2/store/stores/publio_plugin.py @@ -15,7 +15,6 @@ from base64 import b64encode from contextlib import closing from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/rw2010_plugin.py b/src/calibre/gui2/store/stores/rw2010_plugin.py index ae9173ee30..6a4317678c 100644 --- a/src/calibre/gui2/store/stores/rw2010_plugin.py +++ b/src/calibre/gui2/store/stores/rw2010_plugin.py @@ -9,13 +9,13 @@ __docformat__ = 'restructuredtext en' import re from contextlib import closing + try: from urllib.parse import urlencode except ImportError: from urllib import urlencode from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/smashwords_plugin.py b/src/calibre/gui2/store/stores/smashwords_plugin.py index 4c0da7feea..33f789d471 100644 --- a/src/calibre/gui2/store/stores/smashwords_plugin.py +++ b/src/calibre/gui2/store/stores/smashwords_plugin.py @@ -10,13 +10,13 @@ __docformat__ = 'restructuredtext en' import random import re from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/swiatebookow_plugin.py b/src/calibre/gui2/store/stores/swiatebookow_plugin.py index 2e863a36ad..64ebce1465 100644 --- a/src/calibre/gui2/store/stores/swiatebookow_plugin.py +++ b/src/calibre/gui2/store/stores/swiatebookow_plugin.py @@ -9,13 +9,13 @@ __docformat__ = 'restructuredtext en' from base64 import b64encode from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/virtualo_plugin.py b/src/calibre/gui2/store/stores/virtualo_plugin.py index d5da180538..9a23544745 100644 --- a/src/calibre/gui2/store/stores/virtualo_plugin.py +++ b/src/calibre/gui2/store/stores/virtualo_plugin.py @@ -10,13 +10,13 @@ __docformat__ = 'restructuredtext en' import re from base64 import b64encode from contextlib import closing + try: from urllib.parse import quote except ImportError: from urllib import quote from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/weightless_books_plugin.py b/src/calibre/gui2/store/stores/weightless_books_plugin.py index 55adb42b7c..27f957feb8 100644 --- a/src/calibre/gui2/store/stores/weightless_books_plugin.py +++ b/src/calibre/gui2/store/stores/weightless_books_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/stores/woblink_plugin.py b/src/calibre/gui2/store/stores/woblink_plugin.py index 50aff52a54..197db7a8a7 100644 --- a/src/calibre/gui2/store/stores/woblink_plugin.py +++ b/src/calibre/gui2/store/stores/woblink_plugin.py @@ -8,17 +8,17 @@ __copyright__ = '2011-2019, Tomasz Długosz ' __docformat__ = 'restructuredtext en' from base64 import b64encode + try: - from urllib.parse import urlencode, quote_plus + from urllib.parse import quote_plus, urlencode except ImportError: - from urllib import urlencode, quote_plus + from urllib import quote_plus, urlencode from lxml import html from mechanize import Request - from qt.core import QUrl -from calibre import url_slash_cleaner, browser +from calibre import browser, url_slash_cleaner from calibre.gui2 import open_url from calibre.gui2.store import StorePlugin from calibre.gui2.store.basic_config import BasicStoreConfig diff --git a/src/calibre/gui2/store/stores/wolnelektury_plugin.py b/src/calibre/gui2/store/stores/wolnelektury_plugin.py index 04bcfa8b95..573031993e 100644 --- a/src/calibre/gui2/store/stores/wolnelektury_plugin.py +++ b/src/calibre/gui2/store/stores/wolnelektury_plugin.py @@ -8,13 +8,13 @@ __copyright__ = '2012-2023, Tomasz Długosz ' __docformat__ = 'restructuredtext en' from contextlib import closing + try: from urllib.parse import quote_plus except ImportError: from urllib import quote_plus from lxml import html - from qt.core import QUrl from calibre import browser, url_slash_cleaner diff --git a/src/calibre/gui2/store/web_store.py b/src/calibre/gui2/store/web_store.py index 89a1da1309..14a3be9490 100644 --- a/src/calibre/gui2/store/web_store.py +++ b/src/calibre/gui2/store/web_store.py @@ -5,20 +5,14 @@ import json import os import shutil -from qt.core import ( - QApplication, QHBoxLayout, QIcon, QLabel, QProgressBar, QPushButton, QSize, QUrl, - QVBoxLayout, QWidget, pyqtSignal, -) -from qt.webengine import ( - QWebEngineDownloadRequest, QWebEnginePage, QWebEngineProfile, QWebEngineView, -) + +from qt.core import QApplication, QHBoxLayout, QIcon, QLabel, QProgressBar, QPushButton, QSize, QUrl, QVBoxLayout, QWidget, pyqtSignal +from qt.webengine import QWebEngineDownloadRequest, QWebEnginePage, QWebEngineProfile, QWebEngineView from calibre import random_user_agent, url_slash_cleaner from calibre.constants import STORE_DIALOG_APP_UID, islinux, iswindows from calibre.ebooks import BOOK_EXTENSIONS -from calibre.gui2 import ( - Application, choose_save_file, error_dialog, gprefs, info_dialog, set_app_uid, -) +from calibre.gui2 import Application, choose_save_file, error_dialog, gprefs, info_dialog, set_app_uid from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.listener import send_message_in_process from calibre.gui2.main_window import MainWindow diff --git a/src/calibre/gui2/tag_browser/model.py b/src/calibre/gui2/tag_browser/model.py index 96f049bfe0..ba9721e230 100644 --- a/src/calibre/gui2/tag_browser/model.py +++ b/src/calibre/gui2/tag_browser/model.py @@ -9,24 +9,20 @@ import copy import os import traceback from collections import OrderedDict, namedtuple -from qt.core import ( - QAbstractItemModel, QFont, QIcon, QMimeData, QModelIndex, QObject, Qt, pyqtSignal, -) + +from qt.core import QAbstractItemModel, QFont, QIcon, QMimeData, QModelIndex, QObject, Qt, pyqtSignal from calibre.constants import config_dir from calibre.db.categories import Tag, category_display_order from calibre.ebooks.metadata import rating_to_stars -from calibre.gui2 import ( - config, error_dialog, file_icon_provider, gprefs, question_dialog, -) +from calibre.gui2 import config, error_dialog, file_icon_provider, gprefs, question_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.library.field_metadata import category_icon_map from calibre.utils.config import prefs, tweaks from calibre.utils.formatter import EvalFormatter -from calibre.utils.icu import ( - collation_order_for_partitioning, contains, lower, lower as icu_lower, - primary_contains, primary_strcmp, sort_key, strcmp, upper as icu_upper, -) +from calibre.utils.icu import collation_order_for_partitioning, contains, lower, primary_contains, primary_strcmp, sort_key, strcmp +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper from calibre.utils.serialize import json_dumps, json_loads from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index 7ff8419ec7..56837b1fc9 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -8,9 +8,24 @@ __docformat__ = 'restructuredtext en' import copy import textwrap from functools import partial + from qt.core import ( - QAction, QActionGroup, QComboBox, QDialog, QFrame, QHBoxLayout, QIcon, QLabel, - QLineEdit, QMenu, QSizePolicy, Qt, QTimer, QToolButton, QVBoxLayout, QWidget, + QAction, + QActionGroup, + QComboBox, + QDialog, + QFrame, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QMenu, + QSizePolicy, + Qt, + QTimer, + QToolButton, + QVBoxLayout, + QWidget, pyqtSignal, ) diff --git a/src/calibre/gui2/tag_browser/view.py b/src/calibre/gui2/tag_browser/view.py index 53ca5edbef..623b7db857 100644 --- a/src/calibre/gui2/tag_browser/view.py +++ b/src/calibre/gui2/tag_browser/view.py @@ -11,26 +11,43 @@ import traceback from collections import defaultdict from contextlib import suppress from functools import partial + from qt.core import ( - QAbstractItemView, QApplication, QBrush, QColor, QCursor, QDialog, QDrag, QFont, QIcon, - QLinearGradient, QMenu, QModelIndex, QPalette, QPen, QPoint, QPointF, QRect, QSize, - QStyle, QStyledItemDelegate, QStyleOptionViewItem, Qt, QTimer, QToolTip, QTreeView, + QAbstractItemView, + QApplication, + QBrush, + QColor, + QCursor, + QDialog, + QDrag, + QFont, + QIcon, + QLinearGradient, + QMenu, + QModelIndex, + QPalette, + QPen, + QPoint, + QPointF, + QRect, + QSize, + QStyle, + QStyledItemDelegate, + QStyleOptionViewItem, + Qt, + QTimer, + QToolTip, + QTreeView, pyqtSignal, ) from calibre import sanitize_file_name from calibre.constants import config_dir from calibre.ebooks.metadata import rating_to_stars -from calibre.gui2 import ( - FunctionDispatcher, choose_files, config, empty_index, gprefs, pixmap_to_data, - question_dialog, rating_font, safe_open_url, -) -from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog +from calibre.gui2 import FunctionDispatcher, choose_files, config, empty_index, gprefs, pixmap_to_data, question_dialog, rating_font, safe_open_url from calibre.gui2.complete2 import EditWithComplete -from calibre.gui2.tag_browser.model import ( - COUNT_ROLE, DRAG_IMAGE_ROLE, TAG_SEARCH_STATES, TagsModel, TagTreeItem, - rename_only_in_vl_question, -) +from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog +from calibre.gui2.tag_browser.model import COUNT_ROLE, DRAG_IMAGE_ROLE, TAG_SEARCH_STATES, TagsModel, TagTreeItem, rename_only_in_vl_question from calibre.gui2.widgets import EnLineEdit from calibre.utils.icu import sort_key from calibre.utils.serialize import json_loads diff --git a/src/calibre/gui2/tag_mapper.py b/src/calibre/gui2/tag_mapper.py index 001aa2324f..a50105b853 100644 --- a/src/calibre/gui2/tag_mapper.py +++ b/src/calibre/gui2/tag_mapper.py @@ -4,11 +4,32 @@ import textwrap from collections import OrderedDict + from qt.core import ( - QAbstractItemView, QComboBox, QDialog, QDialogButtonBox, QHBoxLayout, QIcon, - QInputDialog, QItemSelectionModel, QLabel, QLineEdit, QListWidget, QListWidgetItem, - QMenu, QPalette, QPushButton, QSize, QStaticText, QStyle, QStyledItemDelegate, Qt, - QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QComboBox, + QDialog, + QDialogButtonBox, + QHBoxLayout, + QIcon, + QInputDialog, + QItemSelectionModel, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QPalette, + QPushButton, + QSize, + QStaticText, + QStyle, + QStyledItemDelegate, + Qt, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.ebooks.metadata.tag_mapper import compile_pat, map_tags diff --git a/src/calibre/gui2/threaded_jobs.py b/src/calibre/gui2/threaded_jobs.py index 793e24a11b..57bc175ada 100644 --- a/src/calibre/gui2/threaded_jobs.py +++ b/src/calibre/gui2/threaded_jobs.py @@ -5,12 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, time, tempfile, json -from threading import Thread, RLock, Event +import json +import os +import tempfile +import time +from threading import Event, RLock, Thread +from calibre.ptempfile import base_dir from calibre.utils.ipc.job import BaseJob from calibre.utils.logging import GUILog -from calibre.ptempfile import base_dir from polyglot.queue import Queue @@ -164,6 +167,7 @@ class ThreadedJobWorker(Thread): self.job.start_work() except: import traceback + from calibre import prints prints('Job had unhandled exception:', self.job.description) traceback.print_exc() diff --git a/src/calibre/gui2/throbber.py b/src/calibre/gui2/throbber.py index f890d21f99..89b6eccea9 100644 --- a/src/calibre/gui2/throbber.py +++ b/src/calibre/gui2/throbber.py @@ -7,8 +7,20 @@ __docformat__ = 'restructuredtext en' from qt.core import ( - QToolButton, QSize, QPropertyAnimation, Qt, QMetaObject, pyqtProperty, QSizePolicy, - QWidget, QIcon, QPainter, QStyleOptionToolButton, QStyle, QAbstractAnimation) + QAbstractAnimation, + QIcon, + QMetaObject, + QPainter, + QPropertyAnimation, + QSize, + QSizePolicy, + QStyle, + QStyleOptionToolButton, + Qt, + QToolButton, + QWidget, + pyqtProperty, +) from calibre.gui2 import config diff --git a/src/calibre/gui2/toc/location.py b/src/calibre/gui2/toc/location.py index e67eec1527..313ff1b5c0 100644 --- a/src/calibre/gui2/toc/location.py +++ b/src/calibre/gui2/toc/location.py @@ -7,15 +7,33 @@ import os import sys import weakref from functools import lru_cache + from qt.core import ( - QApplication, QByteArray, QFrame, QGridLayout, QIcon, QLabel, QLineEdit, - QListWidget, QPushButton, QSize, QSplitter, Qt, QUrl, QVBoxLayout, QWidget, + QApplication, + QByteArray, + QFrame, + QGridLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QPushButton, + QSize, + QSplitter, + Qt, + QUrl, + QVBoxLayout, + QWidget, pyqtSignal, ) from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, - QWebEngineUrlRequestInterceptor, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler, QWebEngineView, + QWebEnginePage, + QWebEngineProfile, + QWebEngineScript, + QWebEngineUrlRequestInterceptor, + QWebEngineUrlRequestJob, + QWebEngineUrlSchemeHandler, + QWebEngineView, ) from calibre.constants import FAKE_HOST, FAKE_PROTOCOL diff --git a/src/calibre/gui2/toc/main.py b/src/calibre/gui2/toc/main.py index 6c9734c4b8..4ead1e444a 100644 --- a/src/calibre/gui2/toc/main.py +++ b/src/calibre/gui2/toc/main.py @@ -7,20 +7,42 @@ import sys import tempfile import textwrap from functools import partial -from qt.core import ( - QAbstractItemView, QCheckBox, QCursor, QDialog, QDialogButtonBox, QEvent, QFrame, - QGridLayout, QIcon, QInputDialog, QItemSelectionModel, QKeySequence, QLabel, QMenu, - QPushButton, QScrollArea, QSize, QSizePolicy, QStackedWidget, Qt, QTimer, - QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread from time import monotonic +from qt.core import ( + QAbstractItemView, + QCheckBox, + QCursor, + QDialog, + QDialogButtonBox, + QEvent, + QFrame, + QGridLayout, + QIcon, + QInputDialog, + QItemSelectionModel, + QKeySequence, + QLabel, + QMenu, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QStackedWidget, + Qt, + QTimer, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre.constants import TOC_DIALOG_APP_UID, islinux, ismacos, iswindows from calibre.ebooks.oeb.polish.container import AZW3Container, get_container -from calibre.ebooks.oeb.polish.toc import ( - TOC, add_id, commit_toc, from_files, from_links, from_xpaths, get_toc, -) +from calibre.ebooks.oeb.polish.toc import TOC, add_id, commit_toc, from_files, from_links, from_xpaths, get_toc from calibre.gui2 import Application, error_dialog, info_dialog, set_app_uid from calibre.gui2.convert.xpath_wizard import XPathEdit from calibre.gui2.progress_indicator import ProgressIndicator @@ -29,7 +51,8 @@ from calibre.ptempfile import reset_base_dir from calibre.startup import connect_lambda from calibre.utils.config import JSONConfig from calibre.utils.filenames import atomic_rename -from calibre.utils.icu import lower as icu_lower, upper as icu_upper +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper from calibre.utils.logging import GUILog ICON_SIZE = 24 diff --git a/src/calibre/gui2/tools.py b/src/calibre/gui2/tools.py index 9159eed9ea..994766415a 100644 --- a/src/calibre/gui2/tools.py +++ b/src/calibre/gui2/tools.py @@ -13,17 +13,22 @@ import os from qt.core import QDialog, QProgressDialog, QTimer -from calibre.ptempfile import PersistentTemporaryFile -from calibre.gui2 import warning_dialog, question_dialog -from calibre.gui2.convert.single import Config as SingleConfig -from calibre.gui2.convert.bulk import BulkConfig -from calibre.gui2.convert.metadata import create_opf_file, create_cover_file from calibre.customize.conversion import OptionRecommendation -from calibre.utils.config import prefs from calibre.ebooks.conversion.config import ( - GuiRecommendations, load_defaults, load_specifics, save_specifics, - get_input_format_for_book, NoSupportedInputFormats) + GuiRecommendations, + NoSupportedInputFormats, + get_input_format_for_book, + load_defaults, + load_specifics, + save_specifics, +) +from calibre.gui2 import question_dialog, warning_dialog from calibre.gui2.convert import bulk_defaults_for_input_format +from calibre.gui2.convert.bulk import BulkConfig +from calibre.gui2.convert.metadata import create_cover_file, create_opf_file +from calibre.gui2.convert.single import Config as SingleConfig +from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.config import prefs from polyglot.builtins import as_bytes diff --git a/src/calibre/gui2/trash.py b/src/calibre/gui2/trash.py index d10101c9e2..1b98465d7f 100644 --- a/src/calibre/gui2/trash.py +++ b/src/calibre/gui2/trash.py @@ -4,16 +4,34 @@ import time import traceback from operator import attrgetter -from qt.core import ( - QAbstractItemView, QDialogButtonBox, QHBoxLayout, QIcon, QLabel, QListWidget, - QListWidgetItem, QMenu, QPainter, QPalette, QPixmap, QRectF, QSize, QSpinBox, - QStyle, QStyledItemDelegate, Qt, QTabWidget, QVBoxLayout, pyqtSignal, -) from typing import Iterator, List +from qt.core import ( + QAbstractItemView, + QDialogButtonBox, + QHBoxLayout, + QIcon, + QLabel, + QListWidget, + QListWidgetItem, + QMenu, + QPainter, + QPalette, + QPixmap, + QRectF, + QSize, + QSpinBox, + QStyle, + QStyledItemDelegate, + Qt, + QTabWidget, + QVBoxLayout, + pyqtSignal, +) + from calibre import fit_image from calibre.db.constants import DEFAULT_TRASH_EXPIRY_TIME_SECONDS, TrashEntry -from calibre.gui2 import error_dialog, choose_dir, choose_save_file +from calibre.gui2 import choose_dir, choose_save_file, error_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import Dialog diff --git a/src/calibre/gui2/tts/develop.py b/src/calibre/gui2/tts/develop.py index 03bd8117d9..85ee75f412 100644 --- a/src/calibre/gui2/tts/develop.py +++ b/src/calibre/gui2/tts/develop.py @@ -4,10 +4,8 @@ import re from itertools import count -from qt.core import ( - QDialogButtonBox, QLabel, QMainWindow, Qt, QTimer, QVBoxLayout, QWidget, - pyqtSignal -) + +from qt.core import QDialogButtonBox, QLabel, QMainWindow, Qt, QTimer, QVBoxLayout, QWidget, pyqtSignal from calibre.gui2 import Application diff --git a/src/calibre/gui2/tts/implementation.py b/src/calibre/gui2/tts/implementation.py index f72d6ace18..434b764a3b 100644 --- a/src/calibre/gui2/tts/implementation.py +++ b/src/calibre/gui2/tts/implementation.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2020, Kovid Goyal -from calibre.constants import iswindows, ismacos +from calibre.constants import ismacos, iswindows if iswindows: from calibre.utils.config_base import tweaks diff --git a/src/calibre/gui2/tts/linux_config.py b/src/calibre/gui2/tts/linux_config.py index e331437d68..e581430438 100644 --- a/src/calibre/gui2/tts/linux_config.py +++ b/src/calibre/gui2/tts/linux_config.py @@ -2,10 +2,20 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal from contextlib import suppress + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QByteArray, QComboBox, QFontMetrics, - QFormLayout, QItemSelectionModel, QSlider, QSortFilterProxyModel, Qt, QTableView, - QWidget + QAbstractItemView, + QAbstractTableModel, + QByteArray, + QComboBox, + QFontMetrics, + QFormLayout, + QItemSelectionModel, + QSlider, + QSortFilterProxyModel, + Qt, + QTableView, + QWidget, ) from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/tts/macos.py b/src/calibre/gui2/tts/macos.py index 434f12ebf2..37f3a3cc87 100644 --- a/src/calibre/gui2/tts/macos.py +++ b/src/calibre/gui2/tts/macos.py @@ -46,7 +46,7 @@ class Client: shutdown = __del__ def handle_message(self, message_type, data): - from calibre_extensions.cocoa import MARK, END + from calibre_extensions.cocoa import END, MARK event = None if message_type == MARK: self.last_mark = data diff --git a/src/calibre/gui2/tts/macos_config.py b/src/calibre/gui2/tts/macos_config.py index ee03c8df2a..fd69fa4464 100644 --- a/src/calibre/gui2/tts/macos_config.py +++ b/src/calibre/gui2/tts/macos_config.py @@ -2,9 +2,19 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal from contextlib import suppress + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QByteArray, QFontMetrics, QFormLayout, - QItemSelectionModel, QSlider, QSortFilterProxyModel, Qt, QTableView, QWidget + QAbstractItemView, + QAbstractTableModel, + QByteArray, + QFontMetrics, + QFormLayout, + QItemSelectionModel, + QSlider, + QSortFilterProxyModel, + Qt, + QTableView, + QWidget, ) from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/tts/windows.py b/src/calibre/gui2/tts/windows.py index ce1fe605ba..a3e3c78269 100644 --- a/src/calibre/gui2/tts/windows.py +++ b/src/calibre/gui2/tts/windows.py @@ -3,10 +3,11 @@ from functools import partial -from calibre.utils.windows.winspeech import WinSpeech, Error, MarkReached, MediaStateChanged, MediaState +from calibre.utils.windows.winspeech import Error, MarkReached, MediaState, MediaStateChanged, WinSpeech from .common import Event, EventType + def split_into_chunks(marked_text, chunk_size): chunk = [] tlen = 0 diff --git a/src/calibre/gui2/tts/windows_config.py b/src/calibre/gui2/tts/windows_config.py index a3157cd06e..c044408a8b 100644 --- a/src/calibre/gui2/tts/windows_config.py +++ b/src/calibre/gui2/tts/windows_config.py @@ -2,10 +2,20 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal from contextlib import suppress + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QByteArray, QComboBox, QFontMetrics, - QFormLayout, QItemSelectionModel, QSlider, QSortFilterProxyModel, Qt, QTableView, - QWidget + QAbstractItemView, + QAbstractTableModel, + QByteArray, + QComboBox, + QFontMetrics, + QFormLayout, + QItemSelectionModel, + QSlider, + QSortFilterProxyModel, + Qt, + QTableView, + QWidget, ) from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/tts/windows_sapi.py b/src/calibre/gui2/tts/windows_sapi.py index 68444df44d..853271165d 100644 --- a/src/calibre/gui2/tts/windows_sapi.py +++ b/src/calibre/gui2/tts/windows_sapi.py @@ -2,8 +2,8 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal -from time import monotonic from threading import Thread +from time import monotonic from typing import NamedTuple from calibre import prepare_string_for_xml @@ -146,9 +146,7 @@ class Client: self.dispatch_on_main_thread(self.handle_events) def handle_events(self): - from calibre_extensions.winsapi import ( - SPEI_END_INPUT_STREAM, SPEI_START_INPUT_STREAM, SPEI_TTS_BOOKMARK - ) + from calibre_extensions.winsapi import SPEI_END_INPUT_STREAM, SPEI_START_INPUT_STREAM, SPEI_TTS_BOOKMARK c = self.current_callback for (stream_number, event_type, event_data) in self.sp_voice.get_events(): @@ -193,9 +191,7 @@ class Client: raise def speak(self, text, is_xml=False, want_events=True, purge=True): - from calibre_extensions.winsapi import ( - SPF_ASYNC, SPF_IS_NOT_XML, SPF_PURGEBEFORESPEAK, SPF_IS_XML - ) + from calibre_extensions.winsapi import SPF_ASYNC, SPF_IS_NOT_XML, SPF_IS_XML, SPF_PURGEBEFORESPEAK flags = SPF_IS_XML if is_xml else SPF_IS_NOT_XML if purge: flags |= SPF_PURGEBEFORESPEAK diff --git a/src/calibre/gui2/tts/windows_sapi_config.py b/src/calibre/gui2/tts/windows_sapi_config.py index 79e731d636..da0ebe6573 100644 --- a/src/calibre/gui2/tts/windows_sapi_config.py +++ b/src/calibre/gui2/tts/windows_sapi_config.py @@ -2,10 +2,20 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal from contextlib import suppress + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QByteArray, QComboBox, QFontMetrics, - QFormLayout, QItemSelectionModel, QSlider, QSortFilterProxyModel, Qt, QTableView, - QWidget + QAbstractItemView, + QAbstractTableModel, + QByteArray, + QComboBox, + QFontMetrics, + QFormLayout, + QItemSelectionModel, + QSlider, + QSortFilterProxyModel, + Qt, + QTableView, + QWidget, ) from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/tweak_book/__init__.py b/src/calibre/gui2/tweak_book/__init__.py index c480b8eb65..f82558e354 100644 --- a/src/calibre/gui2/tweak_book/__init__.py +++ b/src/calibre/gui2/tweak_book/__init__.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import string -from polyglot.builtins import iteritems -from calibre.utils.config import JSONConfig from calibre.spell.dictionary import Dictionaries, parse_lang_code +from calibre.utils.config import JSONConfig +from polyglot.builtins import iteritems CONTAINER_DND_MIMETYPE = 'application/x-calibre-container-name-list' tprefs = JSONConfig('tweak_book_gui') diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 0388c84314..eb297da47e 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -8,57 +8,76 @@ import subprocess import sys import tempfile from functools import partial, wraps + from qt.core import ( - QApplication, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, - QInputDialog, QLabel, QMimeData, QObject, QSize, Qt, QTimer, QUrl, QVBoxLayout, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QIcon, + QInputDialog, + QLabel, + QMimeData, + QObject, + QSize, + Qt, + QTimer, + QUrl, + QVBoxLayout, pyqtSignal, ) from calibre import isbytestring, prints from calibre.constants import cache_dir, islinux, ismacos, iswindows from calibre.ebooks.oeb.base import urlnormalize -from calibre.ebooks.oeb.polish.container import ( - OEB_DOCS, OEB_STYLES, clone_container, get_container as _gc, guess_type, -) +from calibre.ebooks.oeb.polish.container import OEB_DOCS, OEB_STYLES, clone_container, guess_type +from calibre.ebooks.oeb.polish.container import get_container as _gc from calibre.ebooks.oeb.polish.cover import mark_as_cover, mark_as_titlepage, set_cover from calibre.ebooks.oeb.polish.css import filter_css, rename_class from calibre.ebooks.oeb.polish.main import SUPPORTED, tweak_polish from calibre.ebooks.oeb.polish.pretty import fix_all_html, pretty_all -from calibre.ebooks.oeb.polish.replace import ( - get_recommended_folders, rationalize_folders, rename_files, replace_file, -) +from calibre.ebooks.oeb.polish.replace import get_recommended_folders, rationalize_folders, rename_files, replace_file from calibre.ebooks.oeb.polish.split import AbortError, merge, multisplit, split -from calibre.ebooks.oeb.polish.toc import ( - create_inline_toc, mark_as_nav, remove_names_from_toc, -) -from calibre.ebooks.oeb.polish.utils import ( - link_stylesheets, setup_css_parser_serialization as scs, -) +from calibre.ebooks.oeb.polish.toc import create_inline_toc, mark_as_nav, remove_names_from_toc +from calibre.ebooks.oeb.polish.utils import link_stylesheets +from calibre.ebooks.oeb.polish.utils import setup_css_parser_serialization as scs from calibre.gui2 import ( - add_to_recent_docs, choose_dir, choose_files, choose_save_file, error_dialog, - info_dialog, open_url, question_dialog, sanitize_env_vars, warning_dialog, + add_to_recent_docs, + choose_dir, + choose_files, + choose_save_file, + error_dialog, + info_dialog, + open_url, + question_dialog, + sanitize_env_vars, + warning_dialog, ) from calibre.gui2.dialogs.confirm_delete import confirm -from calibre.gui2.tweak_book import ( - actions, current_container, dictionaries, editor_name, editors, set_book_locale, - set_current_container, tprefs, -) +from calibre.gui2.tweak_book import actions, current_container, dictionaries, editor_name, editors, set_book_locale, set_current_container, tprefs from calibre.gui2.tweak_book.completion.worker import completion_worker from calibre.gui2.tweak_book.editor import editor_from_syntax, syntax_from_mime from calibre.gui2.tweak_book.editor.insert_resource import NewBook, get_resource_data from calibre.gui2.tweak_book.file_list import FILE_COPY_MIME, NewFileDialog from calibre.gui2.tweak_book.preferences import Preferences from calibre.gui2.tweak_book.preview import parse_worker -from calibre.gui2.tweak_book.save import ( - SaveManager, find_first_existing_ancestor, save_container, -) +from calibre.gui2.tweak_book.save import SaveManager, find_first_existing_ancestor, save_container from calibre.gui2.tweak_book.search import run_search, validate_search_request -from calibre.gui2.tweak_book.spell import find_next as find_next_word, find_next_error +from calibre.gui2.tweak_book.spell import find_next as find_next_word +from calibre.gui2.tweak_book.spell import find_next_error from calibre.gui2.tweak_book.toc import TOCEditor from calibre.gui2.tweak_book.undo import GlobalUndoHistory from calibre.gui2.tweak_book.widgets import ( - AddCover, FilterCSS, ImportForeign, InsertLink, InsertSemantics, InsertTag, - MultiSplit, QuickOpen, RationalizeFolders, + AddCover, + FilterCSS, + ImportForeign, + InsertLink, + InsertSemantics, + InsertTag, + MultiSplit, + QuickOpen, + RationalizeFolders, ) from calibre.gui2.widgets import BusyCursor from calibre.ptempfile import PersistentTemporaryDirectory, TemporaryDirectory @@ -214,9 +233,7 @@ class Boss(QObject): for ed in itervalues(editors): ed.apply_settings(dictionaries_changed=p.dictionaries_changed) if orig_spell != tprefs['inline_spell_check']: - from calibre.gui2.tweak_book.editor.syntax.html import ( - refresh_spell_check_status, - ) + from calibre.gui2.tweak_book.editor.syntax.html import refresh_spell_check_status refresh_spell_check_status() for ed in itervalues(editors): try: @@ -502,9 +519,7 @@ class Boss(QObject): return added_name = self.do_add_file(d.file_name, d.file_data, using_template=d.using_template, edit_file=True) if d.file_name.rpartition('.')[2].lower() in ('ttf', 'otf', 'woff'): - from calibre.gui2.tweak_book.manage_fonts import ( - show_font_face_rule_for_font_file, - ) + from calibre.gui2.tweak_book.manage_fonts import show_font_face_rule_for_font_file show_font_face_rule_for_font_file(d.file_data, added_name, self.gui) def do_add_file(self, file_name, data, using_template=False, edit_file=False): @@ -567,9 +582,7 @@ class Boss(QObject): self.set_modified() completion_worker().clear_caches('names') if added_fonts: - from calibre.gui2.tweak_book.manage_fonts import ( - show_font_face_rule_for_font_files, - ) + from calibre.gui2.tweak_book.manage_fonts import show_font_face_rule_for_font_files show_font_face_rule_for_font_files(c, added_fonts, self.gui) def add_cover(self): @@ -1219,9 +1232,7 @@ class Boss(QObject): 'No file with the name %s was found in the book') % target, show=True) def editor_class_clicked(self, class_data): - from calibre.gui2.tweak_book.jump_to_class import ( - NoMatchingRuleFound, NoMatchingTagFound, find_first_matching_rule, - ) + from calibre.gui2.tweak_book.jump_to_class import NoMatchingRuleFound, NoMatchingTagFound, find_first_matching_rule ed = self.gui.central.current_editor name = editor_name(ed) try: @@ -1638,9 +1649,7 @@ class Boss(QObject): def compress_images(self): if not self.ensure_book(_('You must first open a book in order to compress images.')): return - from calibre.gui2.tweak_book.polish import ( - CompressImages, CompressImagesProgress, show_report, - ) + from calibre.gui2.tweak_book.polish import CompressImages, CompressImagesProgress, show_report d = CompressImages(self.gui) if d.exec() == QDialog.DialogCode.Accepted: with BusyCursor(): diff --git a/src/calibre/gui2/tweak_book/char_select.py b/src/calibre/gui2/tweak_book/char_select.py index 034a04ad21..0cdfff965d 100644 --- a/src/calibre/gui2/tweak_book/char_select.py +++ b/src/calibre/gui2/tweak_book/char_select.py @@ -8,11 +8,33 @@ import re import textwrap from bisect import bisect from functools import partial + from qt.core import ( - QAbstractItemModel, QAbstractItemView, QAbstractListModel, QApplication, QCheckBox, - QDialogButtonBox, QGridLayout, QHBoxLayout, QIcon, QInputMethodEvent, QLabel, - QListView, QMenu, QMimeData, QModelIndex, QPen, QPushButton, QSize, QSizePolicy, - QSplitter, QStyledItemDelegate, Qt, QToolButton, QTreeView, pyqtSignal, + QAbstractItemModel, + QAbstractItemView, + QAbstractListModel, + QApplication, + QCheckBox, + QDialogButtonBox, + QGridLayout, + QHBoxLayout, + QIcon, + QInputMethodEvent, + QLabel, + QListView, + QMenu, + QMimeData, + QModelIndex, + QPen, + QPushButton, + QSize, + QSizePolicy, + QSplitter, + QStyledItemDelegate, + Qt, + QToolButton, + QTreeView, + pyqtSignal, ) from calibre.gui2.tweak_book import tprefs diff --git a/src/calibre/gui2/tweak_book/check.py b/src/calibre/gui2/tweak_book/check.py index 192d8d0f51..6a228b89ef 100644 --- a/src/calibre/gui2/tweak_book/check.py +++ b/src/calibre/gui2/tweak_book/check.py @@ -7,12 +7,22 @@ __copyright__ = '2013, Kovid Goyal ' import sys from qt.core import ( - QIcon, Qt, QSplitter, QListWidget, QTextBrowser, QPalette, QMenu, - QListWidgetItem, pyqtSignal, QApplication, QStyledItemDelegate, - QAbstractItemView) + QAbstractItemView, + QApplication, + QIcon, + QListWidget, + QListWidgetItem, + QMenu, + QPalette, + QSplitter, + QStyledItemDelegate, + Qt, + QTextBrowser, + pyqtSignal, +) -from calibre.ebooks.oeb.polish.check.base import WARN, INFO, DEBUG, ERROR, CRITICAL -from calibre.ebooks.oeb.polish.check.main import run_checks, fix_errors +from calibre.ebooks.oeb.polish.check.base import CRITICAL, DEBUG, ERROR, INFO, WARN +from calibre.ebooks.oeb.polish.check.main import fix_errors, run_checks from calibre.gui2 import NO_URL_FORMATTING, safe_open_url from calibre.gui2.tweak_book import tprefs from calibre.gui2.widgets import BusyCursor diff --git a/src/calibre/gui2/tweak_book/check_links.py b/src/calibre/gui2/tweak_book/check_links.py index 02dca7da12..d5738c5f21 100644 --- a/src/calibre/gui2/tweak_book/check_links.py +++ b/src/calibre/gui2/tweak_book/check_links.py @@ -2,16 +2,27 @@ # License: GPLv3 Copyright: 2015, Kovid Goyal from collections import defaultdict -from qt.core import ( - QCheckBox, QDialogButtonBox, QHBoxLayout, QIcon, QInputDialog, QLabel, QProgressBar, - QSizePolicy, QStackedWidget, Qt, QTextBrowser, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread -from calibre.gui2 import error_dialog -from calibre.gui2.tweak_book import ( - current_container, editors, set_current_container, tprefs, +from qt.core import ( + QCheckBox, + QDialogButtonBox, + QHBoxLayout, + QIcon, + QInputDialog, + QLabel, + QProgressBar, + QSizePolicy, + QStackedWidget, + Qt, + QTextBrowser, + QVBoxLayout, + QWidget, + pyqtSignal, ) + +from calibre.gui2 import error_dialog +from calibre.gui2.tweak_book import current_container, editors, set_current_container, tprefs from calibre.gui2.tweak_book.boss import get_boss from calibre.gui2.tweak_book.widgets import Dialog from calibre.utils.localization import ngettext diff --git a/src/calibre/gui2/tweak_book/completion/basic.py b/src/calibre/gui2/tweak_book/completion/basic.py index 3962951bb6..105ba00015 100644 --- a/src/calibre/gui2/tweak_book/completion/basic.py +++ b/src/calibre/gui2/tweak_book/completion/basic.py @@ -4,22 +4,22 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' +from collections import OrderedDict, namedtuple from threading import Event -from collections import namedtuple, OrderedDict -from qt.core import QObject, pyqtSignal, Qt +from qt.core import QObject, Qt, pyqtSignal from calibre import prepare_string_for_xml from calibre.ebooks.oeb.polish.container import OEB_STYLES, name_to_href -from calibre.ebooks.oeb.polish.utils import OEB_FONTS from calibre.ebooks.oeb.polish.parsing import parse from calibre.ebooks.oeb.polish.report import description_for_anchor +from calibre.ebooks.oeb.polish.utils import OEB_FONTS from calibre.gui2 import is_gui_thread from calibre.gui2.tweak_book import current_container, editors -from calibre.gui2.tweak_book.completion.utils import control, data, DataError +from calibre.gui2.tweak_book.completion.utils import DataError, control, data +from calibre.utils.icu import numeric_sort_key from calibre.utils.ipc import eintr_retry_call from calibre.utils.matcher import Matcher -from calibre.utils.icu import numeric_sort_key from polyglot.builtins import iteritems, itervalues Request = namedtuple('Request', 'id type data query') diff --git a/src/calibre/gui2/tweak_book/completion/popup.py b/src/calibre/gui2/tweak_book/completion/popup.py index e57eb01c5f..58561459ea 100644 --- a/src/calibre/gui2/tweak_book/completion/popup.py +++ b/src/calibre/gui2/tweak_book/completion/popup.py @@ -7,10 +7,9 @@ __copyright__ = '2014, Kovid Goyal ' import textwrap from math import ceil -from qt.core import ( - QWidget, Qt, QStaticText, QTextOption, QSize, QPainter, QTimer, QPalette, QEvent, QTextCursor) +from qt.core import QEvent, QPainter, QPalette, QSize, QStaticText, Qt, QTextCursor, QTextOption, QTimer, QWidget -from calibre import prints, prepare_string_for_xml +from calibre import prepare_string_for_xml, prints from calibre.gui2 import error_dialog from calibre.gui2.tweak_book.widgets import make_highlighted_text from calibre.utils.icu import string_length diff --git a/src/calibre/gui2/tweak_book/diff/highlight.py b/src/calibre/gui2/tweak_book/diff/highlight.py index 07c6a757b9..115a142212 100644 --- a/src/calibre/gui2/tweak_book/diff/highlight.py +++ b/src/calibre/gui2/tweak_book/diff/highlight.py @@ -6,12 +6,13 @@ __copyright__ = '2014, Kovid Goyal ' import os -from qt.core import QTextDocument, QTextCursor, QPlainTextDocumentLayout +from qt.core import QPlainTextDocumentLayout, QTextCursor, QTextDocument from calibre.gui2.tweak_book import tprefs -from calibre.gui2.tweak_book.editor.text import get_highlighter as calibre_highlighter, SyntaxHighlighter +from calibre.gui2.tweak_book.editor.syntax.utils import NULL_FMT, format_for_pygments_token +from calibre.gui2.tweak_book.editor.text import SyntaxHighlighter +from calibre.gui2.tweak_book.editor.text import get_highlighter as calibre_highlighter from calibre.gui2.tweak_book.editor.themes import get_theme, highlight_to_char_format -from calibre.gui2.tweak_book.editor.syntax.utils import format_for_pygments_token, NULL_FMT from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/diff/main.py b/src/calibre/gui2/tweak_book/diff/main.py index 6e303767f2..bb6b48e54d 100644 --- a/src/calibre/gui2/tweak_book/diff/main.py +++ b/src/calibre/gui2/tweak_book/diff/main.py @@ -9,10 +9,29 @@ import re import sys import textwrap from functools import partial + from qt.core import ( - QApplication, QCursor, QDialogButtonBox, QEventLoop, QGridLayout, QHBoxLayout, - QIcon, QKeySequence, QLabel, QMenu, QPainter, QRadioButton, QRect, QSize, - QStackedLayout, Qt, QTimer, QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QApplication, + QCursor, + QDialogButtonBox, + QEventLoop, + QGridLayout, + QHBoxLayout, + QIcon, + QKeySequence, + QLabel, + QMenu, + QPainter, + QRadioButton, + QRect, + QSize, + QStackedLayout, + Qt, + QTimer, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.ebooks.oeb.polish.container import Container diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py index 3b023420ed..519b9a3f41 100644 --- a/src/calibre/gui2/tweak_book/diff/view.py +++ b/src/calibre/gui2/tweak_book/diff/view.py @@ -2,18 +2,43 @@ # License: GPLv3 Copyright: 2014, Kovid Goyal import re -import regex import unicodedata from collections import OrderedDict, namedtuple from difflib import SequenceMatcher from functools import partial from itertools import chain from math import ceil + +import regex from qt.core import ( - QApplication, QBrush, QColor, QEvent, QEventLoop, QFont, QHBoxLayout, QIcon, QImage, - QKeySequence, QMenu, QPainter, QPainterPath, QPalette, QPen, QPixmap, - QPlainTextEdit, QRect, QScrollBar, QSplitter, QSplitterHandle, Qt, QTextCharFormat, - QTextCursor, QTextLayout, QTimer, QWidget, pyqtSignal, + QApplication, + QBrush, + QColor, + QEvent, + QEventLoop, + QFont, + QHBoxLayout, + QIcon, + QImage, + QKeySequence, + QMenu, + QPainter, + QPainterPath, + QPalette, + QPen, + QPixmap, + QPlainTextEdit, + QRect, + QScrollBar, + QSplitter, + QSplitterHandle, + Qt, + QTextCharFormat, + QTextCursor, + QTextLayout, + QTimer, + QWidget, + pyqtSignal, ) from calibre import fit_image, human_readable @@ -21,9 +46,7 @@ from calibre.gui2 import info_dialog from calibre.gui2.tweak_book import tprefs from calibre.gui2.tweak_book.diff import get_sequence_matcher from calibre.gui2.tweak_book.diff.highlight import get_highlighter -from calibre.gui2.tweak_book.editor.text import ( - LineNumbers, PlainTextEdit, default_font_family, -) +from calibre.gui2.tweak_book.editor.text import LineNumbers, PlainTextEdit, default_font_family from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color from calibre.gui2.widgets import BusyCursor from calibre.startup import connect_lambda @@ -48,6 +71,7 @@ def beautify_text(raw, syntax): pretty_xml_tree(root) elif syntax == 'css': import logging + from css_parser import CSSParser, log from calibre.ebooks.oeb.base import _css_logger, serialize diff --git a/src/calibre/gui2/tweak_book/download.py b/src/calibre/gui2/tweak_book/download.py index 97b09b84df..6952462dc8 100644 --- a/src/calibre/gui2/tweak_book/download.py +++ b/src/calibre/gui2/tweak_book/download.py @@ -2,15 +2,25 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from qt.core import ( - QDialogButtonBox, QGridLayout, QIcon, QLabel, QListWidget, QListWidgetItem, - QProgressBar, QScrollArea, QSize, Qt, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread -from calibre.ebooks.oeb.polish.download import ( - download_external_resources, get_external_resources, replace_resources, +from qt.core import ( + QDialogButtonBox, + QGridLayout, + QIcon, + QLabel, + QListWidget, + QListWidgetItem, + QProgressBar, + QScrollArea, + QSize, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, ) + +from calibre.ebooks.oeb.polish.download import download_external_resources, get_external_resources, replace_resources from calibre.gui2 import error_dialog, info_dialog, warning_dialog from calibre.gui2.progress_indicator import WaitStack from calibre.gui2.tweak_book import current_container diff --git a/src/calibre/gui2/tweak_book/editor/canvas.py b/src/calibre/gui2/tweak_book/editor/canvas.py index 61a337625f..97165a7be4 100644 --- a/src/calibre/gui2/tweak_book/editor/canvas.py +++ b/src/calibre/gui2/tweak_book/editor/canvas.py @@ -8,20 +8,39 @@ import sys import weakref from functools import wraps from io import BytesIO + from qt.core import ( - QApplication, QColor, QIcon, QImage, QImageWriter, QPainter, QPen, QPixmap, QPointF, - QRect, QRectF, Qt, QTransform, QUndoCommand, QUndoStack, QWidget, pyqtSignal, + QApplication, + QColor, + QIcon, + QImage, + QImageWriter, + QPainter, + QPen, + QPixmap, + QPointF, + QRect, + QRectF, + Qt, + QTransform, + QUndoCommand, + QUndoStack, + QWidget, + pyqtSignal, ) from calibre import fit_image from calibre.gui2 import error_dialog, pixmap_to_data -from calibre.gui2.dnd import ( - DownloadDialog, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions, -) +from calibre.gui2.dnd import DownloadDialog, dnd_get_image, dnd_has_extension, dnd_has_image, image_extensions from calibre.gui2.tweak_book import capitalize from calibre.utils.img import ( - despeckle_image, gaussian_blur_image, gaussian_sharpen_image, image_to_data, - normalize_image, oil_paint_image, remove_borders_from_image, + despeckle_image, + gaussian_blur_image, + gaussian_sharpen_image, + image_to_data, + normalize_image, + oil_paint_image, + remove_borders_from_image, ) from calibre.utils.imghdr import identify diff --git a/src/calibre/gui2/tweak_book/editor/image.py b/src/calibre/gui2/tweak_book/editor/image.py index 715ac47963..2b821ea84c 100644 --- a/src/calibre/gui2/tweak_book/editor/image.py +++ b/src/calibre/gui2/tweak_book/editor/image.py @@ -5,9 +5,22 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import sys + from qt.core import ( - QApplication, QCheckBox, QDialog, QDialogButtonBox, QFormLayout, QIcon, - QInputDialog, QLabel, QMainWindow, QMenu, QSize, QSpinBox, Qt, QToolButton, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QFormLayout, + QIcon, + QInputDialog, + QLabel, + QMainWindow, + QMenu, + QSize, + QSpinBox, + Qt, + QToolButton, pyqtSignal, ) diff --git a/src/calibre/gui2/tweak_book/editor/insert_resource.py b/src/calibre/gui2/tweak_book/editor/insert_resource.py index d4ced61597..72503e614d 100644 --- a/src/calibre/gui2/tweak_book/editor/insert_resource.py +++ b/src/calibre/gui2/tweak_book/editor/insert_resource.py @@ -7,12 +7,36 @@ __copyright__ = '2013, Kovid Goyal ' import os import sys from functools import partial + from qt.core import ( - QAbstractListModel, QApplication, QCheckBox, QClipboard, QDialog, QDialogButtonBox, - QFormLayout, QGridLayout, QHBoxLayout, QIcon, QInputDialog, QLabel, QLineEdit, - QListView, QMenu, QPainter, QPixmap, QRect, QSize, QSizePolicy, - QSortFilterProxyModel, QStyledItemDelegate, Qt, QToolButton, QTreeWidget, - QTreeWidgetItem, QVBoxLayout, pyqtSignal, + QAbstractListModel, + QApplication, + QCheckBox, + QClipboard, + QDialog, + QDialogButtonBox, + QFormLayout, + QGridLayout, + QHBoxLayout, + QIcon, + QInputDialog, + QLabel, + QLineEdit, + QListView, + QMenu, + QPainter, + QPixmap, + QRect, + QSize, + QSizePolicy, + QSortFilterProxyModel, + QStyledItemDelegate, + Qt, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + pyqtSignal, ) from calibre import fit_image diff --git a/src/calibre/gui2/tweak_book/editor/smarts/css.py b/src/calibre/gui2/tweak_book/editor/smarts/css.py index 0348ff4255..5f784d9aa5 100644 --- a/src/calibre/gui2/tweak_book/editor/smarts/css.py +++ b/src/calibre/gui2/tweak_book/editor/smarts/css.py @@ -11,8 +11,14 @@ from qt.core import Qt, QTextCursor from calibre.gui2.tweak_book import current_container from calibre.gui2.tweak_book.editor.smarts import NullSmarts from calibre.gui2.tweak_book.editor.smarts.utils import ( - no_modifiers, get_leading_whitespace_on_block, get_text_before_cursor, - smart_home, smart_backspace, smart_tab, expand_tabs) + expand_tabs, + get_leading_whitespace_on_block, + get_text_before_cursor, + no_modifiers, + smart_backspace, + smart_home, + smart_tab, +) def find_rule(raw, rule_address): diff --git a/src/calibre/gui2/tweak_book/editor/smarts/html.py b/src/calibre/gui2/tweak_book/editor/smarts/html.py index b83bdaf94f..c6b2e6e754 100644 --- a/src/calibre/gui2/tweak_book/editor/smarts/html.py +++ b/src/calibre/gui2/tweak_book/editor/smarts/html.py @@ -7,9 +7,10 @@ __copyright__ = '2014, Kovid Goyal ' import re import sys from contextlib import contextmanager -from css_parser import parseStyle from itertools import chain from operator import itemgetter + +from css_parser import parseStyle from qt.core import Qt, QTextCursor, QTextEdit from calibre import prepare_string_for_xml, xml_entity_to_unicode @@ -20,12 +21,16 @@ from calibre.gui2 import error_dialog from calibre.gui2.tweak_book import current_container, tprefs from calibre.gui2.tweak_book.editor.smarts import NullSmarts from calibre.gui2.tweak_book.editor.smarts.utils import ( - expand_tabs, get_leading_whitespace_on_block, get_text_after_cursor, - get_text_before_cursor, no_modifiers, smart_backspace, smart_home, smart_tab -) -from calibre.gui2.tweak_book.editor.syntax.html import ( - ATTR_END, ATTR_NAME, ATTR_START, ATTR_VALUE + expand_tabs, + get_leading_whitespace_on_block, + get_text_after_cursor, + get_text_before_cursor, + no_modifiers, + smart_backspace, + smart_home, + smart_tab, ) +from calibre.gui2.tweak_book.editor.syntax.html import ATTR_END, ATTR_NAME, ATTR_START, ATTR_VALUE from calibre.utils.icu import utf16_length get_offset = itemgetter(0) diff --git a/src/calibre/gui2/tweak_book/editor/smarts/python.py b/src/calibre/gui2/tweak_book/editor/smarts/python.py index 4a4fcd3770..b768a4a669 100644 --- a/src/calibre/gui2/tweak_book/editor/smarts/python.py +++ b/src/calibre/gui2/tweak_book/editor/smarts/python.py @@ -9,9 +9,9 @@ import re from qt.core import Qt from calibre.gui2.tweak_book.editor.smarts import NullSmarts -from calibre.gui2.tweak_book.editor.smarts.utils import ( - get_text_before_cursor, get_leading_whitespace_on_block as lw, - smart_home, smart_backspace, smart_tab) +from calibre.gui2.tweak_book.editor.smarts.utils import get_leading_whitespace_on_block as lw +from calibre.gui2.tweak_book.editor.smarts.utils import get_text_before_cursor, smart_backspace, smart_home, smart_tab + def get_leading_whitespace_on_block(editor, previous=False): return expand_tabs(lw(editor, previous=previous)) @@ -74,5 +74,6 @@ class Smarts(NullSmarts): if __name__ == '__main__': import os + from calibre.gui2.tweak_book.editor.widget import launch_editor launch_editor(os.path.abspath(__file__), syntax='python') diff --git a/src/calibre/gui2/tweak_book/editor/snippets.py b/src/calibre/gui2/tweak_book/editor/snippets.py index 80490f3f6c..c598e2829b 100644 --- a/src/calibre/gui2/tweak_book/editor/snippets.py +++ b/src/calibre/gui2/tweak_book/editor/snippets.py @@ -10,10 +10,28 @@ import weakref from collections import OrderedDict, namedtuple from itertools import groupby from operator import attrgetter, itemgetter + from qt.core import ( - QDialog, QDialogButtonBox, QFrame, QGridLayout, QHBoxLayout, QIcon, QLabel, - QLineEdit, QListView, QListWidget, QListWidgetItem, QObject, QPushButton, QSize, - QStackedLayout, Qt, QTextCursor, QToolButton, QVBoxLayout, QWidget + QDialog, + QDialogButtonBox, + QFrame, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListView, + QListWidget, + QListWidgetItem, + QObject, + QPushButton, + QSize, + QStackedLayout, + Qt, + QTextCursor, + QToolButton, + QVBoxLayout, + QWidget, ) from calibre.constants import ismacos @@ -26,6 +44,7 @@ from calibre.utils.icu import string_length as strlen from calibre.utils.localization import localize_user_manual_link from polyglot.builtins import codepoint_to_chr, iteritems, itervalues + def string_length(x): return strlen(str(x)) # Needed on narrow python builds, as subclasses of unicode dont work KEY = Qt.Key.Key_J diff --git a/src/calibre/gui2/tweak_book/editor/syntax/base.py b/src/calibre/gui2/tweak_book/editor/syntax/base.py index 6d5893cceb..d47b7e39a1 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/base.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/base.py @@ -4,9 +4,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' from collections import defaultdict, deque -from qt.core import ( - QTextBlock, QTextBlockUserData, QTextCursor, QTextFormat, QTextLayout, QTimer, -) + +from qt.core import QTextBlock, QTextBlockUserData, QTextCursor, QTextFormat, QTextLayout, QTimer from calibre.gui2.widgets import BusyCursor from calibre.utils.icu import utf16_length diff --git a/src/calibre/gui2/tweak_book/editor/syntax/css.py b/src/calibre/gui2/tweak_book/editor/syntax/css.py index d90c4145d3..1efd037ac2 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/css.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/css.py @@ -9,7 +9,7 @@ import re from qt.core import QTextBlockUserData from calibre.gui2.tweak_book import verify_link -from calibre.gui2.tweak_book.editor import syntax_text_char_format, LINK_PROPERTY, CSS_PROPERTY +from calibre.gui2.tweak_book.editor import CSS_PROPERTY, LINK_PROPERTY, syntax_text_char_format from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/editor/syntax/html.py b/src/calibre/gui2/tweak_book/editor/syntax/html.py index ec346bdbbf..9ac523474c 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/html.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/html.py @@ -7,19 +7,24 @@ __copyright__ = '2013, Kovid Goyal ' import re from collections import namedtuple from functools import partial + from qt.core import QFont, QTextBlockUserData, QTextCharFormat, QVariant from calibre.ebooks.oeb.polish.spell import html_spell_tags, patterns, xml_spell_tags from calibre.gui2.tweak_book import dictionaries, tprefs, verify_link from calibre.gui2.tweak_book.editor import ( - CLASS_ATTRIBUTE_PROPERTY, LINK_PROPERTY, SPELL_LOCALE_PROPERTY, SPELL_PROPERTY, - TAG_NAME_PROPERTY, store_locale, syntax_text_char_format + CLASS_ATTRIBUTE_PROPERTY, + LINK_PROPERTY, + SPELL_LOCALE_PROPERTY, + SPELL_PROPERTY, + TAG_NAME_PROPERTY, + store_locale, + syntax_text_char_format, ) from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter, run_loop -from calibre.gui2.tweak_book.editor.syntax.css import ( - CSSState, CSSUserData, create_formats as create_css_formats, - state_map as css_state_map -) +from calibre.gui2.tweak_book.editor.syntax.css import CSSState, CSSUserData +from calibre.gui2.tweak_book.editor.syntax.css import create_formats as create_css_formats +from calibre.gui2.tweak_book.editor.syntax.css import state_map as css_state_map from calibre.spell.break_iterator import split_into_words_and_positions from calibre.spell.dictionary import parse_lang_code from calibre_extensions import html_syntax_highlighter as _speedup @@ -521,6 +526,7 @@ class XMLHighlighter(Highlighter): def profile(): import sys + from qt.core import QTextDocument from calibre.gui2 import Application diff --git a/src/calibre/gui2/tweak_book/editor/syntax/javascript.py b/src/calibre/gui2/tweak_book/editor/syntax/javascript.py index 2eb9a7c712..3ed167f5fe 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/javascript.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/javascript.py @@ -4,16 +4,13 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import pygments.unistring as uni import re -from pygments.lexer import RegexLexer, default, include -from pygments.token import ( - Comment, Keyword, Name, Number, Operator, Punctuation, String, Text, -) -from calibre.gui2.tweak_book.editor.syntax.pygments_highlighter import ( - create_highlighter, -) +import pygments.unistring as uni +from pygments.lexer import RegexLexer, default, include +from pygments.token import Comment, Keyword, Name, Number, Operator, Punctuation, String, Text + +from calibre.gui2.tweak_book.editor.syntax.pygments_highlighter import create_highlighter from calibre.utils.resources import get_path as P from polyglot.builtins import native_string_type diff --git a/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py b/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py index 0c916fa823..7297730750 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/pygments_highlighter.py @@ -7,11 +7,11 @@ __copyright__ = '2014, Kovid Goyal ' import numbers from functools import partial +from pygments.lexer import Error, _TokenType from qt.core import QTextBlockUserData -from pygments.lexer import _TokenType, Error from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter -from calibre.gui2.tweak_book.editor.syntax.utils import format_for_pygments_token, NULL_FMT +from calibre.gui2.tweak_book.editor.syntax.utils import NULL_FMT, format_for_pygments_token NORMAL = 0 diff --git a/src/calibre/gui2/tweak_book/editor/syntax/python.py b/src/calibre/gui2/tweak_book/editor/syntax/python.py index 8af7d286e6..50537b7c13 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/python.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/python.py @@ -12,5 +12,6 @@ Highlighter = create_highlighter('PythonHighlighter', PythonLexer) if __name__ == '__main__': import os + from calibre.gui2.tweak_book.editor.widget import launch_editor launch_editor(os.path.abspath(__file__), syntax='python') diff --git a/src/calibre/gui2/tweak_book/editor/text.py b/src/calibre/gui2/tweak_book/editor/text.py index 3fb2c1da44..f81d7958b1 100644 --- a/src/calibre/gui2/tweak_book/editor/text.py +++ b/src/calibre/gui2/tweak_book/editor/text.py @@ -5,38 +5,45 @@ import importlib import os import re -import regex import textwrap import unicodedata + +import regex from qt.core import ( - QColor, QColorDialog, QFont, QFontDatabase, QKeySequence, QPainter, QPalette, - QPlainTextEdit, QRect, QSize, Qt, QTextCursor, QTextEdit, QTextFormat, QTimer, - QToolTip, QWidget, pyqtSignal + QColor, + QColorDialog, + QFont, + QFontDatabase, + QKeySequence, + QPainter, + QPalette, + QPlainTextEdit, + QRect, + QSize, + Qt, + QTextCursor, + QTextEdit, + QTextFormat, + QTimer, + QToolTip, + QWidget, + pyqtSignal, ) from calibre import prepare_string_for_xml from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES, css_text from calibre.ebooks.oeb.polish.replace import get_recommended_folders from calibre.ebooks.oeb.polish.utils import guess_type -from calibre.gui2.tweak_book import ( - CONTAINER_DND_MIMETYPE, TOP, current_container, tprefs -) +from calibre.gui2.tweak_book import CONTAINER_DND_MIMETYPE, TOP, current_container, tprefs from calibre.gui2.tweak_book.completion.popup import CompletionPopup -from calibre.gui2.tweak_book.editor import ( - CLASS_ATTRIBUTE_PROPERTY, LINK_PROPERTY, SPELL_LOCALE_PROPERTY, SPELL_PROPERTY, - SYNTAX_PROPERTY, store_locale -) +from calibre.gui2.tweak_book.editor import CLASS_ATTRIBUTE_PROPERTY, LINK_PROPERTY, SPELL_LOCALE_PROPERTY, SPELL_PROPERTY, SYNTAX_PROPERTY, store_locale from calibre.gui2.tweak_book.editor.smarts import NullSmarts from calibre.gui2.tweak_book.editor.snippets import SnippetManager from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter -from calibre.gui2.tweak_book.editor.themes import ( - get_theme, theme_color, theme_format -) +from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color, theme_format from calibre.gui2.tweak_book.widgets import PARAGRAPH_SEPARATOR, PlainTextEdit from calibre.spell.break_iterator import index_of -from calibre.utils.icu import ( - capitalize, lower, safe_chr, string_length, swapcase, upper, utf16_length -) +from calibre.utils.icu import capitalize, lower, safe_chr, string_length, swapcase, upper, utf16_length from calibre.utils.img import image_to_data from calibre.utils.titlecase import titlecase from polyglot.builtins import as_unicode diff --git a/src/calibre/gui2/tweak_book/editor/themes.py b/src/calibre/gui2/tweak_book/editor/themes.py index b69ca83c28..a1a3f0b35f 100644 --- a/src/calibre/gui2/tweak_book/editor/themes.py +++ b/src/calibre/gui2/tweak_book/editor/themes.py @@ -7,10 +7,33 @@ __copyright__ = '2013, Kovid Goyal ' from collections import namedtuple from qt.core import ( - QColor, QBrush, QFont, QApplication, QPalette, QComboBox, - QPushButton, QIcon, QFormLayout, QLineEdit, QWidget, QScrollArea, - QVBoxLayout, Qt, QHBoxLayout, pyqtSignal, QPixmap, QColorDialog, QDialog, - QToolButton, QCheckBox, QSize, QLabel, QSplitter, QTextCharFormat, QDialogButtonBox) + QApplication, + QBrush, + QCheckBox, + QColor, + QColorDialog, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QFormLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QPalette, + QPixmap, + QPushButton, + QScrollArea, + QSize, + QSplitter, + Qt, + QTextCharFormat, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, +) from calibre.gui2 import error_dialog from calibre.gui2.tweak_book import tprefs diff --git a/src/calibre/gui2/tweak_book/editor/widget.py b/src/calibre/gui2/tweak_book/editor/widget.py index 6b2a1bc8e7..759da1874d 100644 --- a/src/calibre/gui2/tweak_book/editor/widget.py +++ b/src/calibre/gui2/tweak_book/editor/widget.py @@ -7,27 +7,35 @@ __copyright__ = '2013, Kovid Goyal ' import math import unicodedata from functools import partial + from qt.core import ( - QAction, QApplication, QColor, QIcon, QImage, QInputDialog, QMainWindow, QMenu, - QPainter, QPixmap, QSize, Qt, QTextCursor, QToolButton, pyqtSignal, - qDrawShadeRect + QAction, + QApplication, + QColor, + QIcon, + QImage, + QInputDialog, + QMainWindow, + QMenu, + QPainter, + QPixmap, + QSize, + Qt, + QTextCursor, + QToolButton, + pyqtSignal, + qDrawShadeRect, ) from calibre import prints from calibre.constants import DEBUG from calibre.ebooks.chardet import replace_encoding_declarations from calibre.gui2 import error_dialog, open_url -from calibre.gui2.tweak_book import ( - actions, current_container, dictionaries, editor_name, editor_toolbar_actions, - editors, tprefs, update_mark_text_action -) -from calibre.gui2.tweak_book.editor import ( - CLASS_ATTRIBUTE_PROPERTY, CSS_PROPERTY, LINK_PROPERTY, SPELL_PROPERTY, - TAG_NAME_PROPERTY -) +from calibre.gui2.tweak_book import actions, current_container, dictionaries, editor_name, editor_toolbar_actions, editors, tprefs, update_mark_text_action +from calibre.gui2.tweak_book.editor import CLASS_ATTRIBUTE_PROPERTY, CSS_PROPERTY, LINK_PROPERTY, SPELL_PROPERTY, TAG_NAME_PROPERTY from calibre.gui2.tweak_book.editor.help import help_url from calibre.gui2.tweak_book.editor.text import TextEdit -from calibre.utils.icu import utf16_length, primary_sort_key +from calibre.utils.icu import primary_sort_key, utf16_length from polyglot.builtins import itervalues, string_or_bytes @@ -513,9 +521,7 @@ class Editor(QMainWindow): return False def pretty_print(self, name): - from calibre.ebooks.oeb.polish.pretty import ( - pretty_css, pretty_html, pretty_xml - ) + from calibre.ebooks.oeb.polish.pretty import pretty_css, pretty_html, pretty_xml if self.syntax in {'css', 'html', 'xml'}: func = {'css':pretty_css, 'xml':pretty_xml}.get(self.syntax, pretty_html) original_text = str(self.editor.toPlainText()) diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index 0e9d454b21..5fae580bc6 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -8,31 +8,51 @@ import sys import textwrap from collections import Counter, OrderedDict, defaultdict from functools import lru_cache, partial + from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, QFont, - QFormLayout, QGridLayout, QIcon, QInputDialog, QItemSelectionModel, QLabel, - QLineEdit, QListWidget, QListWidgetItem, QMenu, QPainter, QPixmap, QRadioButton, - QScrollArea, QSize, QSpinBox, QStyle, QStyledItemDelegate, Qt, QTimer, QTreeView, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, sip, + QAbstractItemView, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QFont, + QFormLayout, + QGridLayout, + QIcon, + QInputDialog, + QItemSelectionModel, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QPainter, + QPixmap, + QRadioButton, + QScrollArea, + QSize, + QSpinBox, + QStyle, + QStyledItemDelegate, + Qt, + QTimer, + QTreeView, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, + sip, ) from calibre import human_readable, sanitize_file_name from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES -from calibre.ebooks.oeb.polish.cover import ( - get_cover_page_name, get_raster_cover_name, is_raster_image, -) +from calibre.ebooks.oeb.polish.cover import get_cover_page_name, get_raster_cover_name, is_raster_image from calibre.ebooks.oeb.polish.css import add_stylesheet_links -from calibre.ebooks.oeb.polish.replace import ( - get_recommended_folders, get_spine_order_for_all_files, -) +from calibre.ebooks.oeb.polish.replace import get_recommended_folders, get_spine_order_for_all_files from calibre.ebooks.oeb.polish.utils import OEB_FONTS, guess_type -from calibre.gui2 import ( - choose_dir, choose_files, choose_save_file, elided_text, error_dialog, - make_view_use_window_background, question_dialog, -) -from calibre.gui2.tweak_book import ( - CONTAINER_DND_MIMETYPE, current_container, editors, tprefs, -) +from calibre.gui2 import choose_dir, choose_files, choose_save_file, elided_text, error_dialog, make_view_use_window_background, question_dialog +from calibre.gui2.tweak_book import CONTAINER_DND_MIMETYPE, current_container, editors, tprefs from calibre.gui2.tweak_book.editor import syntax_from_mime from calibre.gui2.tweak_book.templates import template_for from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/tweak_book/function_replace.py b/src/calibre/gui2/tweak_book/function_replace.py index 9b34f576ff..2bdfff212d 100644 --- a/src/calibre/gui2/tweak_book/function_replace.py +++ b/src/calibre/gui2/tweak_book/function_replace.py @@ -8,14 +8,10 @@ import io import re import sys import weakref -from qt.core import ( - QApplication, QDialogButtonBox, QFontMetrics, QHBoxLayout, QIcon, QLabel, - QPlainTextEdit, QSize, Qt, QVBoxLayout, pyqtSignal, -) -from calibre.ebooks.oeb.polish.utils import ( - apply_func_to_html_text, apply_func_to_match_groups, -) +from qt.core import QApplication, QDialogButtonBox, QFontMetrics, QHBoxLayout, QIcon, QLabel, QPlainTextEdit, QSize, Qt, QVBoxLayout, pyqtSignal + +from calibre.ebooks.oeb.polish.utils import apply_func_to_html_text, apply_func_to_match_groups from calibre.gui2 import error_dialog from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.tweak_book import dictionaries diff --git a/src/calibre/gui2/tweak_book/job.py b/src/calibre/gui2/tweak_book/job.py index dd39b40c7f..b7c32b0da7 100644 --- a/src/calibre/gui2/tweak_book/job.py +++ b/src/calibre/gui2/tweak_book/job.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import time -from threading import Thread from functools import partial +from threading import Thread -from qt.core import (QWidget, QVBoxLayout, QLabel, Qt, QPainter, QBrush, QRect, QApplication, QCursor) +from qt.core import QApplication, QBrush, QCursor, QLabel, QPainter, QRect, Qt, QVBoxLayout, QWidget from calibre.gui2 import Dispatcher from calibre.gui2.progress_indicator import ProgressIndicator diff --git a/src/calibre/gui2/tweak_book/jump_to_class.py b/src/calibre/gui2/tweak_book/jump_to_class.py index 2b0d6ba599..7c9867f50a 100644 --- a/src/calibre/gui2/tweak_book/jump_to_class.py +++ b/src/calibre/gui2/tweak_book/jump_to_class.py @@ -2,13 +2,14 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal from contextlib import suppress -from css_parser.css import CSSRule from typing import List, NamedTuple, Optional, Tuple +from css_parser.css import CSSRule +from css_selectors import Select, SelectorError + from calibre.ebooks.oeb.parse_utils import barename from calibre.ebooks.oeb.polish.container import get_container from calibre.ebooks.oeb.polish.parsing import parse -from css_selectors import Select, SelectorError class NoMatchingTagFound(KeyError): diff --git a/src/calibre/gui2/tweak_book/live_css.py b/src/calibre/gui2/tweak_book/live_css.py index bf665efa78..9b102444ca 100644 --- a/src/calibre/gui2/tweak_book/live_css.py +++ b/src/calibre/gui2/tweak_book/live_css.py @@ -5,17 +5,33 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import sys + +from css_selectors import SelectorError, parse from qt.core import ( - QWidget, QTimer, QStackedLayout, QLabel, QScrollArea, QVBoxLayout, - QPainter, Qt, QPalette, QRect, QSize, QSizePolicy, pyqtSignal, - QColor, QMenu, QApplication, QIcon, QUrl) + QApplication, + QColor, + QIcon, + QLabel, + QMenu, + QPainter, + QPalette, + QRect, + QScrollArea, + QSize, + QSizePolicy, + QStackedLayout, + Qt, + QTimer, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, +) from calibre.constants import FAKE_HOST, FAKE_PROTOCOL -from calibre.gui2.tweak_book import editors, actions, tprefs -from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color +from calibre.gui2.tweak_book import actions, editors, tprefs from calibre.gui2.tweak_book.editor.text import default_font_family -from css_selectors import parse, SelectorError - +from calibre.gui2.tweak_book.editor.themes import get_theme, theme_color lowest_specificity = (-sys.maxsize, 0, 0, 0, 0, 0) diff --git a/src/calibre/gui2/tweak_book/main.py b/src/calibre/gui2/tweak_book/main.py index b103949e73..b5056ccb24 100644 --- a/src/calibre/gui2/tweak_book/main.py +++ b/src/calibre/gui2/tweak_book/main.py @@ -10,9 +10,7 @@ from qt.core import QIcon from calibre.constants import EDITOR_APP_UID, islinux from calibre.ebooks.oeb.polish.check.css import shutdown as shutdown_css_check_pool -from calibre.gui2 import ( - Application, decouple, set_gui_prefs, setup_gui_option_parser -) +from calibre.gui2 import Application, decouple, set_gui_prefs, setup_gui_option_parser from calibre.ptempfile import reset_base_dir from calibre.utils.config import OptionParser diff --git a/src/calibre/gui2/tweak_book/manage_fonts.py b/src/calibre/gui2/tweak_book/manage_fonts.py index ed9ce2eeb8..e755c08d95 100644 --- a/src/calibre/gui2/tweak_book/manage_fonts.py +++ b/src/calibre/gui2/tweak_book/manage_fonts.py @@ -7,10 +7,29 @@ __copyright__ = '2014, Kovid Goyal ' import sys import textwrap from io import BytesIO + from qt.core import ( - QAbstractItemView, QAbstractTableModel, QApplication, QDialog, QDialogButtonBox, - QFormLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QMessageBox, QPushButton, QSize, - QSplitter, Qt, QTableView, QTextEdit, QTimer, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QAbstractTableModel, + QApplication, + QDialog, + QDialogButtonBox, + QFormLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QMessageBox, + QPushButton, + QSize, + QSplitter, + Qt, + QTableView, + QTextEdit, + QTimer, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre.ebooks.oeb.polish.container import get_container @@ -21,7 +40,8 @@ from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.widgets import BusyCursor from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont from calibre.utils.fonts.scanner import NoFonts, font_scanner -from calibre.utils.icu import lower as icu_lower, primary_sort_key as sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import primary_sort_key as sort_key from calibre.utils.localization import ngettext from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/plugin.py b/src/calibre/gui2/tweak_book/plugin.py index e7a0990a29..4565d794ec 100644 --- a/src/calibre/gui2/tweak_book/plugin.py +++ b/src/calibre/gui2/tweak_book/plugin.py @@ -6,6 +6,7 @@ __copyright__ = '2014, Kovid Goyal ' import importlib import sys + from qt.core import QToolButton from calibre import prints diff --git a/src/calibre/gui2/tweak_book/polish.py b/src/calibre/gui2/tweak_book/polish.py index c4f8e0f200..a1abf6439c 100644 --- a/src/calibre/gui2/tweak_book/polish.py +++ b/src/calibre/gui2/tweak_book/polish.py @@ -5,14 +5,34 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' import re -from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QDialog, QDialogButtonBox, QHBoxLayout, - QIcon, QLabel, QListWidget, QListWidgetItem, QPalette, QPen, QPixmap, QProgressBar, - QSize, QSpinBox, QStyle, QStyledItemDelegate, Qt, QTextBrowser, QVBoxLayout, - QWidget, pyqtSignal, -) from threading import Thread +from qt.core import ( + QAbstractItemView, + QApplication, + QCheckBox, + QDialog, + QDialogButtonBox, + QHBoxLayout, + QIcon, + QLabel, + QListWidget, + QListWidgetItem, + QPalette, + QPen, + QPixmap, + QProgressBar, + QSize, + QSpinBox, + QStyle, + QStyledItemDelegate, + Qt, + QTextBrowser, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import fit_image, force_unicode, human_readable from calibre.ebooks.oeb.polish.main import CUSTOMIZATION from calibre.gui2 import empty_index, question_dialog @@ -326,9 +346,10 @@ class CompressImagesProgress(Dialog): if __name__ == '__main__': from calibre.gui2 import Application app = Application([]) - import sip import sys + import sip + from calibre.ebooks.oeb.polish.container import get_container c = get_container(sys.argv[-1], tweak_mode=True) set_current_container(c) diff --git a/src/calibre/gui2/tweak_book/preferences.py b/src/calibre/gui2/tweak_book/preferences.py index 942fdc6f76..558a9d4e42 100644 --- a/src/calibre/gui2/tweak_book/preferences.py +++ b/src/calibre/gui2/tweak_book/preferences.py @@ -10,24 +10,46 @@ from copy import copy, deepcopy from functools import partial from itertools import product from operator import attrgetter, methodcaller + from qt.core import ( - QAbstractItemView, QCheckBox, QComboBox, QDialog, QDialogButtonBox, QDoubleSpinBox, - QFont, QFontComboBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout, QIcon, - QLabel, QListView, QListWidget, QListWidgetItem, QPushButton, QRadioButton, QSize, - QSizePolicy, QSpacerItem, QSpinBox, QStackedWidget, Qt, QTimer, QToolButton, - QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QDoubleSpinBox, + QFont, + QFontComboBox, + QFormLayout, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QLabel, + QListView, + QListWidget, + QListWidgetItem, + QPushButton, + QRadioButton, + QSize, + QSizePolicy, + QSpacerItem, + QSpinBox, + QStackedWidget, + Qt, + QTimer, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import prepare_string_for_xml from calibre.gui2 import info_dialog from calibre.gui2.font_family_chooser import FontFamilyChooser from calibre.gui2.keyboard import ShortcutConfig -from calibre.gui2.tweak_book import ( - actions, editor_toolbar_actions, toolbar_actions, tprefs, -) -from calibre.gui2.tweak_book.editor.themes import ( - ThemeEditor, all_theme_names, default_theme, -) +from calibre.gui2.tweak_book import actions, editor_toolbar_actions, toolbar_actions, tprefs +from calibre.gui2.tweak_book.editor.themes import ThemeEditor, all_theme_names, default_theme from calibre.gui2.tweak_book.spell import ManageDictionaries from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.widgets2 import ColorButton diff --git a/src/calibre/gui2/tweak_book/preview.py b/src/calibre/gui2/tweak_book/preview.py index e46b09f279..1254b88cd4 100644 --- a/src/calibre/gui2/tweak_book/preview.py +++ b/src/calibre/gui2/tweak_book/preview.py @@ -6,28 +6,43 @@ import json import time from collections import defaultdict from functools import partial +from threading import Thread + from qt.core import ( - QAction, QApplication, QByteArray, QHBoxLayout, QIcon, QLabel, QMenu, QSize, - QSizePolicy, QStackedLayout, Qt, QTimer, QToolBar, QUrl, QVBoxLayout, QWidget, + QAction, + QApplication, + QByteArray, + QHBoxLayout, + QIcon, + QLabel, + QMenu, + QSize, + QSizePolicy, + QStackedLayout, + Qt, + QTimer, + QToolBar, + QUrl, + QVBoxLayout, + QWidget, pyqtSignal, ) from qt.webengine import ( - QWebEngineContextMenuRequest, QWebEnginePage, QWebEngineProfile, QWebEngineScript, - QWebEngineSettings, QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, + QWebEngineContextMenuRequest, + QWebEnginePage, + QWebEngineProfile, + QWebEngineScript, + QWebEngineSettings, + QWebEngineUrlRequestJob, + QWebEngineUrlSchemeHandler, QWebEngineView, ) -from threading import Thread from calibre import prints -from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, __version__, is_running_from_develop, ismacos, iswindows, -) +from calibre.constants import FAKE_HOST, FAKE_PROTOCOL, __version__, is_running_from_develop, ismacos, iswindows from calibre.ebooks.oeb.base import OEB_DOCS, XHTML_MIME, serialize from calibre.ebooks.oeb.polish.parsing import parse -from calibre.gui2 import ( - NO_URL_FORMATTING, QT_HIDDEN_CLEAR_ACTION, error_dialog, is_dark_theme, - safe_open_url, -) +from calibre.gui2 import NO_URL_FORMATTING, QT_HIDDEN_CLEAR_ACTION, error_dialog, is_dark_theme, safe_open_url from calibre.gui2.palette import dark_color, dark_link_color, dark_text_color from calibre.gui2.tweak_book import TOP, actions, current_container, editors, tprefs from calibre.gui2.tweak_book.file_list import OpenWithHandler @@ -36,10 +51,7 @@ from calibre.gui2.webengine import RestartingWebEngineView from calibre.gui2.widgets2 import HistoryLineEdit2 from calibre.utils.ipc.simple_worker import offload_worker from calibre.utils.resources import get_path as P -from calibre.utils.webengine import ( - Bridge, create_script, from_js, insert_scripts, secure_webengine, setup_profile, - to_js, -) +from calibre.utils.webengine import Bridge, create_script, from_js, insert_scripts, secure_webengine, setup_profile, to_js from polyglot.builtins import iteritems from polyglot.queue import Empty, Queue from polyglot.urllib import urlparse diff --git a/src/calibre/gui2/tweak_book/reports.py b/src/calibre/gui2/tweak_book/reports.py index 74daaeaed8..d3cbbb9c6a 100644 --- a/src/calibre/gui2/tweak_book/reports.py +++ b/src/calibre/gui2/tweak_book/reports.py @@ -5,7 +5,6 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import os -import regex import textwrap import time from collections import defaultdict @@ -14,22 +13,52 @@ from csv import writer as csv_writer from functools import lru_cache, partial from io import StringIO from operator import itemgetter -from qt.core import ( - QAbstractItemModel, QAbstractItemView, QAbstractTableModel, QApplication, - QByteArray, QComboBox, QDialogButtonBox, QFont, QFontDatabase, QHBoxLayout, - QIcon, QLabel, QLineEdit, QListWidget, QListWidgetItem, QMenu, QModelIndex, - QPalette, QPixmap, QRadioButton, QRect, QSize, QSortFilterProxyModel, QSplitter, - QStackedLayout, QStackedWidget, QStyle, QStyledItemDelegate, Qt, QTableView, - QTextCursor, QTimer, QTreeView, QUrl, QVBoxLayout, QWidget, pyqtSignal -) from threading import Thread +import regex +from qt.core import ( + QAbstractItemModel, + QAbstractItemView, + QAbstractTableModel, + QApplication, + QByteArray, + QComboBox, + QDialogButtonBox, + QFont, + QFontDatabase, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QModelIndex, + QPalette, + QPixmap, + QRadioButton, + QRect, + QSize, + QSortFilterProxyModel, + QSplitter, + QStackedLayout, + QStackedWidget, + QStyle, + QStyledItemDelegate, + Qt, + QTableView, + QTextCursor, + QTimer, + QTreeView, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import fit_image, human_readable from calibre.constants import DEBUG -from calibre.ebooks.oeb.polish.report import ( - ClassElement, ClassEntry, ClassFileMatch, CSSEntry, CSSFileMatch, CSSRule, - LinkLocation, MatchLocation, gather_data -) +from calibre.ebooks.oeb.polish.report import ClassElement, ClassEntry, ClassFileMatch, CSSEntry, CSSFileMatch, CSSRule, LinkLocation, MatchLocation, gather_data from calibre.gui2 import choose_save_file, error_dialog, open_url, question_dialog from calibre.gui2.progress_indicator import ProgressIndicator from calibre.gui2.tweak_book import current_container, dictionaries, tprefs diff --git a/src/calibre/gui2/tweak_book/save.py b/src/calibre/gui2/tweak_book/save.py index 08f9567373..b631e7015d 100644 --- a/src/calibre/gui2/tweak_book/save.py +++ b/src/calibre/gui2/tweak_book/save.py @@ -4,17 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -import shutil, os, errno, stat +import errno +import os +import shutil +import stat from threading import Thread -from qt.core import (QObject, pyqtSignal, QLabel, QWidget, QHBoxLayout, Qt, QSize) +from qt.core import QHBoxLayout, QLabel, QObject, QSize, Qt, QWidget, pyqtSignal from calibre.constants import iswindows -from calibre.ptempfile import PersistentTemporaryFile from calibre.gui2.progress_indicator import ProgressIndicator +from calibre.ptempfile import PersistentTemporaryFile from calibre.utils import join_with_timeout from calibre.utils.filenames import atomic_rename, format_permissions -from polyglot.queue import LifoQueue, Empty +from polyglot.queue import Empty, LifoQueue def save_dir_container(container, path): diff --git a/src/calibre/gui2/tweak_book/search.py b/src/calibre/gui2/tweak_book/search.py index 80fd278c40..ff485b4429 100644 --- a/src/calibre/gui2/tweak_book/search.py +++ b/src/calibre/gui2/tweak_book/search.py @@ -3,35 +3,60 @@ import copy import json -import regex import time from collections import Counter, OrderedDict from functools import partial + +import regex from qt.core import ( - QAbstractItemView, QAbstractListModel, QAction, QApplication, QCheckBox, QComboBox, - QDialog, QDialogButtonBox, QEvent, QFont, QFrame, QGridLayout, QHBoxLayout, QIcon, - QItemSelection, QItemSelectionModel, QKeySequence, QLabel, QLineEdit, QListView, - QMenu, QMimeData, QModelIndex, QPushButton, QScrollArea, QSize, QSizePolicy, - QStackedLayout, QStyledItemDelegate, Qt, QTimer, QToolBar, QToolButton, QVBoxLayout, - QWidget, pyqtSignal, + QAbstractItemView, + QAbstractListModel, + QAction, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QEvent, + QFont, + QFrame, + QGridLayout, + QHBoxLayout, + QIcon, + QItemSelection, + QItemSelectionModel, + QKeySequence, + QLabel, + QLineEdit, + QListView, + QMenu, + QMimeData, + QModelIndex, + QPushButton, + QScrollArea, + QSize, + QSizePolicy, + QStackedLayout, + QStyledItemDelegate, + Qt, + QTimer, + QToolBar, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import prepare_string_for_xml from calibre.constants import iswindows -from calibre.ebooks.conversion.search_replace import ( - REGEX_FLAGS, compile_regular_expression, -) +from calibre.ebooks.conversion.search_replace import REGEX_FLAGS, compile_regular_expression from calibre.gui2 import choose_files, choose_save_file, error_dialog, info_dialog from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.dialogs.message_box import MessageBox from calibre.gui2.tweak_book import current_container, editors, tprefs -from calibre.gui2.tweak_book.editor.snippets import ( - KEY, MODIFIER, SnippetTextEdit, find_matching_snip, parse_template, string_length, -) -from calibre.gui2.tweak_book.function_replace import ( - Function, FunctionBox, FunctionEditor, functions as replace_functions, - remove_function, -) +from calibre.gui2.tweak_book.editor.snippets import KEY, MODIFIER, SnippetTextEdit, find_matching_snip, parse_template, string_length +from calibre.gui2.tweak_book.function_replace import Function, FunctionBox, FunctionEditor, remove_function +from calibre.gui2.tweak_book.function_replace import functions as replace_functions from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import FlowLayout, HistoryComboBox from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/tweak_book/spell.py b/src/calibre/gui2/tweak_book/spell.py index 12fce21c2c..ffcc777bd2 100644 --- a/src/calibre/gui2/tweak_book/spell.py +++ b/src/calibre/gui2/tweak_book/spell.py @@ -9,44 +9,74 @@ import sys from collections import OrderedDict, defaultdict from functools import partial from itertools import chain -from qt.core import ( - QT_VERSION_STR, QAbstractItemView, QAbstractTableModel, QAction, QApplication, - QCheckBox, QComboBox, QDialog, QDialogButtonBox, QFont, QFormLayout, QGridLayout, - QHBoxLayout, QIcon, QInputDialog, QKeySequence, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QMenu, QModelIndex, QPlainTextEdit, QPushButton, QSize, - QStackedLayout, Qt, QTableView, QTabWidget, QTimer, QToolButton, QTreeWidget, - QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread +from qt.core import ( + QT_VERSION_STR, + QAbstractItemView, + QAbstractTableModel, + QAction, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QFont, + QFormLayout, + QGridLayout, + QHBoxLayout, + QIcon, + QInputDialog, + QKeySequence, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QModelIndex, + QPlainTextEdit, + QPushButton, + QSize, + QStackedLayout, + Qt, + QTableView, + QTabWidget, + QTimer, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre.constants import __appname__ from calibre.ebooks.oeb.base import NCX_MIME, OEB_DOCS, OPF_MIME -from calibre.ebooks.oeb.polish.spell import ( - get_all_words, get_checkable_file_names, merge_locations, replace_word, - undo_replace_word, -) +from calibre.ebooks.oeb.polish.spell import get_all_words, get_checkable_file_names, merge_locations, replace_word, undo_replace_word from calibre.gui2 import choose_files, error_dialog from calibre.gui2.complete2 import LineEdit from calibre.gui2.languages import LanguagesEdit from calibre.gui2.progress_indicator import ProgressIndicator -from calibre.gui2.tweak_book import ( - current_container, dictionaries, editors, set_book_locale, tprefs, -) +from calibre.gui2.tweak_book import current_container, dictionaries, editors, set_book_locale, tprefs from calibre.gui2.tweak_book.widgets import Dialog from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import FlowLayout from calibre.spell import DictionaryLocale from calibre.spell.break_iterator import split_into_words from calibre.spell.dictionary import ( - best_locale_for_language, builtin_dictionaries, catalog_online_dictionaries, - custom_dictionaries, dprefs, get_dictionary, remove_dictionary, rename_dictionary, + best_locale_for_language, + builtin_dictionaries, + catalog_online_dictionaries, + custom_dictionaries, + dprefs, + get_dictionary, + remove_dictionary, + rename_dictionary, ) from calibre.spell.import_from import import_from_online, import_from_oxt from calibre.startup import connect_lambda from calibre.utils.icu import contains, primary_contains, primary_sort_key, sort_key -from calibre.utils.localization import ( - calibre_langcode_to_name, canonicalize_lang, get_lang, get_language, -) +from calibre.utils.localization import calibre_langcode_to_name, canonicalize_lang, get_lang, get_language from calibre.utils.resources import get_path as P from calibre_extensions.progress_indicator import set_no_activate_on_click from polyglot.builtins import iteritems diff --git a/src/calibre/gui2/tweak_book/text_search.py b/src/calibre/gui2/tweak_book/text_search.py index aab65326a1..47df5d46c2 100644 --- a/src/calibre/gui2/tweak_book/text_search.py +++ b/src/calibre/gui2/tweak_book/text_search.py @@ -3,17 +3,12 @@ from lxml.etree import tostring -from qt.core import ( - QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, QPushButton, QSizePolicy, - QVBoxLayout, QWidget, pyqtSignal, -) +from qt.core import QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, QPushButton, QSizePolicy, QVBoxLayout, QWidget, pyqtSignal from calibre import prepare_string_for_xml from calibre.gui2 import error_dialog from calibre.gui2.tweak_book import current_container, editors, tprefs -from calibre.gui2.tweak_book.search import ( - InvalidRegex, get_search_regex, initialize_search_request, -) +from calibre.gui2.tweak_book.search import InvalidRegex, get_search_regex, initialize_search_request from calibre.gui2.widgets import BusyCursor from calibre.gui2.widgets2 import HistoryComboBox from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/tweak_book/toc.py b/src/calibre/gui2/tweak_book/toc.py index 19097a8e29..3f0a07cc8b 100644 --- a/src/calibre/gui2/tweak_book/toc.py +++ b/src/calibre/gui2/tweak_book/toc.py @@ -4,13 +4,28 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' -from qt.core import ( - QAction, QApplication, QDialog, QDialogButtonBox, QGridLayout, QIcon, QMenu, QSize, - QStackedWidget, QStyledItemDelegate, Qt, QTimer, QTreeWidget, QTreeWidgetItem, - QVBoxLayout, QWidget, pyqtSignal, -) from time import monotonic +from qt.core import ( + QAction, + QApplication, + QDialog, + QDialogButtonBox, + QGridLayout, + QIcon, + QMenu, + QSize, + QStackedWidget, + QStyledItemDelegate, + Qt, + QTimer, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre.constants import ismacos from calibre.ebooks.oeb.polish.toc import commit_toc, get_toc from calibre.gui2 import error_dialog, info_dialog, make_view_use_window_background diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index 22be04cb16..cfaab76354 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -7,9 +7,25 @@ __copyright__ = '2013, Kovid Goyal ' import os from functools import partial from itertools import product + from qt.core import ( - QAction, QDockWidget, QEvent, QHBoxLayout, QIcon, QLabel, QMenu, QMenuBar, QSize, - QStackedWidget, Qt, QTabWidget, QTimer, QUrl, QVBoxLayout, QWidget, pyqtSignal, + QAction, + QDockWidget, + QEvent, + QHBoxLayout, + QIcon, + QLabel, + QMenu, + QMenuBar, + QSize, + QStackedWidget, + Qt, + QTabWidget, + QTimer, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import prints @@ -19,10 +35,7 @@ from calibre.gui2 import elided_text, open_url from calibre.gui2.keyboard import Manager as KeyboardManager from calibre.gui2.main_window import MainWindow from calibre.gui2.throbber import ThrobbingButton -from calibre.gui2.tweak_book import ( - actions, capitalize, current_container, editors, toolbar_actions, tprefs, - update_mark_text_action, -) +from calibre.gui2.tweak_book import actions, capitalize, current_container, editors, toolbar_actions, tprefs, update_mark_text_action from calibre.gui2.tweak_book.boss import Boss from calibre.gui2.tweak_book.char_select import CharSelect from calibre.gui2.tweak_book.check import Check @@ -44,9 +57,7 @@ from calibre.gui2.tweak_book.toc import TOCViewer from calibre.gui2.tweak_book.undo import CheckpointView from calibre.gui2.widgets2 import MessagePopup from calibre.utils.icu import ord_string, sort_key -from calibre.utils.localization import ( - localize_user_manual_link, localize_website_link, pgettext, -) +from calibre.utils.localization import localize_user_manual_link, localize_website_link, pgettext from calibre.utils.unicode_names import character_name_from_code from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/gui2/tweak_book/undo.py b/src/calibre/gui2/tweak_book/undo.py index 804ad57a72..5dac2ba431 100644 --- a/src/calibre/gui2/tweak_book/undo.py +++ b/src/calibre/gui2/tweak_book/undo.py @@ -7,8 +7,19 @@ __copyright__ = '2013, Kovid Goyal ' import shutil from qt.core import ( - QAbstractListModel, Qt, QModelIndex, QApplication, QWidget, - QGridLayout, QListView, QStyledItemDelegate, pyqtSignal, QPushButton, QIcon, QItemSelectionModel) + QAbstractListModel, + QApplication, + QGridLayout, + QIcon, + QItemSelectionModel, + QListView, + QModelIndex, + QPushButton, + QStyledItemDelegate, + Qt, + QWidget, + pyqtSignal, +) from calibre.gui2 import error_dialog diff --git a/src/calibre/gui2/tweak_book/widgets.py b/src/calibre/gui2/tweak_book/widgets.py index 1b492ae80f..0a1bba54ba 100644 --- a/src/calibre/gui2/tweak_book/widgets.py +++ b/src/calibre/gui2/tweak_book/widgets.py @@ -9,38 +9,63 @@ import textwrap import unicodedata from collections import OrderedDict from math import ceil + from qt.core import ( - QAbstractListModel, QApplication, QCheckBox, QComboBox, QDialog, QDialogButtonBox, - QEvent, QFormLayout, QFrame, QGridLayout, QGroupBox, QHBoxLayout, QIcon, - QItemSelectionModel, QLabel, QLineEdit, QListView, QMimeData, QModelIndex, QPainter, - QPalette, QPixmap, QPlainTextEdit, QPoint, QRect, QSize, QSizePolicy, QSplitter, - QStaticText, QStyle, QStyledItemDelegate, Qt, QTextCursor, QTextDocument, - QTextOption, QToolButton, QVBoxLayout, QWidget, pyqtSignal, + QAbstractListModel, + QApplication, + QCheckBox, + QComboBox, + QDialog, + QDialogButtonBox, + QEvent, + QFormLayout, + QFrame, + QGridLayout, + QGroupBox, + QHBoxLayout, + QIcon, + QItemSelectionModel, + QLabel, + QLineEdit, + QListView, + QMimeData, + QModelIndex, + QPainter, + QPalette, + QPixmap, + QPlainTextEdit, + QPoint, + QRect, + QSize, + QSizePolicy, + QSplitter, + QStaticText, + QStyle, + QStyledItemDelegate, + Qt, + QTextCursor, + QTextDocument, + QTextOption, + QToolButton, + QVBoxLayout, + QWidget, + pyqtSignal, ) from calibre import human_readable, prepare_string_for_xml from calibre.constants import iswindows from calibre.ebooks.oeb.polish.cover import get_raster_cover_name -from calibre.ebooks.oeb.polish.toc import ( - ensure_container_has_nav, get_guide_landmarks, get_nav_landmarks, set_landmarks, -) +from calibre.ebooks.oeb.polish.toc import ensure_container_has_nav, get_guide_landmarks, get_nav_landmarks, set_landmarks from calibre.ebooks.oeb.polish.upgrade import guide_epubtype_map from calibre.ebooks.oeb.polish.utils import guess_type, lead_text -from calibre.gui2 import ( - choose_files, choose_images, choose_save_file, error_dialog, info_dialog, -) +from calibre.gui2 import choose_files, choose_images, choose_save_file, error_dialog, info_dialog from calibre.gui2.complete2 import EditWithComplete from calibre.gui2.tweak_book import current_container, tprefs -from calibre.gui2.widgets2 import ( - PARAGRAPH_SEPARATOR, Dialog as BaseDialog, HistoryComboBox, to_plain_text, -) +from calibre.gui2.widgets2 import PARAGRAPH_SEPARATOR, HistoryComboBox, to_plain_text +from calibre.gui2.widgets2 import Dialog as BaseDialog from calibre.startup import connect_lambda -from calibre.utils.icu import ( - numeric_sort_key, primary_contains, primary_sort_key, sort_key, -) -from calibre.utils.matcher import ( - DEFAULT_LEVEL1, DEFAULT_LEVEL2, DEFAULT_LEVEL3, Matcher, get_char, -) +from calibre.utils.icu import numeric_sort_key, primary_contains, primary_sort_key, sort_key +from calibre.utils.matcher import DEFAULT_LEVEL1, DEFAULT_LEVEL2, DEFAULT_LEVEL3, Matcher, get_char from polyglot.builtins import iteritems ROOT = QModelIndex() diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index e1d438f9c0..ea91e925c1 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -8,7 +8,6 @@ __docformat__ = 'restructuredtext en' '''The main GUI''' -import apsw import errno import gc import os @@ -18,21 +17,27 @@ import textwrap import time from collections import OrderedDict, deque from io import BytesIO -from qt.core import ( - QAction, QApplication, QDialog, QFont, QIcon, QMenu, QSystemTrayIcon, Qt, QTimer, - QUrl, pyqtSignal, -) + +import apsw +from qt.core import QAction, QApplication, QDialog, QFont, QIcon, QMenu, QSystemTrayIcon, Qt, QTimer, QUrl, pyqtSignal from calibre import detect_ncpus, force_unicode, prints -from calibre.constants import ( - DEBUG, __appname__, config_dir, filesystem_encoding, ismacos, iswindows, -) +from calibre.constants import DEBUG, __appname__, config_dir, filesystem_encoding, ismacos, iswindows from calibre.customize import PluginInstallationType from calibre.customize.ui import available_store_plugins, interface_actions from calibre.db.legacy import LibraryDatabase from calibre.gui2 import ( - Dispatcher, GetMetadata, config, error_dialog, gprefs, info_dialog, - max_available_height, open_url, question_dialog, timed_print, warning_dialog, + Dispatcher, + GetMetadata, + config, + error_dialog, + gprefs, + info_dialog, + max_available_height, + open_url, + question_dialog, + timed_print, + warning_dialog, ) from calibre.gui2.auto_add import AutoAdder from calibre.gui2.changes import handle_changes @@ -55,12 +60,13 @@ from calibre.gui2.search_box import SavedSearchBoxMixin, SearchBoxMixin from calibre.gui2.search_restriction_mixin import SearchRestrictionMixin from calibre.gui2.tag_browser.ui import TagBrowserMixin from calibre.gui2.update import UpdateMixin -from calibre.gui2.widgets import ProgressIndicator, BusyCursor +from calibre.gui2.widgets import BusyCursor, ProgressIndicator from calibre.library import current_library_name from calibre.srv.library_broker import GuiLibraryBroker, db_matches from calibre.utils.config import dynamic, prefs from calibre.utils.ipc.pool import Pool -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from polyglot.builtins import string_or_bytes from polyglot.queue import Empty, Queue @@ -944,9 +950,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ det_msg=traceback.format_exc() ) if repair: - from calibre.gui2.dialogs.restore_library import ( - repair_library_at, - ) + from calibre.gui2.dialogs.restore_library import repair_library_at if repair_library_at(newloc, parent=self): db = LibraryDatabase(newloc, default_prefs=default_prefs) else: diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 237f363734..61194cf5fd 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -3,16 +3,12 @@ __copyright__ = '2008, Kovid Goyal ' import re import ssl -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QObject, Qt, QUrl, - pyqtSignal, -) from threading import Event, Thread +from qt.core import QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QIcon, QLabel, QObject, Qt, QUrl, pyqtSignal + from calibre import as_unicode, prints -from calibre.constants import ( - __appname__, __version__, ismacos, isportable, iswindows, numeric_version, -) +from calibre.constants import __appname__, __version__, ismacos, isportable, iswindows, numeric_version from calibre.gui2 import config, dynamic, icon_resource_manager, open_url from calibre.gui2.dialogs.plugin_updater import get_plugin_updates_available from calibre.utils.config import prefs @@ -167,9 +163,7 @@ class UpdateNotification(QDialog): save_version_notified(calibre_version) def get_plugins(self): - from calibre.gui2.dialogs.plugin_updater import ( - FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog, - ) + from calibre.gui2.dialogs.plugin_updater import FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog d = PluginUpdaterDialog(self.parent(), initial_filter=FILTER_UPDATE_AVAILABLE) d.exec() @@ -237,9 +231,7 @@ class UpdateMixin: self._update_notification__.show() elif has_plugin_updates: if force: - from calibre.gui2.dialogs.plugin_updater import ( - FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog, - ) + from calibre.gui2.dialogs.plugin_updater import FILTER_UPDATE_AVAILABLE, PluginUpdaterDialog d = PluginUpdaterDialog(self, initial_filter=FILTER_UPDATE_AVAILABLE) d.exec() diff --git a/src/calibre/gui2/viewer/bookmarks.py b/src/calibre/gui2/viewer/bookmarks.py index 81146cb53a..eb3b9647ed 100644 --- a/src/calibre/gui2/viewer/bookmarks.py +++ b/src/calibre/gui2/viewer/bookmarks.py @@ -4,10 +4,23 @@ import json from operator import itemgetter + from qt.core import ( - QAbstractItemView, QAction, QComboBox, QGridLayout, QHBoxLayout, QIcon, - QInputDialog, QItemSelectionModel, QLabel, QListWidget, QListWidgetItem, - QPushButton, Qt, QWidget, pyqtSignal, + QAbstractItemView, + QAction, + QComboBox, + QGridLayout, + QHBoxLayout, + QIcon, + QInputDialog, + QItemSelectionModel, + QLabel, + QListWidget, + QListWidgetItem, + QPushButton, + Qt, + QWidget, + pyqtSignal, ) from calibre.gui2 import choose_files, choose_save_file, error_dialog diff --git a/src/calibre/gui2/viewer/config.py b/src/calibre/gui2/viewer/config.py index 02ee94bcdb..6d33d82ac9 100644 --- a/src/calibre/gui2/viewer/config.py +++ b/src/calibre/gui2/viewer/config.py @@ -111,7 +111,7 @@ def save_viewer_profile(profile_name, profile, *user_names: str): profile = json.loads(profile) if isinstance(profile, dict): profile['__timestamp__'] = isoformat(utcnow()) - from calibre.gui2.viewer.toolbars import current_actions, DEFAULT_ACTIONS + from calibre.gui2.viewer.toolbars import DEFAULT_ACTIONS, current_actions ca = current_actions() s = {} if ca != DEFAULT_ACTIONS: diff --git a/src/calibre/gui2/viewer/control_sleep.py b/src/calibre/gui2/viewer/control_sleep.py index 3273846176..175019d437 100644 --- a/src/calibre/gui2/viewer/control_sleep.py +++ b/src/calibre/gui2/viewer/control_sleep.py @@ -5,10 +5,7 @@ from calibre.constants import ismacos, iswindows if iswindows: - from calibre_extensions.winutil import ( - ES_CONTINUOUS, ES_DISPLAY_REQUIRED, ES_SYSTEM_REQUIRED, - set_thread_execution_state - ) + from calibre_extensions.winutil import ES_CONTINUOUS, ES_DISPLAY_REQUIRED, ES_SYSTEM_REQUIRED, set_thread_execution_state def prevent_sleep(reason=''): set_thread_execution_state(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED) @@ -17,10 +14,7 @@ if iswindows: def allow_sleep(cookie): set_thread_execution_state(ES_CONTINUOUS) elif ismacos: - from calibre_extensions.cocoa import ( - create_io_pm_assertion, kIOPMAssertionTypeNoDisplaySleep, - release_io_pm_assertion - ) + from calibre_extensions.cocoa import create_io_pm_assertion, kIOPMAssertionTypeNoDisplaySleep, release_io_pm_assertion def prevent_sleep(reason=''): return create_io_pm_assertion(kIOPMAssertionTypeNoDisplaySleep, reason or 'E-book viewer automated reading in progress') diff --git a/src/calibre/gui2/viewer/highlights.py b/src/calibre/gui2/viewer/highlights.py index da58a92fee..e7caedadcc 100644 --- a/src/calibre/gui2/viewer/highlights.py +++ b/src/calibre/gui2/viewer/highlights.py @@ -6,23 +6,44 @@ import math from collections import defaultdict from functools import lru_cache from itertools import chain + from qt.core import ( - QAbstractItemView, QColor, QDialog, QFont, QHBoxLayout, QIcon, QImage, - QItemSelectionModel, QKeySequence, QLabel, QMenu, QPainter, QPainterPath, QPalette, - QPixmap, QPushButton, QRect, QSizePolicy, QStyle, Qt, QTextCursor, QTextEdit, - QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, + QAbstractItemView, + QColor, + QDialog, + QFont, + QHBoxLayout, + QIcon, + QImage, + QItemSelectionModel, + QKeySequence, + QLabel, + QMenu, + QPainter, + QPainterPath, + QPalette, + QPixmap, + QPushButton, + QRect, + QSizePolicy, + QStyle, + Qt, + QTextCursor, + QTextEdit, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, ) -from calibre.constants import ( - builtin_colors_dark, builtin_colors_light, builtin_decorations, -) +from calibre.constants import builtin_colors_dark, builtin_colors_light, builtin_decorations from calibre.ebooks.epub.cfi.parse import cfi_sort_key from calibre.gui2 import error_dialog, is_dark_theme, safe_open_url from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.gestures import GestureManager -from calibre.gui2.library.annotations import ( - ChapterGroup, Details, Export as ExportBase, render_notes, -) +from calibre.gui2.library.annotations import ChapterGroup, Details, render_notes +from calibre.gui2.library.annotations import Export as ExportBase from calibre.gui2.viewer import get_boss, link_prefix_for_location_links from calibre.gui2.viewer.config import vprefs from calibre.gui2.viewer.search import SearchInput diff --git a/src/calibre/gui2/viewer/integration.py b/src/calibre/gui2/viewer/integration.py index 790e773114..b260d90a43 100644 --- a/src/calibre/gui2/viewer/integration.py +++ b/src/calibre/gui2/viewer/integration.py @@ -29,7 +29,8 @@ def database_has_annotations_support(cursor): def load_annotations_map_from_library(book_library_details, user_type='local', user='viewer'): import apsw - from calibre.db.backend import annotations_for_book, Connection + + from calibre.db.backend import Connection, annotations_for_book ans = {} dbpath = book_library_details['dbpath'] try: @@ -53,9 +54,10 @@ def load_annotations_map_from_library(book_library_details, user_type='local', u def save_annotations_list_to_library(book_library_details, alist, sync_annots_user=''): import apsw - from calibre.db.backend import save_annotations_for_book, Connection, annotations_for_book - from calibre.gui2.viewer.annotations import annotations_as_copied_list + from calibre.db.annotations import merge_annotations + from calibre.db.backend import Connection, annotations_for_book, save_annotations_for_book + from calibre.gui2.viewer.annotations import annotations_as_copied_list dbpath = book_library_details['dbpath'] try: conn = apsw.Connection(dbpath, flags=apsw.SQLITE_OPEN_READWRITE) diff --git a/src/calibre/gui2/viewer/lookup.py b/src/calibre/gui2/viewer/lookup.py index 0af86a2104..dedd1701e3 100644 --- a/src/calibre/gui2/viewer/lookup.py +++ b/src/calibre/gui2/viewer/lookup.py @@ -5,15 +5,34 @@ import sys import textwrap from functools import lru_cache + from qt.core import ( - QAbstractItemView, QApplication, QCheckBox, QComboBox, QDateTime, QDialog, - QDialogButtonBox, QFormLayout, QHBoxLayout, QIcon, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QNetworkCookie, QPalette, QPushButton, QSize, Qt, QTimer, QUrl, - QVBoxLayout, QWidget, pyqtSignal, -) -from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineView, + QAbstractItemView, + QApplication, + QCheckBox, + QComboBox, + QDateTime, + QDialog, + QDialogButtonBox, + QFormLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QNetworkCookie, + QPalette, + QPushButton, + QSize, + Qt, + QTimer, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, ) +from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineView from calibre import prints, random_user_agent from calibre.ebooks.metadata.sources.search_engines import google_consent_cookies @@ -22,9 +41,7 @@ from calibre.gui2.viewer.web_view import apply_font_settings, vprefs from calibre.gui2.widgets2 import Dialog from calibre.utils.localization import _, canonicalize_lang, get_lang, lang_as_iso639_1 from calibre.utils.resources import get_path as P -from calibre.utils.webengine import ( - create_script, insert_scripts, secure_webengine, setup_profile, -) +from calibre.utils.webengine import create_script, insert_scripts, secure_webengine, setup_profile @lru_cache diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 491e67e545..022b5fb0b2 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -6,6 +6,7 @@ import json import os import sys from contextlib import closing + from qt.core import QIcon, QObject, Qt, QTimer, pyqtSignal from calibre.constants import VIEWER_APP_UID, islinux diff --git a/src/calibre/gui2/viewer/overlay.py b/src/calibre/gui2/viewer/overlay.py index 6513e3e1ed..62af32ccc8 100644 --- a/src/calibre/gui2/viewer/overlay.py +++ b/src/calibre/gui2/viewer/overlay.py @@ -2,7 +2,7 @@ # License: GPL v3 Copyright: 2019, Kovid Goyal -from qt.core import QWidget, Qt, QFontInfo, QLabel, QVBoxLayout, QPalette +from qt.core import QFontInfo, QLabel, QPalette, Qt, QVBoxLayout, QWidget from calibre.gui2.progress_indicator import ProgressIndicator diff --git a/src/calibre/gui2/viewer/printing.py b/src/calibre/gui2/viewer/printing.py index 65d3c5860b..ea636a0e2e 100644 --- a/src/calibre/gui2/viewer/printing.py +++ b/src/calibre/gui2/viewer/printing.py @@ -5,17 +5,27 @@ import os import subprocess import sys -from qt.core import ( - QCheckBox, QDialog, QDoubleSpinBox, QFormLayout, QHBoxLayout, QIcon, QLabel, - QLineEdit, QPageSize, QProgressDialog, QTimer, QToolButton, QVBoxLayout, -) from threading import Thread +from qt.core import ( + QCheckBox, + QDialog, + QDoubleSpinBox, + QFormLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QPageSize, + QProgressDialog, + QTimer, + QToolButton, + QVBoxLayout, +) + from calibre import sanitize_file_name from calibre.ebooks.conversion.plugins.pdf_output import PAPER_SIZES -from calibre.gui2 import ( - Application, choose_save_file, dynamic, elided_text, error_dialog, open_local_file, -) +from calibre.gui2 import Application, choose_save_file, dynamic, elided_text, error_dialog, open_local_file from calibre.gui2.widgets import PaperSizes from calibre.gui2.widgets2 import Dialog from calibre.ptempfile import PersistentTemporaryFile diff --git a/src/calibre/gui2/viewer/search.py b/src/calibre/gui2/viewer/search.py index 8a6ce60741..c92d541b91 100644 --- a/src/calibre/gui2/viewer/search.py +++ b/src/calibre/gui2/viewer/search.py @@ -2,15 +2,29 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal import json -import regex from collections import Counter, OrderedDict from html import escape -from qt.core import ( - QAbstractItemView, QCheckBox, QComboBox, QFont, QHBoxLayout, QIcon, QLabel, QMenu, - Qt, QToolButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread +import regex +from qt.core import ( + QAbstractItemView, + QCheckBox, + QComboBox, + QFont, + QHBoxLayout, + QIcon, + QLabel, + QMenu, + Qt, + QToolButton, + QTreeWidget, + QTreeWidgetItem, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre.ebooks.conversion.search_replace import REGEX_FLAGS from calibre.gui2 import warning_dialog from calibre.gui2.gestures import GestureManager diff --git a/src/calibre/gui2/viewer/shortcuts.py b/src/calibre/gui2/viewer/shortcuts.py index c6d21fda31..01b8ca327c 100644 --- a/src/calibre/gui2/viewer/shortcuts.py +++ b/src/calibre/gui2/viewer/shortcuts.py @@ -4,7 +4,6 @@ from qt.core import QKeySequence, QMainWindow, Qt - key_name_to_qt_name = { 'ArrowRight': 'Right', 'ArrowLeft': 'Left', diff --git a/src/calibre/gui2/viewer/toc.py b/src/calibre/gui2/viewer/toc.py index 5eca6cc0c0..925e0552f5 100644 --- a/src/calibre/gui2/viewer/toc.py +++ b/src/calibre/gui2/viewer/toc.py @@ -4,10 +4,25 @@ import re from functools import partial + from qt.core import ( - QAbstractItemView, QApplication, QEvent, QFont, QHBoxLayout, QIcon, QMenu, - QModelIndex, QStandardItem, QStandardItemModel, QStyledItemDelegate, Qt, - QToolButton, QToolTip, QTreeView, QWidget, pyqtSignal, + QAbstractItemView, + QApplication, + QEvent, + QFont, + QHBoxLayout, + QIcon, + QMenu, + QModelIndex, + QStandardItem, + QStandardItemModel, + QStyledItemDelegate, + Qt, + QToolButton, + QToolTip, + QTreeView, + QWidget, + pyqtSignal, ) from calibre.gui2 import error_dialog diff --git a/src/calibre/gui2/viewer/toolbars.py b/src/calibre/gui2/viewer/toolbars.py index f8ebea7ed6..e5309462f0 100644 --- a/src/calibre/gui2/viewer/toolbars.py +++ b/src/calibre/gui2/viewer/toolbars.py @@ -4,10 +4,26 @@ import os from functools import partial + from qt.core import ( - QAbstractItemView, QAction, QDialog, QDialogButtonBox, QGroupBox, QHBoxLayout, - QIcon, QInputDialog, QKeySequence, QLabel, QListWidget, QListWidgetItem, QMenu, Qt, - QToolBar, QToolButton, QVBoxLayout, pyqtSignal, + QAbstractItemView, + QAction, + QDialog, + QDialogButtonBox, + QGroupBox, + QHBoxLayout, + QIcon, + QInputDialog, + QKeySequence, + QLabel, + QListWidget, + QListWidgetItem, + QMenu, + Qt, + QToolBar, + QToolButton, + QVBoxLayout, + pyqtSignal, ) from qt.webengine import QWebEnginePage diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index a493df7977..4061ae8b3e 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -8,36 +8,43 @@ import sys import time from collections import defaultdict, namedtuple from hashlib import sha256 +from threading import Thread + from qt.core import ( - QApplication, QCursor, QDockWidget, QEvent, QMainWindow, QMenu, QMimeData, - QModelIndex, QPixmap, Qt, QTimer, QToolBar, QUrl, QVBoxLayout, QWidget, pyqtSignal, + QApplication, + QCursor, + QDockWidget, + QEvent, + QMainWindow, + QMenu, + QMimeData, + QModelIndex, + QPixmap, + Qt, + QTimer, + QToolBar, + QUrl, + QVBoxLayout, + QWidget, + pyqtSignal, sip, ) -from threading import Thread from calibre import prints from calibre.constants import ismacos, iswindows from calibre.customize.ui import available_input_formats from calibre.db.annotations import merge_annotations -from calibre.gui2 import ( - add_to_recent_docs, choose_files, error_dialog, sanitize_env_vars, -) +from calibre.gui2 import add_to_recent_docs, choose_files, error_dialog, sanitize_env_vars from calibre.gui2.dialogs.drm_error import DRMErrorMessage from calibre.gui2.image_popup import ImagePopup from calibre.gui2.main_window import MainWindow from calibre.gui2.viewer import get_boss, get_current_book_data, performance_monitor -from calibre.gui2.viewer.annotations import ( - AnnotationsSaveWorker, annotations_dir, parse_annotations, -) +from calibre.gui2.viewer.annotations import AnnotationsSaveWorker, annotations_dir, parse_annotations from calibre.gui2.viewer.bookmarks import BookmarkManager -from calibre.gui2.viewer.config import ( - get_session_pref, load_reading_rates, save_reading_rates, vprefs, -) +from calibre.gui2.viewer.config import get_session_pref, load_reading_rates, save_reading_rates, vprefs from calibre.gui2.viewer.convert_book import clean_running_workers, prepare_book from calibre.gui2.viewer.highlights import HighlightsPanel -from calibre.gui2.viewer.integration import ( - get_book_library_details, load_annotations_map_from_library, -) +from calibre.gui2.viewer.integration import get_book_library_details, load_annotations_map_from_library from calibre.gui2.viewer.lookup import Lookup from calibre.gui2.viewer.overlay import LoadingOverlay from calibre.gui2.viewer.search import SearchPanel diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index ec91e08684..1969c853f4 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -5,29 +5,43 @@ import os import shutil import sys from itertools import count + from qt.core import ( - QT_VERSION, QApplication, QByteArray, QEvent, QFontDatabase, QFontInfo, QHBoxLayout, - QLocale, QMimeData, QPalette, QSize, Qt, QTimer, QUrl, QWidget, pyqtSignal, sip, + QT_VERSION, + QApplication, + QByteArray, + QEvent, + QFontDatabase, + QFontInfo, + QHBoxLayout, + QLocale, + QMimeData, + QPalette, + QSize, + Qt, + QTimer, + QUrl, + QWidget, + pyqtSignal, + sip, ) from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineSettings, - QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler, QWebEngineView, + QWebEnginePage, + QWebEngineProfile, + QWebEngineScript, + QWebEngineSettings, + QWebEngineUrlRequestJob, + QWebEngineUrlSchemeHandler, + QWebEngineView, ) from calibre import as_unicode, prints -from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, __version__, in_develop_mode, is_running_from_develop, - ismacos, iswindows, -) +from calibre.constants import FAKE_HOST, FAKE_PROTOCOL, __version__, in_develop_mode, is_running_from_develop, ismacos, iswindows from calibre.ebooks.metadata.book.base import field_metadata from calibre.ebooks.oeb.polish.utils import guess_type from calibre.gui2 import choose_images, config, error_dialog, safe_open_url -from calibre.gui2.viewer import ( - link_prefix_for_location_links, performance_monitor, url_for_book_in_library, -) -from calibre.gui2.viewer.config import ( - load_viewer_profiles, save_viewer_profile, viewer_config_dir, vprefs, -) +from calibre.gui2.viewer import link_prefix_for_location_links, performance_monitor, url_for_book_in_library +from calibre.gui2.viewer.config import load_viewer_profiles, save_viewer_profile, viewer_config_dir, vprefs from calibre.gui2.viewer.tts import TTS from calibre.gui2.webengine import RestartingWebEngineView from calibre.srv.code import get_translations_data @@ -36,10 +50,7 @@ from calibre.utils.localization import _, localize_user_manual_link from calibre.utils.resources import get_path as P from calibre.utils.serialize import json_loads from calibre.utils.shared_file import share_open -from calibre.utils.webengine import ( - Bridge, create_script, from_js, insert_scripts, secure_webengine, send_reply, - setup_profile, to_js, -) +from calibre.utils.webengine import Bridge, create_script, from_js, insert_scripts, secure_webengine, send_reply, setup_profile, to_js from polyglot.builtins import as_bytes, iteritems from polyglot.functools import lru_cache diff --git a/src/calibre/gui2/viewer/widgets.py b/src/calibre/gui2/viewer/widgets.py index 514fa4e20c..2c8c704f93 100644 --- a/src/calibre/gui2/viewer/widgets.py +++ b/src/calibre/gui2/viewer/widgets.py @@ -2,9 +2,8 @@ # License: GPL v3 Copyright: 2020, Kovid Goyal import re -from qt.core import ( - QAction, QFont, QFontMetrics, QPalette, QStyle, QStyledItemDelegate, Qt, pyqtSignal, -) + +from qt.core import QAction, QFont, QFontMetrics, QPalette, QStyle, QStyledItemDelegate, Qt, pyqtSignal from calibre.gui2 import QT_HIDDEN_CLEAR_ACTION from calibre.gui2.widgets2 import HistoryComboBox diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 8211d542f9..833c586570 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -5,22 +5,46 @@ Miscellaneous widgets used in the GUI ''' import os import re + from qt.core import ( - QApplication, QClipboard, QColor, QComboBox, QCompleter, QCursor, QEvent, QFont, - QGraphicsScene, QGraphicsView, QIcon, QLabel, QLineEdit, QListWidget, - QListWidgetItem, QMenu, QPageSize, QPainter, QPalette, QPen, QPixmap, QPrinter, - QRect, QSize, QSplitterHandle, QStringListModel, QSyntaxHighlighter, Qt, - QTextCharFormat, QWidget, pyqtSignal, + QApplication, + QClipboard, + QColor, + QComboBox, + QCompleter, + QCursor, + QEvent, + QFont, + QGraphicsScene, + QGraphicsView, + QIcon, + QLabel, + QLineEdit, + QListWidget, + QListWidgetItem, + QMenu, + QPageSize, + QPainter, + QPalette, + QPen, + QPixmap, + QPrinter, + QRect, + QSize, + QSplitterHandle, + QStringListModel, + QSyntaxHighlighter, + Qt, + QTextCharFormat, + QWidget, + pyqtSignal, ) from calibre import fit_image, force_unicode, strftime from calibre.constants import ismacos, iswindows from calibre.ebooks import BOOK_EXTENSIONS from calibre.gui2 import error_dialog, gprefs, pixmap_to_data, warning_dialog -from calibre.gui2.dnd import ( - DownloadDialog, dnd_get_files, dnd_get_image, dnd_get_local_image_and_pixmap, - dnd_has_extension, dnd_has_image, image_extensions, -) +from calibre.gui2.dnd import DownloadDialog, dnd_get_files, dnd_get_image, dnd_get_local_image_and_pixmap, dnd_has_extension, dnd_has_image, image_extensions from calibre.gui2.filename_pattern_ui import Ui_Form from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndicator from calibre.startup import connect_lambda diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py index 6040479314..bc3ff90242 100644 --- a/src/calibre/gui2/widgets2.py +++ b/src/calibre/gui2/widgets2.py @@ -3,22 +3,62 @@ import weakref + from qt.core import ( - QApplication, QBrush, QByteArray, QCalendarWidget, QCheckBox, QColor, QColorDialog, - QComboBox, QDate, QDateTime, QDateTimeEdit, QDialog, QDialogButtonBox, QFont, - QFontInfo, QFontMetrics, QFrame, QIcon, QKeySequence, QLabel, QLayout, QMenu, - QMimeData, QPainter, QPalette, QPixmap, QPoint, QPushButton, QRect, QScrollArea, - QSize, QSizePolicy, QStyle, QStyledItemDelegate, QStyleOptionToolButton, - QStylePainter, Qt, QTabWidget, QTextBrowser, QTextCursor, QTextDocument, QTimer, - QToolButton, QUndoCommand, QUndoStack, QUrl, QWidget, pyqtSignal, + QApplication, + QBrush, + QByteArray, + QCalendarWidget, + QCheckBox, + QColor, + QColorDialog, + QComboBox, + QDate, + QDateTime, + QDateTimeEdit, + QDialog, + QDialogButtonBox, + QFont, + QFontInfo, + QFontMetrics, + QFrame, + QIcon, + QKeySequence, + QLabel, + QLayout, + QMenu, + QMimeData, + QPainter, + QPalette, + QPixmap, + QPoint, + QPushButton, + QRect, + QScrollArea, + QSize, + QSizePolicy, + QStyle, + QStyledItemDelegate, + QStyleOptionToolButton, + QStylePainter, + Qt, + QTabWidget, + QTextBrowser, + QTextCursor, + QTextDocument, + QTimer, + QToolButton, + QUndoCommand, + QUndoStack, + QUrl, + QWidget, + pyqtSignal, ) from calibre import prepare_string_for_xml from calibre.constants import builtin_colors_dark, builtin_colors_light from calibre.ebooks.metadata import rating_to_stars -from calibre.gui2 import ( - UNDEFINED_QDATETIME, gprefs, local_path_for_resource, rating_font, -) +from calibre.gui2 import UNDEFINED_QDATETIME, gprefs, local_path_for_resource, rating_font from calibre.gui2.complete2 import EditWithComplete, LineEdit from calibre.gui2.widgets import history from calibre.utils.config_base import tweaks diff --git a/src/calibre/gui2/wizard/__init__.py b/src/calibre/gui2/wizard/__init__.py index 1e42eabb0e..07105dee15 100644 --- a/src/calibre/gui2/wizard/__init__.py +++ b/src/calibre/gui2/wizard/__init__.py @@ -9,10 +9,8 @@ import os import re import traceback from contextlib import closing, suppress -from qt.core import ( - QAbstractListModel, QDir, QIcon, QItemSelection, QItemSelectionModel, Qt, QWizard, - QWizardPage, pyqtSignal, -) + +from qt.core import QAbstractListModel, QDir, QIcon, QItemSelection, QItemSelectionModel, Qt, QWizard, QWizardPage, pyqtSignal from calibre import __appname__ from calibre.constants import filesystem_encoding, isportable, iswindows @@ -716,9 +714,7 @@ class LibraryPage(QWizardPage, LibraryUI): def init_languages(self): self.language.blockSignals(True) self.language.clear() - from calibre.utils.localization import ( - available_translations, get_lang, get_language, get_lc_messages_path, - ) + from calibre.utils.localization import available_translations, get_lang, get_language, get_lc_messages_path lang = get_lang() lang = get_lc_messages_path(lang) if lang else lang if lang is None or lang not in available_translations(): diff --git a/src/calibre/gui2/wizard/send_email.py b/src/calibre/gui2/wizard/send_email.py index 8249790939..c3df40de94 100644 --- a/src/calibre/gui2/wizard/send_email.py +++ b/src/calibre/gui2/wizard/send_email.py @@ -7,12 +7,25 @@ __docformat__ = 'restructuredtext en' import sys from functools import partial -from qt.core import ( - QCheckBox, QDialog, QDialogButtonBox, QGridLayout, QHBoxLayout, QIcon, QLabel, - QLineEdit, QPlainTextEdit, QPushButton, Qt, QVBoxLayout, QWidget, pyqtSignal, -) from threading import Thread +from qt.core import ( + QCheckBox, + QDialog, + QDialogButtonBox, + QGridLayout, + QHBoxLayout, + QIcon, + QLabel, + QLineEdit, + QPlainTextEdit, + QPushButton, + Qt, + QVBoxLayout, + QWidget, + pyqtSignal, +) + from calibre import prints from calibre.gui2 import error_dialog, question_dialog from calibre.gui2.wizard.send_email_ui import Ui_Form diff --git a/src/calibre/gui_launch.py b/src/calibre/gui_launch.py index e0bf492d2b..482ac877cf 100644 --- a/src/calibre/gui_launch.py +++ b/src/calibre/gui_launch.py @@ -4,7 +4,8 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, sys +import os +import sys # For some reason Qt 5 crashes on some linux systems if the fork() is done # after the Qt modules are loaded in calibre.gui2. We also cannot do a fork() @@ -39,7 +40,7 @@ qt.webenginecontext.info=false def detach_gui(): - from calibre.constants import islinux, isbsd, DEBUG + from calibre.constants import DEBUG, isbsd, islinux if (islinux or isbsd) and not DEBUG and '--detach' in sys.argv: do_detach() @@ -47,8 +48,8 @@ def detach_gui(): def register_with_default_programs(): from calibre.constants import iswindows if iswindows: - from calibre.utils.winreg.default_programs import Register from calibre.gui2 import gprefs + from calibre.utils.winreg.default_programs import Register return Register(gprefs) else: class Dummy: @@ -74,8 +75,9 @@ def calibre(args=sys.argv): def is_possible_media_pack_error(e): - from calibre.constants import iswindows from ctypes.util import find_library + + from calibre.constants import iswindows if iswindows and 'QtWebEngine' in str(e): if not find_library('MFTranscode.dll'): return True @@ -84,7 +86,8 @@ def is_possible_media_pack_error(e): def show_media_pack_error(): import traceback - from calibre.gui2 import error_dialog, Application + + from calibre.gui2 import Application, error_dialog from calibre.utils.localization import _ app = Application([]) error_dialog(None, _('Required component missing'), '

' + _( diff --git a/src/calibre/library/__init__.py b/src/calibre/library/__init__.py index 6b9978a8be..6ffac893bc 100644 --- a/src/calibre/library/__init__.py +++ b/src/calibre/library/__init__.py @@ -24,7 +24,12 @@ def generate_test_db(library_path, # {{{ max_authors=10, max_tags=10 ): - import random, string, os, sys, time + import os + import random + import string + import sys + import time + from calibre.constants import preferred_encoding if not os.path.exists(library_path): diff --git a/src/calibre/library/catalogs/epub_mobi.py b/src/calibre/library/catalogs/epub_mobi.py index ae95691c71..a5ae05c83c 100644 --- a/src/calibre/library/catalogs/epub_mobi.py +++ b/src/calibre/library/catalogs/epub_mobi.py @@ -16,9 +16,7 @@ from calibre.customize.conversion import DummyReporter, OptionRecommendation from calibre.library import current_library_name from calibre.library.catalogs import AuthorSortMismatchException, EmptyCatalogException from calibre.ptempfile import PersistentTemporaryFile -from calibre.utils.localization import ( - _, calibre_langcode_to_name, canonicalize_lang, get_lang, -) +from calibre.utils.localization import _, calibre_langcode_to_name, canonicalize_lang, get_lang Option = namedtuple('Option', 'option, default, dest, action, help') diff --git a/src/calibre/library/catalogs/epub_mobi_builder.py b/src/calibre/library/catalogs/epub_mobi_builder.py index ad26ab615d..246e7d835e 100644 --- a/src/calibre/library/catalogs/epub_mobi_builder.py +++ b/src/calibre/library/catalogs/epub_mobi_builder.py @@ -10,13 +10,11 @@ import time import unicodedata import zlib from copy import deepcopy -from lxml import etree from xml.sax.saxutils import escape -from calibre import ( - as_unicode, force_unicode, isbytestring, prepare_string_for_xml, replace_entities, - strftime, xml_replace_entities, -) +from lxml import etree + +from calibre import as_unicode, force_unicode, isbytestring, prepare_string_for_xml, replace_entities, strftime, xml_replace_entities from calibre.constants import cache_dir, ismacos from calibre.customize.conversion import DummyReporter from calibre.customize.ui import output_profiles @@ -24,22 +22,19 @@ from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, prettif from calibre.ebooks.chardet import substitute_entites from calibre.ebooks.metadata import author_to_author_sort from calibre.ebooks.oeb.polish.pretty import pretty_opf, pretty_xml_tree -from calibre.library.catalogs import ( - AuthorSortMismatchException, EmptyCatalogException, - InvalidGenresSourceFieldException, -) +from calibre.library.catalogs import AuthorSortMismatchException, EmptyCatalogException, InvalidGenresSourceFieldException from calibre.library.comments import comments_to_html from calibre.ptempfile import PersistentTemporaryDirectory -from calibre.utils.date import ( - as_local_time, format_date, is_date_undefined, now as nowf, utcfromtimestamp, -) +from calibre.utils.date import as_local_time, format_date, is_date_undefined, utcfromtimestamp +from calibre.utils.date import now as nowf from calibre.utils.filenames import ascii_text, shorten_components_to from calibre.utils.formatter import TemplateFormatter -from calibre.utils.icu import ( - capitalize, collation_order, sort_key, title_case as icu_title, upper as icu_upper, -) +from calibre.utils.icu import capitalize, collation_order, sort_key +from calibre.utils.icu import title_case as icu_title +from calibre.utils.icu import upper as icu_upper from calibre.utils.localization import _, get_lang, lang_as_iso639_1, ngettext -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.zipfile import ZipFile from polyglot.builtins import iteritems diff --git a/src/calibre/library/check_library.py b/src/calibre/library/check_library.py index cc94864249..90b80d3ac0 100644 --- a/src/calibre/library/check_library.py +++ b/src/calibre/library/check_library.py @@ -12,9 +12,7 @@ import traceback from calibre import isbytestring from calibre.constants import filesystem_encoding -from calibre.db.constants import ( - COVER_FILE_NAME, DATA_DIR_NAME, METADATA_FILE_NAME, TRASH_DIR_NAME, NOTES_DIR_NAME, -) +from calibre.db.constants import COVER_FILE_NAME, DATA_DIR_NAME, METADATA_FILE_NAME, NOTES_DIR_NAME, TRASH_DIR_NAME from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.localization import _ from polyglot.builtins import iteritems diff --git a/src/calibre/library/comments.py b/src/calibre/library/comments.py index 21320e28cc..ba4e8a581e 100644 --- a/src/calibre/library/comments.py +++ b/src/calibre/library/comments.py @@ -6,10 +6,7 @@ import re from calibre import prepare_string_for_xml from calibre.constants import preferred_encoding -from calibre.ebooks.BeautifulSoup import ( - BeautifulSoup, CData, Comment, Declaration, NavigableString, - ProcessingInstruction -) +from calibre.ebooks.BeautifulSoup import BeautifulSoup, CData, Comment, Declaration, NavigableString, ProcessingInstruction from calibre.utils.html2text import html2text # Hackish - ignoring sentences ending or beginning in numbers to avoid diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 79cb6aaf75..ef8d4d1c2a 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -26,20 +26,13 @@ from collections import defaultdict, namedtuple from calibre import force_unicode, isbytestring, prints from calibre.constants import filesystem_encoding, iswindows, preferred_encoding from calibre.customize.ui import run_plugins_on_import, run_plugins_on_postimport -from calibre.db import ( - _get_next_series_num_for_list, _get_series_values, get_data_as_dict, -) -from calibre.db.adding import ( - find_books_in_directory, import_book_directory, import_book_directory_multiple, - recursive_import, -) +from calibre.db import _get_next_series_num_for_list, _get_series_values, get_data_as_dict +from calibre.db.adding import find_books_in_directory, import_book_directory, import_book_directory_multiple, recursive_import from calibre.db.categories import CATEGORY_SORTS, Tag from calibre.db.errors import NoSuchFormat from calibre.db.lazy import FormatMetadata, FormatsList from calibre.ebooks import check_ebook_format -from calibre.ebooks.metadata import ( - author_to_author_sort, get_title_sort_pat, string_to_authors, title_sort, -) +from calibre.ebooks.metadata import author_to_author_sort, get_title_sort_pat, string_to_authors, title_sort from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.opf2 import metadata_to_opf from calibre.library.caches import ResultCache @@ -51,14 +44,12 @@ from calibre.library.schema_upgrades import SchemaUpgrade from calibre.library.sqlite import IntegrityError, connect from calibre.ptempfile import PersistentTemporaryFile, SpooledTemporaryFile, base_dir from calibre.utils.config import from_json, prefs, to_json, tweaks -from calibre.utils.date import ( - UNDEFINED_DATE, now as nowf, parse_date, parse_only_date, utcfromtimestamp, utcnow, -) -from calibre.utils.filenames import ( - WindowsAtomicFolderMove, ascii_filename, hardlink_file, samefile, -) +from calibre.utils.date import UNDEFINED_DATE, parse_date, parse_only_date, utcfromtimestamp, utcnow +from calibre.utils.date import now as nowf +from calibre.utils.filenames import WindowsAtomicFolderMove, ascii_filename, hardlink_file, samefile from calibre.utils.formatter_functions import load_user_template_functions -from calibre.utils.icu import lower, lower as icu_lower, sort_key, strcmp +from calibre.utils.icu import lower, sort_key, strcmp +from calibre.utils.icu import lower as icu_lower from calibre.utils.img import save_cover_data_to from calibre.utils.localization import _, calibre_langcode_to_name, canonicalize_lang from calibre.utils.recycle_bin import delete_file, delete_tree diff --git a/src/calibre/library/prefs.py b/src/calibre/library/prefs.py index a28da7df55..08f6b9daa8 100644 --- a/src/calibre/library/prefs.py +++ b/src/calibre/library/prefs.py @@ -5,11 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import json, os +import json +import os -from calibre.constants import preferred_encoding -from calibre.utils.config import to_json, from_json from calibre import prints +from calibre.constants import preferred_encoding +from calibre.utils.config import from_json, to_json from polyglot.builtins import iteritems diff --git a/src/calibre/library/save_to_disk.py b/src/calibre/library/save_to_disk.py index b0a4785a80..9485189666 100644 --- a/src/calibre/library/save_to_disk.py +++ b/src/calibre/library/save_to_disk.py @@ -16,9 +16,7 @@ from calibre.db.lazy import FormatsList from calibre.ebooks.metadata import fmt_sidx, title_sort from calibre.utils.config import Config, StringConfig, tweaks from calibre.utils.date import as_local_time, is_date_undefined -from calibre.utils.filenames import ( - ascii_filename, make_long_path_useable, shorten_components_to, -) +from calibre.utils.filenames import ascii_filename, make_long_path_useable, shorten_components_to from calibre.utils.formatter import TemplateFormatter from calibre.utils.formatter_functions import load_user_template_functions from calibre.utils.localization import _ diff --git a/src/calibre/library/schema_upgrades.py b/src/calibre/library/schema_upgrades.py index d4db2275ba..58619f87f0 100644 --- a/src/calibre/library/schema_upgrades.py +++ b/src/calibre/library/schema_upgrades.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import os -from calibre.utils.date import isoformat, DEFAULT_DATE +from calibre.utils.date import DEFAULT_DATE, isoformat from polyglot.builtins import itervalues @@ -585,8 +585,7 @@ class SchemaUpgrade: def upgrade_version_19(self): recipes = self.conn.get('SELECT id,title,script FROM feeds') if recipes: - from calibre.web.feeds.recipes import custom_recipes, \ - custom_recipe_filename + from calibre.web.feeds.recipes import custom_recipe_filename, custom_recipes bdir = os.path.dirname(custom_recipes.file_path) for id_, title, script in recipes: existing = frozenset(map(int, custom_recipes)) diff --git a/src/calibre/library/sqlite.py b/src/calibre/library/sqlite.py index e6201a2b1b..8b195860e8 100644 --- a/src/calibre/library/sqlite.py +++ b/src/calibre/library/sqlite.py @@ -7,25 +7,26 @@ Wrapper for multi-threaded access to a single sqlite database connection. Serial all calls. ''' -import sqlite3 as sqlite, traceback, time, uuid, os -from sqlite3 import IntegrityError, OperationalError -from threading import Thread -from threading import RLock +import os +import sqlite3 as sqlite +import time +import traceback +import uuid from datetime import datetime, timezone from functools import partial +from sqlite3 import IntegrityError, OperationalError +from threading import RLock, Thread -from calibre.ebooks.metadata import title_sort, author_to_author_sort -from calibre.utils.date import parse_date, isoformat, local_tz, UNDEFINED_DATE -from calibre import isbytestring, force_unicode -from calibre.constants import iswindows, DEBUG, plugins_loc, plugins +from calibre import force_unicode, isbytestring, prints +from calibre.constants import DEBUG, iswindows, plugins, plugins_loc +from calibre.ebooks.metadata import author_to_author_sort, title_sort +from calibre.utils.date import UNDEFINED_DATE, isoformat, local_tz, parse_date from calibre.utils.icu import sort_key from calibre_extensions import speedup as _c_speedup -from calibre import prints -from polyglot.builtins import cmp, native_string_type from polyglot import reprlib +from polyglot.builtins import cmp, native_string_type from polyglot.queue import Queue - global_lock = RLock() diff --git a/src/calibre/libunzip.py b/src/calibre/libunzip.py index 06124619ac..0138826a21 100644 --- a/src/calibre/libunzip.py +++ b/src/calibre/libunzip.py @@ -5,6 +5,7 @@ __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' import re + from calibre.utils import zipfile from calibre.utils.icu import numeric_sort_key diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 2a2b9e2e83..719420b4b5 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -16,7 +16,8 @@ from calibre.constants import isbsd, islinux from calibre.customize.ui import all_input_formats from calibre.ptempfile import TemporaryDirectory from calibre.utils.localization import _ -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems entry_points = { @@ -576,12 +577,12 @@ def write_completion(self, bash_comp_dest, zsh): from calibre.debug import option_parser as debug_op from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks.lrf.lrfparser import option_parser as lrf2lrsop - from calibre.ebooks.metadata.cli import ( - filetypes as meta_filetypes, option_parser as metaop, - ) + from calibre.ebooks.metadata.cli import filetypes as meta_filetypes + from calibre.ebooks.metadata.cli import option_parser as metaop from calibre.ebooks.metadata.sources.cli import option_parser as fem_op from calibre.ebooks.oeb.polish.import_book import IMPORTABLE - from calibre.ebooks.oeb.polish.main import SUPPORTED, option_parser as polish_op + from calibre.ebooks.oeb.polish.main import SUPPORTED + from calibre.ebooks.oeb.polish.main import option_parser as polish_op from calibre.gui2.lrf_renderer.main import option_parser as lrfviewerop from calibre.gui2.main import option_parser as guiop from calibre.gui2.tweak_book.main import option_parser as tweak_op @@ -1215,6 +1216,7 @@ def changelog_bullet_to_text(bullet): def make_appdata_releases(): import json + from lxml.builder import E changelog = json.loads(P('changelog.json', data=True)) diff --git a/src/calibre/live.py b/src/calibre/live.py index a1e9245326..ea6680dcab 100644 --- a/src/calibre/live.py +++ b/src/calibre/live.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2020, Kovid Goyal -import apsw import ast import gzip import os @@ -16,6 +15,8 @@ from importlib import import_module from queue import Queue from threading import Lock, Thread +import apsw + from calibre.constants import cache_dir, numeric_version from calibre.utils.date import utcnow from calibre.utils.https import HTTPError, get_https_resource_securely @@ -254,9 +255,9 @@ def load_module(full_name, strategy=Strategy.download_now, timeout=default_timeo def find_tests(): + import hashlib import tempfile import unittest - import hashlib class LiveTest(unittest.TestCase): ae = unittest.TestCase.assertEqual diff --git a/src/calibre/ptempfile.py b/src/calibre/ptempfile.py index c0588dbb64..3fb5f87783 100644 --- a/src/calibre/ptempfile.py +++ b/src/calibre/ptempfile.py @@ -4,10 +4,11 @@ __copyright__ = '2008, Kovid Goyal ' Provides platform independent temporary files that persist even after being closed. """ -import tempfile, os, atexit +import atexit +import os +import tempfile -from calibre.constants import (__version__, __appname__, filesystem_encoding, - iswindows, get_windows_temp_path, ismacos) +from calibre.constants import __appname__, __version__, filesystem_encoding, get_windows_temp_path, ismacos, iswindows def cleanup(path): diff --git a/src/calibre/rpdb.py b/src/calibre/rpdb.py index 621ff45549..f904c32e51 100644 --- a/src/calibre/rpdb.py +++ b/src/calibre/rpdb.py @@ -4,7 +4,14 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import pdb, socket, inspect, sys, select, os, atexit, time +import atexit +import inspect +import os +import pdb +import select +import socket +import sys +import time from contextlib import suppress from calibre.constants import cache_dir diff --git a/src/calibre/scraper/simple.py b/src/calibre/scraper/simple.py index bef2a36d36..a150d5c26a 100644 --- a/src/calibre/scraper/simple.py +++ b/src/calibre/scraper/simple.py @@ -139,6 +139,7 @@ def read_url(storage, url, timeout=60): def find_tests(): import re import unittest + from lxml.html import fromstring, tostring skip = '' is_sanitized = 'libasan' in os.environ.get('LD_PRELOAD', '') diff --git a/src/calibre/scraper/simple_backend.py b/src/calibre/scraper/simple_backend.py index 1338f922bb..46570d78be 100644 --- a/src/calibre/scraper/simple_backend.py +++ b/src/calibre/scraper/simple_backend.py @@ -6,6 +6,7 @@ import secrets import sys import time from functools import lru_cache + from qt.core import QApplication, QEventLoop, QUrl from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineSettings diff --git a/src/calibre/spell/dictionary.py b/src/calibre/spell/dictionary.py index 434d877d6a..7e1ecad0c4 100644 --- a/src/calibre/spell/dictionary.py +++ b/src/calibre/spell/dictionary.py @@ -3,11 +3,11 @@ import glob +import json import os import re import shutil import sys -import json from collections import defaultdict, namedtuple from functools import partial from itertools import chain diff --git a/src/calibre/spell/import_from.py b/src/calibre/spell/import_from.py index ff425461a2..ef6fd54895 100644 --- a/src/calibre/spell/import_from.py +++ b/src/calibre/spell/import_from.py @@ -4,15 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import sys, glob, os, tempfile, re, codecs +import codecs +import glob +import os +import re +import sys +import tempfile from lxml import etree from calibre import browser from calibre.constants import config_dir +from calibre.utils.resources import get_path as P from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.zipfile import ZipFile -from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems NS_MAP = { diff --git a/src/calibre/srv/ajax.py b/src/calibre/srv/ajax.py index 6fa95acab4..24c4049c27 100644 --- a/src/calibre/srv/ajax.py +++ b/src/calibre/srv/ajax.py @@ -12,12 +12,11 @@ from calibre.db.view import sanitize_sort_field_name from calibre.ebooks.metadata import title_sort from calibre.ebooks.metadata.book.json_codec import JsonCodec from calibre.library.field_metadata import category_icon_map -from calibre.srv.content import get as get_content, icon as get_icon +from calibre.srv.content import get as get_content +from calibre.srv.content import icon as get_icon from calibre.srv.errors import BookNotFound, HTTPNotFound from calibre.srv.routes import endpoint, json -from calibre.srv.utils import ( - custom_fields_to_display, decode_name, encode_name, get_db, http_date, -) +from calibre.srv.utils import custom_fields_to_display, decode_name, encode_name, get_db, http_date from calibre.utils.config import prefs, tweaks from calibre.utils.date import isoformat, timestampfromdt from calibre.utils.icu import numeric_sort_key as sort_key diff --git a/src/calibre/srv/auth.py b/src/calibre/srv/auth.py index 8396316937..34b89b56d9 100644 --- a/src/calibre/srv/auth.py +++ b/src/calibre/srv/auth.py @@ -4,18 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, random, struct +import os +import random +import struct from collections import OrderedDict from hashlib import md5, sha256 from itertools import permutations from threading import Lock -from calibre.srv.errors import HTTPAuthRequired, HTTPSimpleResponse, HTTPForbidden +from calibre.srv.errors import HTTPAuthRequired, HTTPForbidden, HTTPSimpleResponse from calibre.srv.http_request import parse_uri -from calibre.srv.utils import parse_http_dict, encode_path +from calibre.srv.utils import encode_path, parse_http_dict from calibre.utils.monotonic import monotonic from polyglot import http_client -from polyglot.binary import from_base64_unicode, from_hex_bytes, as_hex_unicode +from polyglot.binary import as_hex_unicode, from_base64_unicode, from_hex_bytes MAX_AGE_SECONDS = 3600 nonce_counter, nonce_counter_lock = 0, Lock() diff --git a/src/calibre/srv/code.py b/src/calibre/srv/code.py index 70435e64db..9e75063dcd 100644 --- a/src/calibre/srv/code.py +++ b/src/calibre/srv/code.py @@ -7,7 +7,8 @@ import random import shutil import sys import zipfile -from json import load as load_json_file, loads as json_loads +from json import load as load_json_file +from json import loads as json_loads from threading import Lock from calibre import as_unicode @@ -15,20 +16,14 @@ from calibre.constants import in_develop_mode from calibre.customize.ui import available_input_formats from calibre.db.view import sanitize_sort_field_name from calibre.srv.ajax import search_result -from calibre.srv.errors import ( - BookNotFound, HTTPBadRequest, HTTPForbidden, HTTPNotFound, HTTPRedirect, -) +from calibre.srv.errors import BookNotFound, HTTPBadRequest, HTTPForbidden, HTTPNotFound, HTTPRedirect from calibre.srv.last_read import last_read_cache -from calibre.srv.metadata import ( - book_as_json, categories_as_json, categories_settings, icon_map, -) +from calibre.srv.metadata import book_as_json, categories_as_json, categories_settings, icon_map from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_library_data, get_use_roman from calibre.utils.config import prefs, tweaks from calibre.utils.icu import numeric_sort_key, sort_key -from calibre.utils.localization import ( - _, get_lang, lang_code_for_user_manual, lang_map_for_ui, localize_website_link, -) +from calibre.utils.localization import _, get_lang, lang_code_for_user_manual, lang_map_for_ui, localize_website_link from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException from calibre.utils.serialize import json_dumps diff --git a/src/calibre/srv/content.py b/src/calibre/srv/content.py index 77346c9879..f1c723e65a 100644 --- a/src/calibre/srv/content.py +++ b/src/calibre/srv/content.py @@ -18,9 +18,7 @@ from calibre import fit_image, guess_type, sanitize_file_name from calibre.constants import config_dir, iswindows from calibre.db.constants import RESOURCE_URL_SCHEME from calibre.db.errors import NoSuchFormat -from calibre.ebooks.covers import ( - cprefs, generate_cover, override_prefs, scale_cover, set_use_roman, -) +from calibre.ebooks.covers import cprefs, generate_cover, override_prefs, scale_cover, set_use_roman from calibre.ebooks.metadata import authors_to_string from calibre.ebooks.metadata.meta import set_metadata from calibre.ebooks.metadata.opf2 import metadata_to_opf @@ -30,12 +28,11 @@ from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_db, get_use_roman, http_date from calibre.utils.config_base import tweaks from calibre.utils.date import timestampfromdt -from calibre.utils.filenames import ( - ascii_filename, atomic_rename, make_long_path_useable, -) +from calibre.utils.filenames import ascii_filename, atomic_rename, make_long_path_useable from calibre.utils.img import image_from_data, scale_image from calibre.utils.localization import _ -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from calibre.utils.shared_file import share_open from polyglot.binary import as_hex_unicode from polyglot.urllib import quote diff --git a/src/calibre/srv/convert.py b/src/calibre/srv/convert.py index 7741913d9b..5fed175b28 100644 --- a/src/calibre/srv/convert.py +++ b/src/calibre/srv/convert.py @@ -205,10 +205,7 @@ def conversion_status(ctx, rd, job_id): def get_conversion_options(input_fmt, output_fmt, book_id, db): from calibre.customize.conversion import OptionRecommendation - from calibre.ebooks.conversion.config import ( - OPTIONS, load_defaults, load_specifics, options_for_input_fmt, - options_for_output_fmt, - ) + from calibre.ebooks.conversion.config import OPTIONS, load_defaults, load_specifics, options_for_input_fmt, options_for_output_fmt from calibre.ebooks.conversion.plumber import create_dummy_plumber plumber = create_dummy_plumber(input_fmt, output_fmt) specifics = load_specifics(db, book_id) @@ -268,9 +265,7 @@ def profiles(): @endpoint('/conversion/book-data/{book_id}', postprocess=json, types={'book_id': int}) def conversion_data(ctx, rd, book_id): - from calibre.ebooks.conversion.config import ( - NoSupportedInputFormats, get_input_format_for_book, get_sorted_output_formats, - ) + from calibre.ebooks.conversion.config import NoSupportedInputFormats, get_input_format_for_book, get_sorted_output_formats db = get_library_data(ctx, rd)[0] if not ctx.has_id(rd, db, book_id): raise BookNotFound(book_id, db) diff --git a/src/calibre/srv/fts.py b/src/calibre/srv/fts.py index 1c14dd445c..cc4cae42fa 100644 --- a/src/calibre/srv/fts.py +++ b/src/calibre/srv/fts.py @@ -4,9 +4,7 @@ import re from calibre.ebooks.metadata import authors_to_string -from calibre.srv.errors import ( - HTTPBadRequest, HTTPPreconditionRequired, HTTPUnprocessableEntity, -) +from calibre.srv.errors import HTTPBadRequest, HTTPPreconditionRequired, HTTPUnprocessableEntity from calibre.srv.routes import endpoint, json from calibre.srv.utils import get_library_data diff --git a/src/calibre/srv/http_request.py b/src/calibre/srv/http_request.py index 8f7320f3c3..29ef335f97 100644 --- a/src/calibre/srv/http_request.py +++ b/src/calibre/srv/http_request.py @@ -5,16 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import re -from io import BytesIO, DEFAULT_BUFFER_SIZE +from io import DEFAULT_BUFFER_SIZE, BytesIO from calibre import as_unicode, force_unicode from calibre.ptempfile import SpooledTemporaryFile from calibre.srv.errors import HTTPSimpleResponse -from calibre.srv.loop import Connection, READ, WRITE -from calibre.srv.utils import MultiDict, HTTP1, HTTP11, Accumulator +from calibre.srv.loop import READ, WRITE, Connection +from calibre.srv.utils import HTTP1, HTTP11, Accumulator, MultiDict from polyglot import http_client, reprlib -from polyglot.urllib import unquote from polyglot.builtins import error_message +from polyglot.urllib import unquote protocol_map = {(1, 0):HTTP1, (1, 1):HTTP11} quoted_slash = re.compile(br'%2[fF]') diff --git a/src/calibre/srv/http_response.py b/src/calibre/srv/http_response.py index d8cbf1a4e4..e151c82999 100644 --- a/src/calibre/srv/http_response.py +++ b/src/calibre/srv/http_response.py @@ -21,16 +21,11 @@ from calibre.constants import __version__ from calibre.srv.errors import HTTPSimpleResponse from calibre.srv.http_request import HTTPRequest, read_headers from calibre.srv.loop import WRITE -from calibre.srv.utils import ( - HTTP1, HTTP11, Cookie, MultiDict, get_translator_for_lang, - http_date, socket_errors_socket_closed, sort_q_values -) +from calibre.srv.utils import HTTP1, HTTP11, Cookie, MultiDict, get_translator_for_lang, http_date, socket_errors_socket_closed, sort_q_values from calibre.utils.monotonic import monotonic from calibre.utils.speedups import ReadOnlyFileBuffer from polyglot import http_client, reprlib -from polyglot.builtins import ( - error_message, iteritems, itervalues, reraise, string_or_bytes -) +from polyglot.builtins import error_message, iteritems, itervalues, reraise, string_or_bytes Range = namedtuple('Range', 'start stop size') MULTIPART_SEPARATOR = uuid.uuid4().hex diff --git a/src/calibre/srv/jobs.py b/src/calibre/srv/jobs.py index 79f1cab431..29f6416615 100644 --- a/src/calibre/srv/jobs.py +++ b/src/calibre/srv/jobs.py @@ -2,17 +2,18 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import os, time -from itertools import count -from collections import namedtuple, deque +import os +import time +from collections import deque, namedtuple from functools import partial -from threading import RLock, Thread, Event +from itertools import count +from threading import Event, RLock, Thread from calibre import detect_ncpus, force_unicode +from calibre.utils.ipc.simple_worker import WorkerError, fork_job from calibre.utils.monotonic import monotonic -from calibre.utils.ipc.simple_worker import fork_job, WorkerError -from polyglot.queue import Queue, Empty from polyglot.builtins import iteritems, itervalues +from polyglot.queue import Empty, Queue StartEvent = namedtuple('StartEvent', 'job_id name module function args kwargs callback data') DoneEvent = namedtuple('DoneEvent', 'job_id') diff --git a/src/calibre/srv/last_read.py b/src/calibre/srv/last_read.py index 7215c39fee..f6fc609ebe 100644 --- a/src/calibre/srv/last_read.py +++ b/src/calibre/srv/last_read.py @@ -1,12 +1,13 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2022, Kovid Goyal -import apsw import os from contextlib import suppress from threading import Lock from time import time_ns +import apsw + from calibre.constants import cache_dir creation_sql = ''' diff --git a/src/calibre/srv/legacy.py b/src/calibre/srv/legacy.py index fa54504587..d05fb696a5 100644 --- a/src/calibre/srv/legacy.py +++ b/src/calibre/srv/legacy.py @@ -3,6 +3,7 @@ from functools import partial + from lxml.html import tostring from lxml.html.builder import E as E_ diff --git a/src/calibre/srv/loop.py b/src/calibre/srv/loop.py index 531fc53602..d6b47a2325 100644 --- a/src/calibre/srv/loop.py +++ b/src/calibre/srv/loop.py @@ -23,8 +23,14 @@ from calibre.srv.jobs import JobsManager from calibre.srv.opts import Options from calibre.srv.pool import PluginPool, ThreadPool from calibre.srv.utils import ( - DESIRED_SEND_BUFFER_SIZE, HandleInterrupt, create_sock_pair, socket_errors_eintr, - socket_errors_nonblocking, socket_errors_socket_closed, start_cork, stop_cork, + DESIRED_SEND_BUFFER_SIZE, + HandleInterrupt, + create_sock_pair, + socket_errors_eintr, + socket_errors_nonblocking, + socket_errors_socket_closed, + start_cork, + stop_cork, ) from calibre.utils.localization import _ from calibre.utils.logging import ThreadSafeLog diff --git a/src/calibre/srv/metadata.py b/src/calibre/srv/metadata.py index d600b909e5..7a4d74defa 100644 --- a/src/calibre/srv/metadata.py +++ b/src/calibre/srv/metadata.py @@ -18,7 +18,8 @@ from calibre.utils.config import tweaks from calibre.utils.date import UNDEFINED_DATE, isoformat, local_tz from calibre.utils.file_type_icons import EXT_MAP from calibre.utils.formatter import EvalFormatter -from calibre.utils.icu import collation_order_for_partitioning, upper as icu_upper +from calibre.utils.icu import collation_order_for_partitioning +from calibre.utils.icu import upper as icu_upper from calibre.utils.localization import _, calibre_langcode_to_name from polyglot.builtins import iteritems, itervalues from polyglot.urllib import quote diff --git a/src/calibre/srv/opds.py b/src/calibre/srv/opds.py index 0dd6ab8eb3..93ec02c297 100644 --- a/src/calibre/srv/opds.py +++ b/src/calibre/srv/opds.py @@ -8,11 +8,13 @@ __docformat__ = 'restructuredtext en' import hashlib from collections import OrderedDict, namedtuple from functools import partial + from html5_parser import parse from lxml import etree from lxml.builder import ElementMaker -from calibre import force_unicode, guess_type, prepare_string_for_xml as xml +from calibre import force_unicode, guess_type +from calibre import prepare_string_for_xml as xml from calibre.constants import __appname__ from calibre.db.view import sanitize_sort_field_name from calibre.ebooks.metadata import authors_to_string, fmt_sidx, rating_to_stars diff --git a/src/calibre/srv/pool.py b/src/calibre/srv/pool.py index 72fc3ac34d..e1caa505c7 100644 --- a/src/calibre/srv/pool.py +++ b/src/calibre/srv/pool.py @@ -8,7 +8,7 @@ import sys from threading import Thread from calibre.utils.monotonic import monotonic -from polyglot.queue import Queue, Full +from polyglot.queue import Full, Queue class Worker(Thread): diff --git a/src/calibre/srv/pre_activated.py b/src/calibre/srv/pre_activated.py index ff34f2cee3..db8eb657b3 100644 --- a/src/calibre/srv/pre_activated.py +++ b/src/calibre/srv/pre_activated.py @@ -6,7 +6,9 @@ __copyright__ = '2015, Kovid Goyal ' # Support server pre-activation, such as with systemd's socket activation -import socket, errno +import errno +import socket + from calibre.constants import islinux diff --git a/src/calibre/srv/render_book.py b/src/calibre/srv/render_book.py index 6a2e97c8ab..bce7fb7ac4 100644 --- a/src/calibre/srv/render_book.py +++ b/src/calibre/srv/render_book.py @@ -11,21 +11,18 @@ from collections import defaultdict from datetime import datetime from functools import partial from itertools import count -from lxml.etree import Comment from math import ceil +from lxml.etree import Comment + from calibre import detect_ncpus, force_unicode, prepare_string_for_xml from calibre.constants import iswindows from calibre.customize.ui import plugin_for_input_format -from calibre.ebooks.oeb.base import ( - EPUB, OEB_DOCS, OEB_STYLES, OPF, SMIL, XHTML, XHTML_NS, XLINK, XPath as _XPath, - rewrite_links, urlunquote, -) +from calibre.ebooks.oeb.base import EPUB, OEB_DOCS, OEB_STYLES, OPF, SMIL, XHTML, XHTML_NS, XLINK, rewrite_links, urlunquote +from calibre.ebooks.oeb.base import XPath as _XPath from calibre.ebooks.oeb.iterator.book import extract_book from calibre.ebooks.oeb.polish.container import Container as ContainerBase -from calibre.ebooks.oeb.polish.cover import ( - find_cover_image, find_cover_image_in_page, find_cover_page, -) +from calibre.ebooks.oeb.polish.cover import find_cover_image, find_cover_image_in_page, find_cover_page from calibre.ebooks.oeb.polish.toc import from_xpaths, get_landmarks, get_toc from calibre.ebooks.oeb.polish.utils import guess_type from calibre.ptempfile import PersistentTemporaryDirectory @@ -39,10 +36,9 @@ from calibre.utils.serialize import json_dumps, json_loads, msgpack_dumps, msgpa from calibre.utils.short_uuid import uuid4 from calibre_extensions import speedup from calibre_extensions.fast_css_transform import transform_properties -from polyglot.binary import ( - as_base64_unicode as encode_component, from_base64_bytes, - from_base64_unicode as decode_component, -) +from polyglot.binary import as_base64_unicode as encode_component +from polyglot.binary import from_base64_bytes +from polyglot.binary import from_base64_unicode as decode_component from polyglot.builtins import as_bytes, iteritems from polyglot.urllib import quote, urlparse diff --git a/src/calibre/srv/routes.py b/src/calibre/srv/routes.py index 7c39a523fe..c07d37b9bf 100644 --- a/src/calibre/srv/routes.py +++ b/src/calibre/srv/routes.py @@ -4,14 +4,20 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import sys, inspect, re, time, numbers, json as jsonlib, textwrap +import inspect +import json as jsonlib +import numbers +import re +import sys +import textwrap +import time from operator import attrgetter -from calibre.srv.errors import HTTPSimpleResponse, HTTPNotFound, RouteError +from calibre.srv.errors import HTTPNotFound, HTTPSimpleResponse, RouteError from calibre.srv.utils import http_date -from calibre.utils.serialize import msgpack_dumps, json_dumps, MSGPACK_MIME -from polyglot.builtins import iteritems, itervalues +from calibre.utils.serialize import MSGPACK_MIME, json_dumps, msgpack_dumps from polyglot import http_client +from polyglot.builtins import iteritems, itervalues from polyglot.urllib import quote as urlquote default_methods = frozenset(('HEAD', 'GET')) diff --git a/src/calibre/srv/tests/auth.py b/src/calibre/srv/tests/auth.py index 94fd56b8e4..09d8fa8714 100644 --- a/src/calibre/srv/tests/auth.py +++ b/src/calibre/srv/tests/auth.py @@ -4,19 +4,21 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import subprocess, os, time, shutil +import os +import shutil +import subprocess +import time from collections import namedtuple from calibre.ptempfile import TemporaryDirectory from calibre.srv.errors import HTTPForbidden +from calibre.srv.routes import Router, endpoint from calibre.srv.tests.base import BaseTest, TestServer -from calibre.srv.routes import endpoint, Router -from polyglot.builtins import iteritems, itervalues from polyglot import http_client -from polyglot.http_cookie import CookieJar -from polyglot.urllib import (build_opener, HTTPBasicAuthHandler, - HTTPCookieProcessor, HTTPDigestAuthHandler, HTTPError) from polyglot.binary import as_base64_bytes +from polyglot.builtins import iteritems, itervalues +from polyglot.http_cookie import CookieJar +from polyglot.urllib import HTTPBasicAuthHandler, HTTPCookieProcessor, HTTPDigestAuthHandler, HTTPError, build_opener REALM = 'calibre-test' @@ -121,9 +123,9 @@ class TestAuth(BaseTest): # }}} def test_library_restrictions(self): # {{{ - from calibre.srv.opts import Options - from calibre.srv.handler import Handler from calibre.db.legacy import create_backend + from calibre.srv.handler import Handler + from calibre.srv.opts import Options opts = Options(userdb=':memory:') Data = namedtuple('Data', 'username') with TemporaryDirectory() as base: diff --git a/src/calibre/srv/tests/base.py b/src/calibre/srv/tests/base.py index cf2ce9cd04..fc9fa2edd8 100644 --- a/src/calibre/srv/tests/base.py +++ b/src/calibre/srv/tests/base.py @@ -17,7 +17,8 @@ from io import BytesIO from threading import Thread from calibre.srv.utils import ServerLog -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from polyglot import http_client rmtree = partial(shutil.rmtree, ignore_errors=True) diff --git a/src/calibre/srv/tests/content.py b/src/calibre/srv/tests/content.py index da8c183bff..a045a34009 100644 --- a/src/calibre/srv/tests/content.py +++ b/src/calibre/srv/tests/content.py @@ -14,7 +14,8 @@ from calibre.ebooks.metadata.epub import get_metadata from calibre.ebooks.metadata.opf2 import OPF from calibre.srv.tests.base import LibraryBaseTest from calibre.utils.imghdr import identify -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from calibre.utils.shared_file import share_open from polyglot import http_client from polyglot.binary import from_hex_unicode diff --git a/src/calibre/srv/tests/loop.py b/src/calibre/srv/tests/loop.py index a5f3bccc01..7e4ea0e857 100644 --- a/src/calibre/srv/tests/loop.py +++ b/src/calibre/srv/tests/loop.py @@ -4,18 +4,22 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import ssl, os, socket, time +import os +import socket +import ssl +import time from collections import namedtuple -from unittest import skipIf from glob import glob from threading import Event +from unittest import skipIf +from calibre.ptempfile import TemporaryDirectory from calibre.srv.pre_activated import has_preactivated_support from calibre.srv.tests.base import BaseTest, TestServer -from calibre.ptempfile import TemporaryDirectory from calibre.utils.certgen import create_server_cert from calibre.utils.monotonic import monotonic from polyglot import http_client + is_ci = os.environ.get('CI', '').lower() == 'true' @@ -23,8 +27,8 @@ class LoopTest(BaseTest): def test_log_rotation(self): 'Test log rotation' - from calibre.srv.utils import RotatingLog from calibre.ptempfile import TemporaryDirectory + from calibre.srv.utils import RotatingLog with TemporaryDirectory() as tdir: fname = os.path.join(tdir, 'log') l = RotatingLog(fname, max_size=100) @@ -106,8 +110,9 @@ class LoopTest(BaseTest): @skipIf(True, 'Disabled as it is failing on the build server, need to investigate') def test_bonjour(self): 'Test advertising via BonJour' - from calibre.srv.bonjour import BonJour from zeroconf import Zeroconf + + from calibre.srv.bonjour import BonJour b = BonJour(wait_for_stop=False) with TestServer(lambda data:(data.path[0] + data.read()), plugins=(b,), shutdown_timeout=5) as server: self.assertTrue(b.started.wait(5), 'BonJour not started') @@ -143,7 +148,7 @@ class LoopTest(BaseTest): sz = min(len(mv), len(self.data)) mv[:sz] = self.data[:sz] return sz - from calibre.srv.loop import ReadBuffer, READ, WRITE + from calibre.srv.loop import READ, WRITE, ReadBuffer buf = ReadBuffer(100) def write(data): diff --git a/src/calibre/srv/tests/routes.py b/src/calibre/srv/tests/routes.py index edf1955af8..8371ca8da7 100644 --- a/src/calibre/srv/tests/routes.py +++ b/src/calibre/srv/tests/routes.py @@ -5,15 +5,16 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import os +from tempfile import TemporaryDirectory + from calibre.srv.tests.base import BaseTest from polyglot.builtins import itervalues -from tempfile import TemporaryDirectory class TestRouter(BaseTest): def test_library_id_construction(self): - from calibre.srv.library_broker import library_id_from_path, correct_case_of_last_path_component, db_matches + from calibre.srv.library_broker import correct_case_of_last_path_component, db_matches, library_id_from_path self.ae(library_id_from_path('as'), 'as') self.ae(library_id_from_path('as/'), 'as') self.ae(library_id_from_path('as////'), 'as') @@ -40,7 +41,7 @@ class TestRouter(BaseTest): def test_route_construction(self): ' Test route construction ' - from calibre.srv.routes import Route, endpoint, RouteError + from calibre.srv.routes import Route, RouteError, endpoint def makeroute(route, func=lambda c,d:None, **kwargs): return Route(endpoint(route, **kwargs)(func)) @@ -64,7 +65,7 @@ class TestRouter(BaseTest): def test_route_finding(self): 'Test route finding' - from calibre.srv.routes import Router, endpoint, HTTPNotFound + from calibre.srv.routes import HTTPNotFound, Router, endpoint router = Router() def find(path): diff --git a/src/calibre/srv/tests/web_sockets.py b/src/calibre/srv/tests/web_sockets.py index 56bfe9ad0e..6c31ca566c 100644 --- a/src/calibre/srv/tests/web_sockets.py +++ b/src/calibre/srv/tests/web_sockets.py @@ -2,15 +2,31 @@ # License: GPLv3 Copyright: 2015, Kovid Goyal -import socket, os, struct, errno, numbers +import errno +import numbers +import os +import socket +import struct from collections import deque, namedtuple from functools import partial from hashlib import sha1 from calibre.srv.tests.base import BaseTest, TestServer from calibre.srv.web_socket import ( - GUID_STR, BINARY, TEXT, MessageWriter, create_frame, CLOSE, NORMAL_CLOSE, - PING, PONG, PROTOCOL_ERROR, CONTINUATION, INCONSISTENT_DATA, CONTROL_CODES) + BINARY, + CLOSE, + CONTINUATION, + CONTROL_CODES, + GUID_STR, + INCONSISTENT_DATA, + NORMAL_CLOSE, + PING, + PONG, + PROTOCOL_ERROR, + TEXT, + MessageWriter, + create_frame, +) from calibre.utils.monotonic import monotonic from calibre.utils.socket_inheritance import set_socket_inherit from polyglot.binary import as_base64_unicode diff --git a/src/calibre/srv/users.py b/src/calibre/srv/users.py index 3b26d96921..3a5f00e1b1 100644 --- a/src/calibre/srv/users.py +++ b/src/calibre/srv/users.py @@ -2,13 +2,14 @@ # License: GPLv3 Copyright: 2015, Kovid Goyal -import apsw import json import os import re from functools import lru_cache from threading import RLock +import apsw + from calibre import as_unicode from calibre.constants import config_dir from calibre.utils.config import from_json, to_json diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py index b4c5ee84bb..2925e7fa30 100644 --- a/src/calibre/srv/utils.py +++ b/src/calibre/srv/utils.py @@ -4,7 +4,9 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import errno, socket, os +import errno +import os +import socket from email.utils import formatdate from operator import itemgetter @@ -12,15 +14,16 @@ from calibre import prints from calibre.constants import iswindows from calibre.srv.errors import HTTPNotFound from calibre.utils.localization import get_translator -from calibre.utils.socket_inheritance import set_socket_inherit from calibre.utils.logging import ThreadSafeLog from calibre.utils.shared_file import share_open -from polyglot.builtins import iteritems +from calibre.utils.socket_inheritance import set_socket_inherit from polyglot import reprlib +from polyglot.binary import as_hex_unicode as encode_name +from polyglot.binary import from_hex_unicode as decode_name +from polyglot.builtins import as_unicode, iteritems from polyglot.http_cookie import SimpleCookie -from polyglot.builtins import as_unicode -from polyglot.urllib import parse_qs, quote as urlquote -from polyglot.binary import as_hex_unicode as encode_name, from_hex_unicode as decode_name +from polyglot.urllib import parse_qs +from polyglot.urllib import quote as urlquote HTTP1 = 'HTTP/1.0' HTTP11 = 'HTTP/1.1' diff --git a/src/calibre/srv/web_socket.py b/src/calibre/srv/web_socket.py index aeb2172220..4ba685b290 100644 --- a/src/calibre/srv/web_socket.py +++ b/src/calibre/srv/web_socket.py @@ -5,19 +5,19 @@ import os import socket import weakref -from calibre_extensions.speedup import utf8_decode, websocket_mask as fast_mask from collections import deque from hashlib import sha1 -from struct import error as struct_error, pack, unpack_from +from struct import error as struct_error +from struct import pack, unpack_from from threading import Lock from calibre import as_unicode from calibre.srv.http_response import HTTPConnection, create_http_handler -from calibre.srv.loop import ( - RDWR, READ, WRITE, Connection, HandleInterrupt, ServerLoop -) +from calibre.srv.loop import RDWR, READ, WRITE, Connection, HandleInterrupt, ServerLoop from calibre.srv.utils import DESIRED_SEND_BUFFER_SIZE from calibre.utils.speedups import ReadOnlyFileBuffer +from calibre_extensions.speedup import utf8_decode +from calibre_extensions.speedup import websocket_mask as fast_mask from polyglot import http_client from polyglot.binary import as_base64_unicode from polyglot.queue import Empty, Queue diff --git a/src/calibre/startup.py b/src/calibre/startup.py index 32ade5037c..64474f751b 100644 --- a/src/calibre/startup.py +++ b/src/calibre/startup.py @@ -153,7 +153,9 @@ def initialize_calibre(): pass builtins.__dict__['lopen'] = open # legacy compatibility - from calibre.utils.icu import lower as icu_lower, title_case, upper as icu_upper + from calibre.utils.icu import lower as icu_lower + from calibre.utils.icu import title_case + from calibre.utils.icu import upper as icu_upper builtins.__dict__['icu_lower'] = icu_lower builtins.__dict__['icu_upper'] = icu_upper builtins.__dict__['icu_title'] = title_case diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 4d4c23a32e..53c8de0ed2 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -18,7 +18,8 @@ import time import unittest from calibre.constants import islinux, ismacos, iswindows, plugins_loc -from calibre.utils.resources import get_image_path as I, get_path as P +from calibre.utils.resources import get_image_path as I +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems is_ci = os.environ.get('CI', '').lower() == 'true' @@ -313,10 +314,7 @@ class BuildTest(unittest.TestCase): def test_qt(self): if is_sanitized: raise unittest.SkipTest('Skipping Qt build test as sanitizer is enabled') - from qt.core import ( - QApplication, QFontDatabase, QImageReader, QLoggingCategory, - QNetworkAccessManager, QSslSocket, QTimer, - ) + from qt.core import QApplication, QFontDatabase, QImageReader, QLoggingCategory, QNetworkAccessManager, QSslSocket, QTimer QLoggingCategory.setFilterRules('''qt.webenginecontext.debug=true''') from qt.webengine import QWebEnginePage @@ -407,6 +405,7 @@ class BuildTest(unittest.TestCase): from PIL import _imaging, _imagingft, _imagingmath _imaging, _imagingmath, _imagingft from io import StringIO + from PIL import features out = StringIO() features.pilinfo(out=out, supported_formats=False) diff --git a/src/calibre/translations/dynamic.py b/src/calibre/translations/dynamic.py index 5ad04e3cd0..1839c43322 100644 --- a/src/calibre/translations/dynamic.py +++ b/src/calibre/translations/dynamic.py @@ -7,9 +7,10 @@ __copyright__ = '2008, Marshall T. Vandegrift ' import io from gettext import GNUTranslations +from zipfile import ZipFile + from calibre.utils.localization import get_lc_messages_path from calibre.utils.resources import get_path -from zipfile import ZipFile __all__ = ['translate'] diff --git a/src/calibre/translations/msgfmt.py b/src/calibre/translations/msgfmt.py index 0f0571bc90..225d47ef85 100644 --- a/src/calibre/translations/msgfmt.py +++ b/src/calibre/translations/msgfmt.py @@ -26,12 +26,12 @@ Options: Display version information and exit. """ -import os -import sys +import array import ast import getopt +import os import struct -import array +import sys from email.parser import HeaderParser __version__ = "1.2" diff --git a/src/calibre/utils/__init__.py b/src/calibre/utils/__init__.py index bbca860b44..abe02a043e 100644 --- a/src/calibre/utils/__init__.py +++ b/src/calibre/utils/__init__.py @@ -10,6 +10,7 @@ Miscelleaneous utilities. ''' from time import time + from polyglot.builtins import as_bytes diff --git a/src/calibre/utils/bibtex.py b/src/calibre/utils/bibtex.py index 7784b07fd4..77c8ea573b 100644 --- a/src/calibre/utils/bibtex.py +++ b/src/calibre/utils/bibtex.py @@ -63,7 +63,8 @@ __author__ = 'sengian ' __docformat__ = 'restructuredtext en' -import re, string +import re +import string from calibre.utils.mreplace import MReplace diff --git a/src/calibre/utils/browser.py b/src/calibre/utils/browser.py index fdb109132f..d416ebbb29 100644 --- a/src/calibre/utils/browser.py +++ b/src/calibre/utils/browser.py @@ -5,7 +5,8 @@ import copy import ssl -from mechanize import Browser as B, HTTPSHandler +from mechanize import Browser as B +from mechanize import HTTPSHandler from polyglot import http_client from polyglot.http_cookie import CookieJar @@ -153,8 +154,9 @@ class Browser(B): if __name__ == '__main__': - from calibre import browser from pprint import pprint + + from calibre import browser orig = browser() clone = orig.clone_browser() pprint(orig._ua_handlers) diff --git a/src/calibre/utils/certgen.py b/src/calibre/utils/certgen.py index 55f2e4ec6a..68524a292c 100644 --- a/src/calibre/utils/certgen.py +++ b/src/calibre/utils/certgen.py @@ -5,6 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import socket + from calibre_extensions import certgen diff --git a/src/calibre/utils/complete.py b/src/calibre/utils/complete.py index 2eb9e3d96f..38387a7ade 100644 --- a/src/calibre/utils/complete.py +++ b/src/calibre/utils/complete.py @@ -11,8 +11,11 @@ BASH completion for calibre commands that are too complex for simple completion. ''' -import sys, os, shlex, glob, re - +import glob +import os +import re +import shlex +import sys prints = print diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index dc2ac2e1ba..b306b66513 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -10,13 +10,25 @@ import optparse import os from copy import deepcopy -from calibre.constants import ( - CONFIG_DIR_MODE, __appname__, __author__, config_dir, get_version, iswindows, -) +from calibre.constants import CONFIG_DIR_MODE, __appname__, __author__, config_dir, get_version, iswindows from calibre.utils.config_base import ( - Config, ConfigInterface, ConfigProxy, Option, OptionSet, OptionValues, StringConfig, - commit_data, from_json, json_dumps, json_loads, make_config_dir, plugin_dir, prefs, - read_data, to_json, tweaks, + Config, + ConfigInterface, + ConfigProxy, + Option, + OptionSet, + OptionValues, + StringConfig, + commit_data, + from_json, + json_dumps, + json_loads, + make_config_dir, + plugin_dir, + prefs, + read_data, + to_json, + tweaks, ) from calibre.utils.localization import _ from polyglot.builtins import native_string_type, string_or_bytes diff --git a/src/calibre/utils/config_base.py b/src/calibre/utils/config_base.py index 0c8b1759a3..bc06642655 100644 --- a/src/calibre/utils/config_base.py +++ b/src/calibre/utils/config_base.py @@ -13,10 +13,7 @@ from contextlib import suppress from copy import deepcopy from functools import partial -from calibre.constants import ( - CONFIG_DIR_MODE, config_dir, filesystem_encoding, get_umask, iswindows, - preferred_encoding, -) +from calibre.constants import CONFIG_DIR_MODE, config_dir, filesystem_encoding, get_umask, iswindows, preferred_encoding from calibre.utils.localization import _ from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/utils/copy_files_test.py b/src/calibre/utils/copy_files_test.py index 9d884de31e..6e26eb71cb 100644 --- a/src/calibre/utils/copy_files_test.py +++ b/src/calibre/utils/copy_files_test.py @@ -13,6 +13,7 @@ from calibre.constants import iswindows from .copy_files import copy_tree, rename_files from .filenames import nlinks_file + if iswindows: from calibre_extensions import winutil diff --git a/src/calibre/utils/date.py b/src/calibre/utils/date.py index 5d559350c0..045350002b 100644 --- a/src/calibre/utils/date.py +++ b/src/calibre/utils/date.py @@ -6,7 +6,8 @@ __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' import re -from datetime import MAXYEAR, MINYEAR, datetime, time as dtime, timedelta +from datetime import MAXYEAR, MINYEAR, datetime, timedelta +from datetime import time as dtime from functools import partial from calibre import strftime @@ -156,7 +157,7 @@ def safeyear(x): def qt_to_dt(qdate_or_qdatetime, as_utc=True): - from qt.core import Qt, QDateTime + from qt.core import QDateTime, Qt o = qdate_or_qdatetime if o is None or is_date_undefined(qdate_or_qdatetime): return UNDEFINED_DATE diff --git a/src/calibre/utils/filenames.py b/src/calibre/utils/filenames.py index b76af7913c..f047ac1dd3 100644 --- a/src/calibre/utils/filenames.py +++ b/src/calibre/utils/filenames.py @@ -11,9 +11,7 @@ from contextlib import closing, suppress from math import ceil from calibre import force_unicode, isbytestring, prints, sanitize_file_name -from calibre.constants import ( - filesystem_encoding, ismacos, iswindows, preferred_encoding, -) +from calibre.constants import filesystem_encoding, ismacos, iswindows, preferred_encoding from calibre.utils.localization import _, get_udc from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/utils/fonts/metadata.py b/src/calibre/utils/fonts/metadata.py index 8a9ce83d1c..8d072ed674 100644 --- a/src/calibre/utils/fonts/metadata.py +++ b/src/calibre/utils/fonts/metadata.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from io import BytesIO from collections import namedtuple +from io import BytesIO -from calibre.utils.fonts.utils import get_font_names_from_ttlib_names_table, get_font_characteristics +from calibre.utils.fonts.utils import get_font_characteristics, get_font_names_from_ttlib_names_table class UnsupportedFont(ValueError): @@ -24,7 +24,7 @@ FontNames = namedtuple('FontNames', class FontMetadata: def __init__(self, bytes_or_stream): - from fontTools.subset import load_font, Subsetter + from fontTools.subset import Subsetter, load_font if not hasattr(bytes_or_stream, 'read'): bytes_or_stream = BytesIO(bytes_or_stream) f = bytes_or_stream diff --git a/src/calibre/utils/fonts/scanner.py b/src/calibre/utils/fonts/scanner.py index 626e01299c..bfdc27e40d 100644 --- a/src/calibre/utils/fonts/scanner.py +++ b/src/calibre/utils/fonts/scanner.py @@ -10,11 +10,10 @@ from collections import defaultdict from threading import Thread from calibre import as_unicode, prints, walk -from calibre.constants import ( - DEBUG, config_dir, filesystem_encoding, ismacos, iswindows, isworker, -) +from calibre.constants import DEBUG, config_dir, filesystem_encoding, ismacos, iswindows, isworker from calibre.utils.fonts.metadata import FontMetadata, UnsupportedFont -from calibre.utils.icu import lower as icu_lower, sort_key +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key from calibre.utils.resources import get_path as P from polyglot.builtins import itervalues @@ -269,9 +268,7 @@ class FontScanner(Thread): :return: (family name, faces) or None, None ''' - from calibre.utils.fonts.utils import ( - get_printable_characters, panose_to_css_generic_family, supports_text, - ) + from calibre.utils.fonts.utils import get_printable_characters, panose_to_css_generic_family, supports_text if not isinstance(text, str): raise TypeError('%r is not unicode'%text) text = get_printable_characters(text) diff --git a/src/calibre/utils/fonts/sfnt/cff/table.py b/src/calibre/utils/fonts/sfnt/cff/table.py index 12b88bf33f..7a63813e6e 100644 --- a/src/calibre/utils/fonts/sfnt/cff/table.py +++ b/src/calibre/utils/fonts/sfnt/cff/table.py @@ -5,14 +5,13 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from, unpack, calcsize from functools import partial +from struct import calcsize, unpack, unpack_from from calibre.utils.fonts.sfnt import UnknownTable -from calibre.utils.fonts.sfnt.errors import UnsupportedFont, NoGlyphs -from calibre.utils.fonts.sfnt.cff.dict_data import TopDict, PrivateDict -from calibre.utils.fonts.sfnt.cff.constants import (cff_standard_strings, - STANDARD_CHARSETS) +from calibre.utils.fonts.sfnt.cff.constants import STANDARD_CHARSETS, cff_standard_strings +from calibre.utils.fonts.sfnt.cff.dict_data import PrivateDict, TopDict +from calibre.utils.fonts.sfnt.errors import NoGlyphs, UnsupportedFont from polyglot.builtins import iteritems, itervalues # Useful links diff --git a/src/calibre/utils/fonts/sfnt/cff/writer.py b/src/calibre/utils/fonts/sfnt/cff/writer.py index 6d721c729b..1060c559a1 100644 --- a/src/calibre/utils/fonts/sfnt/cff/writer.py +++ b/src/calibre/utils/fonts/sfnt/cff/writer.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import pack from collections import OrderedDict +from struct import pack from calibre.utils.fonts.sfnt.cff.constants import cff_standard_strings diff --git a/src/calibre/utils/fonts/sfnt/cmap.py b/src/calibre/utils/fonts/sfnt/cmap.py index fedb35340b..7e9f5bb6a1 100644 --- a/src/calibre/utils/fonts/sfnt/cmap.py +++ b/src/calibre/utils/fonts/sfnt/cmap.py @@ -8,12 +8,12 @@ __docformat__ = 'restructuredtext en' # Note that the code for creating a BMP table (cmap format 4) is taken with # thanks from the fonttools project (BSD licensed). -from struct import unpack_from, calcsize, pack from collections import OrderedDict +from struct import calcsize, pack, unpack_from -from calibre.utils.fonts.utils import read_bmp_prefix from calibre.utils.fonts.sfnt import UnknownTable, max_power_of_two from calibre.utils.fonts.sfnt.errors import UnsupportedFont +from calibre.utils.fonts.utils import read_bmp_prefix def split_range(start_code, end_code, cmap): # {{{ diff --git a/src/calibre/utils/fonts/sfnt/common.py b/src/calibre/utils/fonts/sfnt/common.py index 14cca787c4..8fd02a03a2 100644 --- a/src/calibre/utils/fonts/sfnt/common.py +++ b/src/calibre/utils/fonts/sfnt/common.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from, calcsize from collections import OrderedDict, namedtuple +from struct import calcsize, unpack_from from calibre.utils.fonts.sfnt.errors import UnsupportedFont from polyglot.builtins import iteritems diff --git a/src/calibre/utils/fonts/sfnt/container.py b/src/calibre/utils/fonts/sfnt/container.py index 93cf47e08a..6c29f3ba5f 100644 --- a/src/calibre/utils/fonts/sfnt/container.py +++ b/src/calibre/utils/fonts/sfnt/container.py @@ -12,9 +12,7 @@ from calibre.utils.fonts.sfnt.cmap import CmapTable from calibre.utils.fonts.sfnt.errors import UnsupportedFont from calibre.utils.fonts.sfnt.glyf import GlyfTable from calibre.utils.fonts.sfnt.gsub import GSUBTable -from calibre.utils.fonts.sfnt.head import ( - HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader, -) +from calibre.utils.fonts.sfnt.head import HeadTable, HorizontalHeader, OS2Table, PostTable, VerticalHeader from calibre.utils.fonts.sfnt.kern import KernTable from calibre.utils.fonts.sfnt.loca import LocaTable from calibre.utils.fonts.sfnt.maxp import MaxpTable diff --git a/src/calibre/utils/fonts/sfnt/glyf.py b/src/calibre/utils/fonts/sfnt/glyf.py index 139f727a18..abb648eafe 100644 --- a/src/calibre/utils/fonts/sfnt/glyf.py +++ b/src/calibre/utils/fonts/sfnt/glyf.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from from collections import OrderedDict +from struct import unpack_from from calibre.utils.fonts.sfnt import UnknownTable from polyglot.builtins import iteritems diff --git a/src/calibre/utils/fonts/sfnt/gsub.py b/src/calibre/utils/fonts/sfnt/gsub.py index 0597ec082b..e1ffc8d426 100644 --- a/src/calibre/utils/fonts/sfnt/gsub.py +++ b/src/calibre/utils/fonts/sfnt/gsub.py @@ -5,14 +5,12 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from from functools import partial +from struct import unpack_from -from calibre.utils.fonts.sfnt import UnknownTable, FixedProperty +from calibre.utils.fonts.sfnt import FixedProperty, UnknownTable +from calibre.utils.fonts.sfnt.common import ExtensionSubstitution, FeatureListTable, LookupTable, ScriptListTable, SimpleListTable, UnknownLookupSubTable from calibre.utils.fonts.sfnt.errors import UnsupportedFont -from calibre.utils.fonts.sfnt.common import (ScriptListTable, FeatureListTable, - SimpleListTable, LookupTable, ExtensionSubstitution, - UnknownLookupSubTable) from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/utils/fonts/sfnt/head.py b/src/calibre/utils/fonts/sfnt/head.py index 6c6b79c33d..a97bf47371 100644 --- a/src/calibre/utils/fonts/sfnt/head.py +++ b/src/calibre/utils/fonts/sfnt/head.py @@ -6,9 +6,9 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' import array -from struct import unpack_from, pack, calcsize +from struct import calcsize, pack, unpack_from -from calibre.utils.fonts.sfnt import UnknownTable, DateTimeProperty, FixedProperty +from calibre.utils.fonts.sfnt import DateTimeProperty, FixedProperty, UnknownTable from calibre.utils.fonts.sfnt.errors import UnsupportedFont from calibre.utils.fonts.sfnt.loca import read_array diff --git a/src/calibre/utils/fonts/sfnt/kern.py b/src/calibre/utils/fonts/sfnt/kern.py index f8d1aacf39..11e782fb98 100644 --- a/src/calibre/utils/fonts/sfnt/kern.py +++ b/src/calibre/utils/fonts/sfnt/kern.py @@ -5,10 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from, calcsize, pack, error as struct_error +from struct import calcsize, pack, unpack_from +from struct import error as struct_error -from calibre.utils.fonts.sfnt import (UnknownTable, FixedProperty, - max_power_of_two) +from calibre.utils.fonts.sfnt import FixedProperty, UnknownTable, max_power_of_two from calibre.utils.fonts.sfnt.errors import UnsupportedFont diff --git a/src/calibre/utils/fonts/sfnt/loca.py b/src/calibre/utils/fonts/sfnt/loca.py index 1cd1ef7424..1f79d8b68a 100644 --- a/src/calibre/utils/fonts/sfnt/loca.py +++ b/src/calibre/utils/fonts/sfnt/loca.py @@ -5,9 +5,10 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import array, sys -from operator import itemgetter +import array +import sys from itertools import repeat +from operator import itemgetter from calibre.utils.fonts.sfnt import UnknownTable from polyglot.builtins import iteritems diff --git a/src/calibre/utils/fonts/sfnt/maxp.py b/src/calibre/utils/fonts/sfnt/maxp.py index 0f0ef23b37..6570e7b2b2 100644 --- a/src/calibre/utils/fonts/sfnt/maxp.py +++ b/src/calibre/utils/fonts/sfnt/maxp.py @@ -5,9 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from struct import unpack_from, pack +from struct import pack, unpack_from -from calibre.utils.fonts.sfnt import UnknownTable, FixedProperty +from calibre.utils.fonts.sfnt import FixedProperty, UnknownTable from calibre.utils.fonts.sfnt.errors import UnsupportedFont diff --git a/src/calibre/utils/fonts/sfnt/metrics.py b/src/calibre/utils/fonts/sfnt/metrics.py index 7cebc3518a..5207c57480 100644 --- a/src/calibre/utils/fonts/sfnt/metrics.py +++ b/src/calibre/utils/fonts/sfnt/metrics.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from calibre.utils.fonts.utils import get_all_font_names from calibre.utils.fonts.sfnt.container import UnsupportedFont +from calibre.utils.fonts.utils import get_all_font_names class FontMetrics: @@ -113,6 +113,7 @@ class FontMetrics: if __name__ == '__main__': import sys + from calibre.utils.fonts.sfnt.container import Sfnt with open(sys.argv[-1], 'rb') as f: raw = f.read() diff --git a/src/calibre/utils/fonts/subset.py b/src/calibre/utils/fonts/subset.py index 3a9c5b5eb2..40f5076e45 100644 --- a/src/calibre/utils/fonts/subset.py +++ b/src/calibre/utils/fonts/subset.py @@ -7,7 +7,6 @@ from logging.handlers import QueueHandler from queue import Empty, SimpleQueue - def subset(input_file_object_or_path, output_file_object_or_path, container_type, chars_or_text=''): from fontTools.subset import Subsetter, load_font, log, save_font log_messages = SimpleQueue() diff --git a/src/calibre/utils/fonts/win_fonts.py b/src/calibre/utils/fonts/win_fonts.py index 3411a73ce2..ca659e492c 100644 --- a/src/calibre/utils/fonts/win_fonts.py +++ b/src/calibre/utils/fonts/win_fonts.py @@ -5,14 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, sys, atexit +import atexit +import os +import sys from itertools import product -from calibre import prints, isbytestring -from calibre.utils.resources import get_path as P +from calibre import isbytestring, prints from calibre.constants import filesystem_encoding -from calibre.utils.fonts.utils import (is_truetype_font, get_font_names, - get_font_characteristics) +from calibre.utils.fonts.utils import get_font_characteristics, get_font_names, is_truetype_font +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index ab7934cc6a..8f09febd84 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -20,9 +20,7 @@ from calibre import prints from calibre.constants import DEBUG from calibre.ebooks.metadata.book.base import field_metadata from calibre.utils.config import tweaks -from calibre.utils.formatter_functions import ( - StoredObjectType, formatter_functions, function_object_type, get_database, -) +from calibre.utils.formatter_functions import StoredObjectType, formatter_functions, function_object_type, get_database from calibre.utils.icu import strcmp from calibre.utils.localization import _ from polyglot.builtins import error_message diff --git a/src/calibre/utils/formatter_functions.py b/src/calibre/utils/formatter_functions.py index c4adfa9750..6666b01283 100644 --- a/src/calibre/utils/formatter_functions.py +++ b/src/calibre/utils/formatter_functions.py @@ -20,17 +20,19 @@ from contextlib import suppress from datetime import datetime, timedelta from enum import Enum, auto from functools import partial -from lxml import html from math import ceil, floor, modf, trunc +from lxml import html + from calibre import human_readable, prepare_string_for_xml, prints from calibre.constants import DEBUG from calibre.db.constants import DATA_DIR_NAME, DATA_FILE_PATTERN -from calibre.db.notes.exim import parse_html, expand_note_resources +from calibre.db.notes.exim import expand_note_resources, parse_html from calibre.ebooks.metadata import title_sort from calibre.utils.config import tweaks from calibre.utils.date import UNDEFINED_DATE, format_date, now, parse_date -from calibre.utils.icu import capitalize, lower as icu_lower, sort_key, strcmp +from calibre.utils.icu import capitalize, sort_key, strcmp +from calibre.utils.icu import lower as icu_lower from calibre.utils.localization import _, calibre_langcode_to_name, canonicalize_lang from calibre.utils.titlecase import titlecase from polyglot.builtins import iteritems, itervalues diff --git a/src/calibre/utils/html2text.py b/src/calibre/utils/html2text.py index 4dc0643864..65e1581a4e 100644 --- a/src/calibre/utils/html2text.py +++ b/src/calibre/utils/html2text.py @@ -6,8 +6,9 @@ from calibre.utils.localization import _ def html2text(html, single_line_break=True, default_image_alt=''): - from html2text import HTML2Text import re + + from html2text import HTML2Text if isinstance(html, bytes): from calibre.ebooks.chardet import xml_to_unicode html = xml_to_unicode(html, strip_encoding_pats=True, resolve_entities=True)[0] diff --git a/src/calibre/utils/https.py b/src/calibre/utils/https.py index 84395de07f..05878aed51 100644 --- a/src/calibre/utils/https.py +++ b/src/calibre/utils/https.py @@ -4,13 +4,16 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import ssl, socket, re +import re +import socket +import ssl from contextlib import closing from calibre import get_proxies from calibre.utils.resources import get_path as P from polyglot import http_client from polyglot.urllib import urlsplit + has_ssl_verify = hasattr(ssl, 'create_default_context') and hasattr(ssl, '_create_unverified_context') diff --git a/src/calibre/utils/hyphenation/dictionaries.py b/src/calibre/utils/hyphenation/dictionaries.py index 1d562f27ee..000f0b7825 100644 --- a/src/calibre/utils/hyphenation/dictionaries.py +++ b/src/calibre/utils/hyphenation/dictionaries.py @@ -10,9 +10,9 @@ from io import BytesIO from calibre.constants import cache_dir from calibre.ptempfile import TemporaryDirectory -from calibre.utils.resources import get_path as P from calibre.utils.localization import lang_as_iso639_1 from calibre.utils.lock import ExclusiveFile +from calibre.utils.resources import get_path as P from polyglot.builtins import iteritems from polyglot.functools import lru_cache diff --git a/src/calibre/utils/hyphenation/hyphenate.py b/src/calibre/utils/hyphenation/hyphenate.py index dd38e63897..d446b849f0 100644 --- a/src/calibre/utils/hyphenation/hyphenate.py +++ b/src/calibre/utils/hyphenation/hyphenate.py @@ -6,9 +6,7 @@ import os import regex -from calibre.utils.hyphenation.dictionaries import ( - dictionary_name_for_locale, path_to_dictionary -) +from calibre.utils.hyphenation.dictionaries import dictionary_name_for_locale, path_to_dictionary from polyglot.functools import lru_cache REGEX_FLAGS = regex.VERSION1 | regex.WORD | regex.FULLCASE | regex.UNICODE diff --git a/src/calibre/utils/hyphenation/test_hyphenation.py b/src/calibre/utils/hyphenation/test_hyphenation.py index aa915d8099..57ce503c3b 100644 --- a/src/calibre/utils/hyphenation/test_hyphenation.py +++ b/src/calibre/utils/hyphenation/test_hyphenation.py @@ -10,14 +10,8 @@ from lxml import etree from calibre.ebooks.oeb.polish.parsing import parse_html5 from calibre.ptempfile import PersistentTemporaryDirectory -from calibre.utils.hyphenation.dictionaries import ( - dictionary_name_for_locale, get_cache_path, is_cache_up_to_date, - path_to_dictionary -) -from calibre.utils.hyphenation.hyphenate import ( - add_soft_hyphens, add_soft_hyphens_to_html, add_soft_hyphens_to_words, - dictionary_for_locale -) +from calibre.utils.hyphenation.dictionaries import dictionary_name_for_locale, get_cache_path, is_cache_up_to_date, path_to_dictionary +from calibre.utils.hyphenation.hyphenate import add_soft_hyphens, add_soft_hyphens_to_html, add_soft_hyphens_to_words, dictionary_for_locale class TestHyphenation(unittest.TestCase): diff --git a/src/calibre/utils/icu.py b/src/calibre/utils/icu.py index 19ad044954..24c3450b97 100644 --- a/src/calibre/utils/icu.py +++ b/src/calibre/utils/icu.py @@ -318,8 +318,9 @@ def remove_accents_icu(txt: str) -> str: def remove_accents_regex(txt: str) -> str: pat = getattr(remove_accents_regex, 'pat', None) if pat is None: - import regex import unicodedata + + import regex pat = regex.compile(r'\p{Mn}', flags=regex.UNICODE) setattr(remove_accents_regex, 'pat', pat) setattr(remove_accents_regex, 'normalize', unicodedata.normalize) diff --git a/src/calibre/utils/icu_test.py b/src/calibre/utils/icu_test.py index f7d6377c40..e4e9a17887 100644 --- a/src/calibre/utils/icu_test.py +++ b/src/calibre/utils/icu_test.py @@ -4,11 +4,12 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import unittest, sys +import sys +import unittest from contextlib import contextmanager import calibre.utils.icu as icu -from polyglot.builtins import iteritems, cmp +from polyglot.builtins import cmp, iteritems @contextmanager @@ -201,7 +202,8 @@ class TestICU(unittest.TestCase): def test_break_iterator(self): ' Test the break iterator ' - from calibre.spell.break_iterator import split_into_words as split, index_of, split_into_words_and_positions, count_words + from calibre.spell.break_iterator import count_words, index_of, split_into_words_and_positions + from calibre.spell.break_iterator import split_into_words as split for q in ('one two three', ' one two three', 'one\ntwo three ', ): self.ae(split(str(q)), ['one', 'two', 'three'], 'Failed to split: %r' % q) self.ae(split('I I\'m'), ['I', "I'm"]) diff --git a/src/calibre/utils/img.py b/src/calibre/utils/img.py index a420700f94..d2be1251ad 100644 --- a/src/calibre/utils/img.py +++ b/src/calibre/utils/img.py @@ -10,12 +10,10 @@ import sys import tempfile from contextlib import suppress from io import BytesIO -from qt.core import ( - QBuffer, QByteArray, QColor, QImage, QImageReader, QImageWriter, QIODevice, QPixmap, - Qt, QTransform, qRgba -) from threading import Thread +from qt.core import QBuffer, QByteArray, QColor, QImage, QImageReader, QImageWriter, QIODevice, QPixmap, Qt, QTransform, qRgba + from calibre import fit_image, force_unicode from calibre.constants import iswindows from calibre.ptempfile import TemporaryDirectory @@ -110,9 +108,7 @@ def gif_data_to_png_data(data, discard_animation=False): def set_image_allocation_limit(size_in_mb=1024): with suppress(ImportError): # for people running form source - from calibre_extensions.progress_indicator import ( - set_image_allocation_limit as impl, - ) + from calibre_extensions.progress_indicator import set_image_allocation_limit as impl impl(size_in_mb) diff --git a/src/calibre/utils/imghdr.py b/src/calibre/utils/imghdr.py index e23c4f8d17..186b71c081 100644 --- a/src/calibre/utils/imghdr.py +++ b/src/calibre/utils/imghdr.py @@ -2,8 +2,9 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from struct import unpack, error import os +from struct import error, unpack + from calibre.utils.speedups import ReadOnlyFileBuffer from polyglot.builtins import string_or_bytes diff --git a/src/calibre/utils/inotify.py b/src/calibre/utils/inotify.py index 65c686c534..6941215999 100644 --- a/src/calibre/utils/inotify.py +++ b/src/calibre/utils/inotify.py @@ -4,7 +4,10 @@ __copyright__ = '2013, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os, errno, select +import errno +import os +import select +import sys class INotifyError(Exception): @@ -115,7 +118,8 @@ class INotify: NONBLOCK = 0x800 def __init__(self, cloexec=True, nonblock=True): - import ctypes, struct + import ctypes + import struct self._init1, self._add_watch, self._rm_watch, self._read = load_inotify() flags = 0 if cloexec: diff --git a/src/calibre/utils/ip_routing.py b/src/calibre/utils/ip_routing.py index 35ec8b0891..3b847bf6f7 100644 --- a/src/calibre/utils/ip_routing.py +++ b/src/calibre/utils/ip_routing.py @@ -2,8 +2,10 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import subprocess, re -from calibre.constants import iswindows, ismacos +import re +import subprocess + +from calibre.constants import ismacos, iswindows def get_address_of_default_gateway(family='AF_INET'): diff --git a/src/calibre/utils/ipc/__init__.py b/src/calibre/utils/ipc/__init__.py index 05898a1388..b3a007198f 100644 --- a/src/calibre/utils/ipc/__init__.py +++ b/src/calibre/utils/ipc/__init__.py @@ -9,9 +9,7 @@ import errno import os from calibre import force_unicode -from calibre.constants import ( - filesystem_encoding, get_windows_username, islinux, iswindows -) +from calibre.constants import filesystem_encoding, get_windows_username, islinux, iswindows from calibre.utils.filenames import ascii_filename from polyglot.functools import lru_cache diff --git a/src/calibre/utils/ipc/launch.py b/src/calibre/utils/ipc/launch.py index 533bc7eba5..12475b8c01 100644 --- a/src/calibre/utils/ipc/launch.py +++ b/src/calibre/utils/ipc/launch.py @@ -4,14 +4,17 @@ __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import subprocess, os, sys, time +import os +import subprocess +import sys +import time -from calibre.constants import iswindows, ismacos, isfrozen -from calibre.utils.config import prefs +from calibre.constants import isfrozen, ismacos, iswindows from calibre.ptempfile import PersistentTemporaryFile, base_dir +from calibre.utils.config import prefs from calibre.utils.serialize import msgpack_dumps -from polyglot.builtins import string_or_bytes, environ_item, native_string_type from polyglot.binary import as_hex_unicode +from polyglot.builtins import environ_item, native_string_type, string_or_bytes if iswindows: try: diff --git a/src/calibre/utils/ipc/pool.py b/src/calibre/utils/ipc/pool.py index a94b3ac106..4bc15d1668 100644 --- a/src/calibre/utils/ipc/pool.py +++ b/src/calibre/utils/ipc/pool.py @@ -4,13 +4,14 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import os, sys -from threading import Thread +import os +import sys from collections import namedtuple from multiprocessing.connection import Pipe +from threading import Thread -from calibre import detect_ncpus, as_unicode, prints -from calibre.constants import iswindows, DEBUG +from calibre import as_unicode, detect_ncpus, prints +from calibre.constants import DEBUG, iswindows from calibre.ptempfile import PersistentTemporaryFile from calibre.utils import join_with_timeout from calibre.utils.ipc import eintr_retry_call diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py index 29766cfdae..4f66b73f71 100644 --- a/src/calibre/utils/ipc/server.py +++ b/src/calibre/utils/ipc/server.py @@ -16,7 +16,8 @@ from math import ceil from multiprocessing import Pipe from threading import Thread -from calibre import detect_ncpus as cpu_count, force_unicode +from calibre import detect_ncpus as cpu_count +from calibre import force_unicode from calibre.constants import DEBUG from calibre.ptempfile import base_dir from calibre.utils.ipc import eintr_retry_call @@ -27,7 +28,6 @@ from polyglot.binary import as_hex_unicode from polyglot.builtins import environ_item, string_or_bytes from polyglot.queue import Empty, Queue - server_counter = count() _name_counter = count() diff --git a/src/calibre/utils/iphlpapi.py b/src/calibre/utils/iphlpapi.py index 55473c8fbe..7295aca1aa 100644 --- a/src/calibre/utils/iphlpapi.py +++ b/src/calibre/utils/iphlpapi.py @@ -3,10 +3,9 @@ import ctypes -from ctypes import windll -from ctypes import wintypes from collections import namedtuple from contextlib import contextmanager +from ctypes import windll, wintypes # Wraps (part of) the IPHelper API, useful to enumerate the network routes and # adapters on the local machine diff --git a/src/calibre/utils/ipython.py b/src/calibre/utils/ipython.py index 5b53747fc9..a2f19bf29f 100644 --- a/src/calibre/utils/ipython.py +++ b/src/calibre/utils/ipython.py @@ -5,8 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, re, sys -from calibre.constants import iswindows, cache_dir, get_version +import os +import re +import sys + +from calibre.constants import cache_dir, get_version, iswindows from polyglot.builtins import exec_path ipydir = os.path.join(cache_dir(), 'ipython') @@ -115,7 +118,9 @@ history_length(2000) #value of -1 means no limit with open(conf, 'wb') as f: f.write(config.encode('utf-8')) pyreadline.rlmain.config_path = conf - import readline, atexit + import atexit + import readline + import pyreadline.unicode_helper # noqa # Normally the codepage for pyreadline is set to be sys.stdout.encoding # if you need to change this uncomment the following line @@ -189,8 +194,8 @@ def ipython(user_ns=None): have_ipython = True try: from IPython.terminal.embed import InteractiveShellEmbed - from traitlets.config.loader import Config from IPython.terminal.prompts import Prompts, Token + from traitlets.config.loader import Config except ImportError: have_ipython = False if not have_ipython: diff --git a/src/calibre/utils/linux_trash.py b/src/calibre/utils/linux_trash.py index f2309ca6d9..ebc4eea4bd 100644 --- a/src/calibre/utils/linux_trash.py +++ b/src/calibre/utils/linux_trash.py @@ -17,10 +17,11 @@ # For external volumes this implementation will raise an exception if it can't # find or create the user's trash directory. -import os, stat +import os import os.path as op -from datetime import datetime import shutil +import stat +from datetime import datetime from polyglot.urllib import quote diff --git a/src/calibre/utils/localunzip.py b/src/calibre/utils/localunzip.py index 957865f9d3..31923806c8 100644 --- a/src/calibre/utils/localunzip.py +++ b/src/calibre/utils/localunzip.py @@ -12,11 +12,14 @@ These are apparently produced in large numbers by the fruitcakes over at B&N. Tries to only use the local headers to extract data from the damaged zip file. ''' -import os, sys, zlib, shutil -from struct import calcsize, unpack, pack -from collections import namedtuple, OrderedDict -from calibre.ptempfile import SpooledTemporaryFile +import os +import shutil +import sys +import zlib +from collections import OrderedDict, namedtuple +from struct import calcsize, pack, unpack +from calibre.ptempfile import SpooledTemporaryFile from polyglot.builtins import itervalues HEADER_SIG = 0x04034b50 diff --git a/src/calibre/utils/lock.py b/src/calibre/utils/lock.py index ab301018b2..e96de47d83 100644 --- a/src/calibre/utils/lock.py +++ b/src/calibre/utils/lock.py @@ -9,14 +9,13 @@ import tempfile import time from functools import partial -from calibre.constants import ( - __appname__, filesystem_encoding, islinux, ismacos, iswindows -) -from calibre_extensions import speedup +from calibre.constants import __appname__, filesystem_encoding, islinux, ismacos, iswindows from calibre.utils.monotonic import monotonic +from calibre_extensions import speedup if iswindows: import msvcrt + from calibre.constants import get_windows_username from calibre_extensions import winutil excl_file_mode = stat.S_IREAD | stat.S_IWRITE @@ -141,6 +140,7 @@ elif islinux: def create_single_instance_mutex(name, per_user=True): import socket + from calibre.utils.ipc import eintr_retry_call name = '{}-singleinstance-{}-{}'.format( __appname__, (os.geteuid() if per_user else ''), name diff --git a/src/calibre/utils/logging.py b/src/calibre/utils/logging.py index 2f16a158b5..059b1e2fdb 100644 --- a/src/calibre/utils/logging.py +++ b/src/calibre/utils/logging.py @@ -13,7 +13,6 @@ from threading import Lock from calibre.prints import prints from polyglot.builtins import as_unicode - DEBUG = 0 INFO = 1 WARN = 2 diff --git a/src/calibre/utils/magick/draw.py b/src/calibre/utils/magick/draw.py index 3794dfe9e0..ce3a7d3d8c 100644 --- a/src/calibre/utils/magick/draw.py +++ b/src/calibre/utils/magick/draw.py @@ -7,10 +7,12 @@ __docformat__ = 'restructuredtext en' import os -from calibre.utils.magick import Image, create_canvas -from calibre.utils.img import save_cover_data_to as _save_cover_data_to, image_to_data, add_borders_to_image as abti -from calibre.utils.imghdr import identify as _identify from calibre import fit_image +from calibre.utils.img import add_borders_to_image as abti +from calibre.utils.img import image_to_data +from calibre.utils.img import save_cover_data_to as _save_cover_data_to +from calibre.utils.imghdr import identify as _identify +from calibre.utils.magick import Image, create_canvas def _data_to_image(data): diff --git a/src/calibre/utils/magick/legacy.py b/src/calibre/utils/magick/legacy.py index 651a0bd56e..fc3c66c96b 100644 --- a/src/calibre/utils/magick/legacy.py +++ b/src/calibre/utils/magick/legacy.py @@ -6,11 +6,25 @@ import os from io import BytesIO from calibre.utils.img import ( - image_and_format_from_data, clone_image, null_image, resize_image, - overlay_image, rotate_image, quantize_image, remove_borders_from_image, - add_borders_to_image, gaussian_blur_image, create_canvas, despeckle_image, - image_to_data, flip_image, image_has_transparent_pixels, set_image_opacity, - gaussian_sharpen_image, texture_image, grayscale_image + add_borders_to_image, + clone_image, + create_canvas, + despeckle_image, + flip_image, + gaussian_blur_image, + gaussian_sharpen_image, + grayscale_image, + image_and_format_from_data, + image_has_transparent_pixels, + image_to_data, + null_image, + overlay_image, + quantize_image, + remove_borders_from_image, + resize_image, + rotate_image, + set_image_opacity, + texture_image, ) from calibre.utils.imghdr import identify diff --git a/src/calibre/utils/matcher.py b/src/calibre/utils/matcher.py index aac31436e0..c08fee8e58 100644 --- a/src/calibre/utils/matcher.py +++ b/src/calibre/utils/matcher.py @@ -14,12 +14,12 @@ from operator import itemgetter from threading import Lock, Thread from unicodedata import normalize -from calibre import as_unicode, detect_ncpus as cpu_count +from calibre import as_unicode +from calibre import detect_ncpus as cpu_count from calibre.constants import filesystem_encoding -from calibre.utils.icu import ( - lower as icu_lower, primary_collator, primary_find, primary_sort_key, - upper as icu_upper, -) +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import primary_collator, primary_find, primary_sort_key +from calibre.utils.icu import upper as icu_upper from polyglot.builtins import iteritems, itervalues from polyglot.queue import Queue diff --git a/src/calibre/utils/mdns.py b/src/calibre/utils/mdns.py index 696706b9e8..db84d4cc64 100644 --- a/src/calibre/utils/mdns.py +++ b/src/calibre/utils/mdns.py @@ -2,12 +2,14 @@ __license__ = 'GPL 3' __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import socket, time, atexit +import atexit +import socket +import time from collections import defaultdict from threading import Thread -from calibre.utils.filenames import ascii_text from calibre import force_unicode +from calibre.utils.filenames import ascii_text _server = None diff --git a/src/calibre/utils/mem.py b/src/calibre/utils/mem.py index 9ed0ea1a30..ce286b04ca 100644 --- a/src/calibre/utils/mem.py +++ b/src/calibre/utils/mem.py @@ -13,7 +13,8 @@ You can pass a number to memory and it will be subtracted from the returned value. ''' -import gc, os +import gc +import os def get_memory(): diff --git a/src/calibre/utils/monotonic.py b/src/calibre/utils/monotonic.py index d836867569..793af1266a 100644 --- a/src/calibre/utils/monotonic.py +++ b/src/calibre/utils/monotonic.py @@ -1,2 +1,3 @@ from time import monotonic + monotonic diff --git a/src/calibre/utils/mreplace.py b/src/calibre/utils/mreplace.py index 41ce0bcf36..65b9cdcd65 100644 --- a/src/calibre/utils/mreplace.py +++ b/src/calibre/utils/mreplace.py @@ -5,6 +5,7 @@ __copyright__ = '2010, sengian ' __docformat__ = 'restructuredtext en' import re + try: from collections import UserDict except ImportError: diff --git a/src/calibre/utils/open_with/linux.py b/src/calibre/utils/open_with/linux.py index 4cdaa80bee..3edb4fbc64 100644 --- a/src/calibre/utils/open_with/linux.py +++ b/src/calibre/utils/open_with/linux.py @@ -4,11 +4,13 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import re, shlex, os +import os +import re +import shlex from collections import defaultdict -from calibre import walk, guess_type, prints, force_unicode -from calibre.constants import filesystem_encoding, cache_dir +from calibre import force_unicode, guess_type, prints, walk +from calibre.constants import cache_dir, filesystem_encoding from calibre.utils.icu import numeric_sort_key as sort_key from calibre.utils.localization import canonicalize_lang, get_lang from calibre.utils.serialize import msgpack_dumps, msgpack_loads diff --git a/src/calibre/utils/open_with/osx.py b/src/calibre/utils/open_with/osx.py index 9cb4c079cd..5adae681d8 100644 --- a/src/calibre/utils/open_with/osx.py +++ b/src/calibre/utils/open_with/osx.py @@ -4,7 +4,10 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, re, mimetypes, subprocess +import mimetypes +import os +import re +import subprocess from collections import defaultdict from plistlib import loads @@ -18,9 +21,10 @@ application_locations = ('/Applications', '~/Applications', '~/Desktop') def generate_public_uti_map(): - from lxml import etree - from polyglot.urllib import urlopen from html5_parser import parse + from lxml import etree + + from polyglot.urllib import urlopen raw = urlopen( 'https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html').read() root = parse(raw) diff --git a/src/calibre/utils/open_with/windows.py b/src/calibre/utils/open_with/windows.py index 79d0f40669..2c58ee1e3c 100644 --- a/src/calibre/utils/open_with/windows.py +++ b/src/calibre/utils/open_with/windows.py @@ -7,6 +7,7 @@ __copyright__ = '2015, Kovid Goyal ' import os import re import sys + from qt.core import QBuffer, QByteArray, QIODevice, QPixmap, Qt from calibre.gui2 import must_use_qt diff --git a/src/calibre/utils/opensearch/description.py b/src/calibre/utils/opensearch/description.py index 059694d0f2..f1bada0926 100644 --- a/src/calibre/utils/opensearch/description.py +++ b/src/calibre/utils/opensearch/description.py @@ -8,8 +8,8 @@ __docformat__ = 'restructuredtext en' from contextlib import closing from calibre import browser -from calibre.utils.xml_parse import safe_xml_fromstring from calibre.utils.opensearch.url import URL +from calibre.utils.xml_parse import safe_xml_fromstring class Description: diff --git a/src/calibre/utils/podofo/__init__.py b/src/calibre/utils/podofo/__init__.py index cd29451bc9..68c84180fa 100644 --- a/src/calibre/utils/podofo/__init__.py +++ b/src/calibre/utils/podofo/__init__.py @@ -213,6 +213,7 @@ def test_roundtrip(src, dest): def test_podofo(): import tempfile + from calibre.ebooks.metadata.book.base import Metadata from calibre.ebooks.metadata.xmp import metadata_to_xmp_packet # {{{ diff --git a/src/calibre/utils/random_ua.py b/src/calibre/utils/random_ua.py index 35f46e639f..8c9db5253a 100644 --- a/src/calibre/utils/random_ua.py +++ b/src/calibre/utils/random_ua.py @@ -4,6 +4,7 @@ import json import random + from calibre.utils.resources import get_path as P diff --git a/src/calibre/utils/rapydscript.py b/src/calibre/utils/rapydscript.py index 1933808ec2..c46f582410 100644 --- a/src/calibre/utils/rapydscript.py +++ b/src/calibre/utils/rapydscript.py @@ -11,9 +11,15 @@ import sys from calibre import force_unicode from calibre.constants import ( - FAKE_HOST, FAKE_PROTOCOL, SPECIAL_TITLE_FOR_WEBENGINE_COMMS, __appname__, - __version__, builtin_colors_dark, builtin_colors_light, builtin_decorations, - dark_link_color + FAKE_HOST, + FAKE_PROTOCOL, + SPECIAL_TITLE_FOR_WEBENGINE_COMMS, + __appname__, + __version__, + builtin_colors_dark, + builtin_colors_light, + builtin_decorations, + dark_link_color, ) from calibre.ptempfile import TemporaryDirectory from calibre.utils.filenames import atomic_rename @@ -60,9 +66,7 @@ def compiler(): from calibre import walk from calibre.gui2 import must_use_qt - from calibre.utils.webengine import ( - secure_webengine, setup_default_profile, setup_profile - ) + from calibre.utils.webengine import secure_webengine, setup_default_profile, setup_profile must_use_qt() setup_default_profile() @@ -346,20 +350,15 @@ def atomic_write(base, name, content): def run_rapydscript_tests(): - from qt.core import QApplication, QByteArray, QEventLoop, QUrl - from qt.webengine import ( - QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineUrlRequestJob, - QWebEngineUrlSchemeHandler - ) from urllib.parse import parse_qs + from qt.core import QApplication, QByteArray, QEventLoop, QUrl + from qt.webengine import QWebEnginePage, QWebEngineProfile, QWebEngineScript, QWebEngineUrlRequestJob, QWebEngineUrlSchemeHandler + from calibre.constants import FAKE_HOST, FAKE_PROTOCOL from calibre.gui2 import must_use_qt from calibre.gui2.viewer.web_view import send_reply - from calibre.utils.webengine import ( - create_script, insert_scripts, secure_webengine, setup_default_profile, - setup_fake_protocol, setup_profile - ) + from calibre.utils.webengine import create_script, insert_scripts, secure_webengine, setup_default_profile, setup_fake_protocol, setup_profile must_use_qt() setup_fake_protocol() setup_default_profile() diff --git a/src/calibre/utils/rcc/__init__.py b/src/calibre/utils/rcc/__init__.py index 845ba9349e..b8ae07d7c0 100644 --- a/src/calibre/utils/rcc/__init__.py +++ b/src/calibre/utils/rcc/__init__.py @@ -1,10 +1,12 @@ #!/usr/bin/env python # License: GPL v3 Copyright: 2022, Kovid Goyal -import os, io +import io +import os import sys import tempfile from posixpath import normpath + from qt.core import QFile, QIODevice from calibre_extensions import rcc_backend diff --git a/src/calibre/utils/recycle_bin.py b/src/calibre/utils/recycle_bin.py index f688c1c3f2..ce91e6d09b 100644 --- a/src/calibre/utils/recycle_bin.py +++ b/src/calibre/utils/recycle_bin.py @@ -5,17 +5,20 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, shutil, time, sys +import os +import shutil +import sys +import time from calibre import isbytestring -from calibre.constants import (iswindows, ismacos, filesystem_encoding, - islinux) +from calibre.constants import filesystem_encoding, islinux, ismacos, iswindows recycle = None if iswindows: - from calibre.utils.ipc import eintr_retry_call from threading import Lock + + from calibre.utils.ipc import eintr_retry_call from calibre_extensions import winutil recycler = None rlock = Lock() diff --git a/src/calibre/utils/resources.py b/src/calibre/utils/resources.py index d00343acc6..42132815cc 100644 --- a/src/calibre/utils/resources.py +++ b/src/calibre/utils/resources.py @@ -6,12 +6,12 @@ __copyright__ = '2009, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, os +import os +import sys from calibre import config_dir from polyglot.builtins import builtins - user_dir = os.path.join(config_dir, 'resources') diff --git a/src/calibre/utils/run_tests.py b/src/calibre/utils/run_tests.py index e84252334a..39760bb90b 100644 --- a/src/calibre/utils/run_tests.py +++ b/src/calibre/utils/run_tests.py @@ -2,9 +2,13 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -import unittest, functools, importlib, importlib.resources, os -from calibre.utils.monotonic import monotonic +import functools +import importlib +import importlib.resources +import os +import unittest +from calibre.utils.monotonic import monotonic is_ci = os.environ.get('CI', '').lower() == 'true' @@ -85,9 +89,9 @@ def itertests(suite): def init_env(): - from calibre.utils.config_base import reset_tweaks_to_default from calibre.ebooks.metadata.book.base import reset_field_metadata from calibre.ebooks.oeb.polish.utils import setup_css_parser_serialization + from calibre.utils.config_base import reset_tweaks_to_default reset_tweaks_to_default() reset_field_metadata() setup_css_parser_serialization() @@ -172,7 +176,7 @@ class TestImports(unittest.TestCase): return count def test_import_of_all_python_modules(self): - from calibre.constants import iswindows, ismacos, islinux, isbsd + from calibre.constants import isbsd, islinux, ismacos, iswindows exclude_packages = {'calibre.devices.mtp.unix.upstream'} exclude_modules = set() if not iswindows: diff --git a/src/calibre/utils/search_query_parser.py b/src/calibre/utils/search_query_parser.py index c72615595f..e7b47940aa 100644 --- a/src/calibre/utils/search_query_parser.py +++ b/src/calibre/utils/search_query_parser.py @@ -17,16 +17,17 @@ methods :method:`SearchQueryParser.universal_set` and If this module is run, it will perform a series of unit tests. ''' -import weakref, re +import re +import weakref -from calibre.constants import preferred_encoding -from calibre.utils.icu import sort_key, lower as icu_lower -from calibre.utils.localization import _ from calibre import prints +from calibre.constants import preferred_encoding +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import sort_key +from calibre.utils.localization import _ from polyglot.binary import as_hex_unicode, from_hex_unicode from polyglot.builtins import codepoint_to_chr - ''' This class manages access to the preference holding the saved search queries. It exists to ensure that unicode is used throughout, and also to permit diff --git a/src/calibre/utils/search_query_parser_test.py b/src/calibre/utils/search_query_parser_test.py index acfd90f2b1..91e515416b 100644 --- a/src/calibre/utils/search_query_parser_test.py +++ b/src/calibre/utils/search_query_parser_test.py @@ -5,7 +5,7 @@ import operator import unittest -from calibre.utils.search_query_parser import SearchQueryParser, Parser +from calibre.utils.search_query_parser import Parser, SearchQueryParser class Tester(SearchQueryParser): diff --git a/src/calibre/utils/serialize.py b/src/calibre/utils/serialize.py index 707298df2e..81e187f0a5 100644 --- a/src/calibre/utils/serialize.py +++ b/src/calibre/utils/serialize.py @@ -25,9 +25,9 @@ def create_encoder(for_json=False): if isinstance(obj, (set, frozenset)): return encoded(1, tuple(obj), ExtType) if getattr(obj, '__calibre_serializable__', False): + from calibre.db.categories import Tag from calibre.ebooks.metadata.book.base import Metadata from calibre.library.field_metadata import FieldMetadata, fm_as_dict - from calibre.db.categories import Tag if isinstance(obj, Metadata): from calibre.ebooks.metadata.book.serialize import metadata_as_dict return encoded( @@ -60,8 +60,8 @@ def json_dumps(data, **kw): def decode_metadata(x, for_json): - from polyglot.binary import from_base64_bytes from calibre.ebooks.metadata.book.serialize import metadata_from_dict + from polyglot.binary import from_base64_bytes obj = metadata_from_dict(x) if for_json and obj.cover_data and obj.cover_data[1]: obj.cover_data = obj.cover_data[0], from_base64_bytes(obj.cover_data[1]) diff --git a/src/calibre/utils/seven_zip.py b/src/calibre/utils/seven_zip.py index 6cf16277f9..29263daf3f 100644 --- a/src/calibre/utils/seven_zip.py +++ b/src/calibre/utils/seven_zip.py @@ -55,6 +55,7 @@ def extract(path_or_stream, location): def test_basic(): from tempfile import TemporaryDirectory + from calibre import CurrentDir tdata = { diff --git a/src/calibre/utils/shared_file.py b/src/calibre/utils/shared_file.py index a2fef575cc..ea60f3c073 100644 --- a/src/calibre/utils/shared_file.py +++ b/src/calibre/utils/shared_file.py @@ -4,11 +4,11 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, sys - -from polyglot.builtins import reraise +import os +import sys from calibre.constants import iswindows +from polyglot.builtins import reraise ''' This module defines a share_open() function which is a replacement for @@ -28,8 +28,9 @@ file before deleting it. ''' if iswindows: - from numbers import Integral import msvcrt + from numbers import Integral + from calibre_extensions import winutil _ACCESS_MASK = os.O_RDONLY | os.O_WRONLY | os.O_RDWR @@ -103,6 +104,7 @@ else: def find_tests(): import unittest + from calibre.ptempfile import TemporaryDirectory class SharedFileTest(unittest.TestCase): diff --git a/src/calibre/utils/shm.py b/src/calibre/utils/shm.py index 0f1635af44..175f325c47 100644 --- a/src/calibre/utils/shm.py +++ b/src/calibre/utils/shm.py @@ -9,7 +9,8 @@ import secrets import stat import struct from typing import Optional, Union -from calibre.constants import iswindows, ismacos + +from calibre.constants import ismacos, iswindows SHM_NAME_MAX = 30 if ismacos else 254 if iswindows: diff --git a/src/calibre/utils/short_uuid.py b/src/calibre/utils/short_uuid.py index f97475c432..9b344e20b7 100644 --- a/src/calibre/utils/short_uuid.py +++ b/src/calibre/utils/short_uuid.py @@ -6,7 +6,9 @@ Generate UUID encoded using a user specified alphabet. ''' -import string, math, uuid as _uuid +import math +import string +import uuid as _uuid def num_to_string(number, alphabet, alphabet_len, pad_to_length=None): diff --git a/src/calibre/utils/smtp.py b/src/calibre/utils/smtp.py index 213ddbae47..01b697dbb1 100644 --- a/src/calibre/utils/smtp.py +++ b/src/calibre/utils/smtp.py @@ -8,7 +8,12 @@ This module implements a simple commandline SMTP client that supports: * Background delivery with failures being saved in a maildir mailbox ''' -import sys, traceback, os, socket, encodings.idna as idna +import encodings.idna as idna +import os +import socket +import sys +import traceback + from calibre import isbytestring from calibre.constants import iswindows from calibre.utils.localization import _ @@ -75,9 +80,9 @@ def create_mail(from_, to, subject, text=None, attachment_data=None, attachment_type=None, attachment_name=None): assert text or attachment_data + import uuid from email.message import EmailMessage from email.utils import formatdate - import uuid outer = EmailMessage() outer['From'] = from_ @@ -117,6 +122,7 @@ def get_mx(host, verbose=0): def sendmail_direct(from_, to, msg, timeout, localhost, verbose, debug_output=None): from email.message import Message + import polyglot.smtplib as smtplib hosts = get_mx(to.split('@')[-1].strip(), verbose) timeout=None # Non blocking sockets sometimes don't work diff --git a/src/calibre/utils/smtplib.py b/src/calibre/utils/smtplib.py index 0db318ef6f..d1742b55ee 100644 --- a/src/calibre/utils/smtplib.py +++ b/src/calibre/utils/smtplib.py @@ -43,14 +43,14 @@ Example: # # This was modified from the Python 1.5 library HTTP lib. -import socket -import re -import email.utils import base64 +import email.utils import hmac +import re +import socket from email.base64mime import body_encode as encode_base64 -from sys import stderr from functools import partial +from sys import stderr from polyglot.builtins import string_or_bytes diff --git a/src/calibre/utils/tdir_in_cache.py b/src/calibre/utils/tdir_in_cache.py index 9672c36449..55c78ae470 100644 --- a/src/calibre/utils/tdir_in_cache.py +++ b/src/calibre/utils/tdir_in_cache.py @@ -36,6 +36,7 @@ if iswindows: return False else: import fcntl + from calibre.utils.ipc import eintr_retry_call def lock_tdir(path): diff --git a/src/calibre/utils/terminal.py b/src/calibre/utils/terminal.py index cd31103b1e..6aee59ef56 100644 --- a/src/calibre/utils/terminal.py +++ b/src/calibre/utils/terminal.py @@ -4,10 +4,12 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import os, sys, re +import os +import re +import sys -from calibre.prints import is_binary from calibre.constants import iswindows +from calibre.prints import is_binary from polyglot.builtins import iteritems if iswindows: @@ -233,7 +235,9 @@ def windows_terminfo(): def get_term_geometry(): - import fcntl, termios, struct + import fcntl + import struct + import termios def ioctl_GWINSZ(fd): try: diff --git a/src/calibre/utils/test_lock.py b/src/calibre/utils/test_lock.py index 411ac63adf..5477ac0c55 100644 --- a/src/calibre/utils/test_lock.py +++ b/src/calibre/utils/test_lock.py @@ -13,10 +13,7 @@ from threading import Thread from calibre.constants import cache_dir, iswindows from calibre.utils.lock import ExclusiveFile, create_single_instance_mutex, unix_open -from calibre.utils.tdir_in_cache import ( - clean_tdirs_in, is_tdir_locked, retry_lock_tdir, tdir_in_cache, tdirs_in, - unlock_file -) +from calibre.utils.tdir_in_cache import clean_tdirs_in, is_tdir_locked, retry_lock_tdir, tdir_in_cache, tdirs_in, unlock_file from polyglot.builtins import iteritems, native_string_type diff --git a/src/calibre/utils/threadpool.py b/src/calibre/utils/threadpool.py index f5a7608c70..15c391eca0 100644 --- a/src/calibre/utils/threadpool.py +++ b/src/calibre/utils/threadpool.py @@ -47,6 +47,7 @@ __license__ = 'Python license' # standard library modules import threading + from polyglot import queue # exceptions diff --git a/src/calibre/utils/titlecase.py b/src/calibre/utils/titlecase.py index f5d5163e04..6002fd12f5 100644 --- a/src/calibre/utils/titlecase.py +++ b/src/calibre/utils/titlecase.py @@ -10,7 +10,9 @@ License: http://www.opensource.org/licenses/mit-license.php import re -from calibre.utils.icu import capitalize, lower as icu_lower, upper as icu_upper +from calibre.utils.icu import capitalize +from calibre.utils.icu import lower as icu_lower +from calibre.utils.icu import upper as icu_upper __all__ = ['titlecase'] __version__ = '0.5' diff --git a/src/calibre/utils/unrar.py b/src/calibre/utils/unrar.py index ebadbc8071..ff8100f6d8 100644 --- a/src/calibre/utils/unrar.py +++ b/src/calibre/utils/unrar.py @@ -6,8 +6,8 @@ __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' import os -import shutil import re +import shutil from io import BytesIO from calibre.constants import filesystem_encoding, iswindows @@ -112,7 +112,7 @@ def extract_first_alphabetically(stream): def extract_cover_image(stream): - from calibre.libunzip import sort_key, name_ok + from calibre.libunzip import name_ok, sort_key for name in sorted(names(stream), key=sort_key): if name_ok(name): return extract_member(stream, name=name, match=None) diff --git a/src/calibre/utils/webengine.py b/src/calibre/utils/webengine.py index 3234105ec5..2fd372b92a 100644 --- a/src/calibre/utils/webengine.py +++ b/src/calibre/utils/webengine.py @@ -4,14 +4,11 @@ import json import os -from qt.core import QBuffer, QIODevice, QObject, pyqtSignal, sip -from qt.webengine import ( - QWebEngineProfile, QWebEngineScript, QWebEngineSettings, QWebEngineUrlScheme -) -from calibre.constants import ( - FAKE_PROTOCOL, SPECIAL_TITLE_FOR_WEBENGINE_COMMS, cache_dir -) +from qt.core import QBuffer, QIODevice, QObject, pyqtSignal, sip +from qt.webengine import QWebEngineProfile, QWebEngineScript, QWebEngineSettings, QWebEngineUrlScheme + +from calibre.constants import FAKE_PROTOCOL, SPECIAL_TITLE_FOR_WEBENGINE_COMMS, cache_dir def setup_fake_protocol(): diff --git a/src/calibre/utils/windows/winsapi.py b/src/calibre/utils/windows/winsapi.py index f808e9bb2a..efc865c2a0 100644 --- a/src/calibre/utils/windows/winsapi.py +++ b/src/calibre/utils/windows/winsapi.py @@ -10,8 +10,8 @@ def develop(): def find_tests(): - import unittest import os + import unittest is_ci = os.environ.get('CI', '').lower() == 'true' class TestSAPI(unittest.TestCase): diff --git a/src/calibre/utils/windows/winspeech.py b/src/calibre/utils/windows/winspeech.py index 5e7cc9acc5..0045361630 100644 --- a/src/calibre/utils/windows/winspeech.py +++ b/src/calibre/utils/windows/winspeech.py @@ -12,7 +12,7 @@ from itertools import count from queue import Empty, Queue from threading import Thread from time import monotonic -from typing import NamedTuple, Tuple, Optional +from typing import NamedTuple, Optional, Tuple from calibre.constants import DEBUG from calibre.utils.ipc.simple_worker import start_pipe_worker diff --git a/src/calibre/utils/winreg/dde.py b/src/calibre/utils/winreg/dde.py index 4a8c403e39..38c9fff5a9 100644 --- a/src/calibre/utils/winreg/dde.py +++ b/src/calibre/utils/winreg/dde.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import numbers -from ctypes import POINTER, WINFUNCTYPE, c_void_p, c_ulong, c_char_p, windll, byref +from ctypes import POINTER, WINFUNCTYPE, byref, c_char_p, c_ulong, c_void_p, windll from ctypes.wintypes import BOOL, DWORD, LPCWSTR, UINT from polyglot.builtins import itervalues diff --git a/src/calibre/utils/winreg/lib.py b/src/calibre/utils/winreg/lib.py index c39f222f74..c0cc018d29 100644 --- a/src/calibre/utils/winreg/lib.py +++ b/src/calibre/utils/winreg/lib.py @@ -4,7 +4,11 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import ctypes, ctypes.wintypes as types, struct, datetime, numbers +import ctypes +import ctypes.wintypes as types +import datetime +import numbers +import struct from calibre_extensions import winutil diff --git a/src/calibre/utils/wmf/__init__.py b/src/calibre/utils/wmf/__init__.py index ff9972fa01..7a912414cd 100644 --- a/src/calibre/utils/wmf/__init__.py +++ b/src/calibre/utils/wmf/__init__.py @@ -60,7 +60,7 @@ def create_bmp_from_dib(raw): def to_png(bmp): - from qt.core import QImage, QByteArray, QBuffer, QIODevice + from qt.core import QBuffer, QByteArray, QImage, QIODevice i = QImage() if not i.loadFromData(bmp): raise ValueError('Invalid image data') diff --git a/src/calibre/utils/wmf/emf.py b/src/calibre/utils/wmf/emf.py index 51aa305eb6..7c5a7c9a05 100644 --- a/src/calibre/utils/wmf/emf.py +++ b/src/calibre/utils/wmf/emf.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' import sys -from struct import unpack_from from collections import namedtuple +from struct import unpack_from from calibre.utils.wmf import create_bmp_from_dib, to_png from polyglot.builtins import iteritems diff --git a/src/calibre/utils/wmf/parse.py b/src/calibre/utils/wmf/parse.py index 59b23cf53f..522ef4ad15 100644 --- a/src/calibre/utils/wmf/parse.py +++ b/src/calibre/utils/wmf/parse.py @@ -5,7 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import sys, struct +import struct +import sys from calibre.utils.wmf import create_bmp_from_dib, to_png diff --git a/src/calibre/utils/xml_parse.py b/src/calibre/utils/xml_parse.py index 339538b900..fdd57dca75 100644 --- a/src/calibre/utils/xml_parse.py +++ b/src/calibre/utils/xml_parse.py @@ -42,7 +42,10 @@ def unsafe_xml_fromstring(string_or_bytes): def find_tests(): - import unittest, tempfile, os + import os + import tempfile + import unittest + from calibre.constants import iswindows class TestXMLParse(unittest.TestCase): diff --git a/src/calibre/utils/zipfile.py b/src/calibre/utils/zipfile.py index e493b75ccf..03c57bc7c6 100644 --- a/src/calibre/utils/zipfile.py +++ b/src/calibre/utils/zipfile.py @@ -17,7 +17,7 @@ from calibre import sanitize_file_name from calibre.constants import filesystem_encoding from calibre.ebooks.chardet import detect from calibre.ptempfile import SpooledTemporaryFile -from polyglot.builtins import string_or_bytes, as_bytes +from polyglot.builtins import as_bytes, string_or_bytes try: import zlib # We may need its compression method diff --git a/src/calibre/web/__init__.py b/src/calibre/web/__init__.py index 4c4f3be0f4..50c0b76adf 100644 --- a/src/calibre/web/__init__.py +++ b/src/calibre/web/__init__.py @@ -39,9 +39,10 @@ def get_download_filename(url, cookie_file=None): Get a local filename for a URL using the content disposition header Returns empty string if an error occurs. ''' - from calibre import browser from contextlib import closing + from calibre import browser + filename = '' br = browser() diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 60aaa71b6e..cb5c2a7669 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -16,10 +16,7 @@ from collections import defaultdict from contextlib import closing from urllib.parse import urlparse, urlsplit -from calibre import ( - __appname__, as_unicode, browser, force_unicode, iswindows, preferred_encoding, - random_user_agent, strftime, -) +from calibre import __appname__, as_unicode, browser, force_unicode, iswindows, preferred_encoding, random_user_agent, strftime from calibre.ebooks.BeautifulSoup import BeautifulSoup, CData, NavigableString, Tag from calibre.ebooks.metadata import MetaInformation from calibre.ebooks.metadata.opf2 import OPFCreator @@ -33,9 +30,8 @@ from calibre.utils.logging import ThreadSafeWrapper from calibre.utils.threadpool import NoResultsPending, ThreadPool, WorkRequest from calibre.web import Recipe from calibre.web.feeds import Feed, feed_from_xml, feeds_from_index, templates -from calibre.web.fetch.simple import ( - AbortArticle, RecursiveFetcher, option_parser as web2disk_option_parser, -) +from calibre.web.fetch.simple import AbortArticle, RecursiveFetcher +from calibre.web.fetch.simple import option_parser as web2disk_option_parser from calibre.web.fetch.utils import prepare_masthead_image from polyglot.builtins import string_or_bytes diff --git a/src/calibre/web/feeds/recipes/__init__.py b/src/calibre/web/feeds/recipes/__init__.py index 5e16423832..6a974a23fa 100644 --- a/src/calibre/web/feeds/recipes/__init__.py +++ b/src/calibre/web/feeds/recipes/__init__.py @@ -5,12 +5,14 @@ __copyright__ = '2008, Kovid Goyal ' ''' Builtin recipes. ''' -import re, time, io -from calibre.web.feeds.news import (BasicNewsRecipe, CustomIndexRecipe, - AutomaticNewsRecipe, CalibrePeriodical) +import io +import re +import time + from calibre.ebooks.BeautifulSoup import BeautifulSoup from calibre.utils.config import JSONConfig -from polyglot.builtins import itervalues, codepoint_to_chr +from calibre.web.feeds.news import AutomaticNewsRecipe, BasicNewsRecipe, CalibrePeriodical, CustomIndexRecipe +from polyglot.builtins import codepoint_to_chr, itervalues basic_recipes = (BasicNewsRecipe, AutomaticNewsRecipe, CustomIndexRecipe, CalibrePeriodical) diff --git a/src/calibre/web/feeds/recipes/collection.py b/src/calibre/web/feeds/recipes/collection.py index 2ad02dca40..db0f84f98a 100644 --- a/src/calibre/web/feeds/recipes/collection.py +++ b/src/calibre/web/feeds/recipes/collection.py @@ -9,19 +9,19 @@ import calendar import os import zipfile from datetime import timedelta +from threading import RLock + from lxml import etree from lxml.builder import ElementMaker -from threading import RLock from calibre import force_unicode from calibre.constants import numeric_version -from calibre.utils.date import ( - EPOCH, UNDEFINED_DATE, isoformat, local_tz, now as nowf, utcnow, -) +from calibre.utils.date import EPOCH, UNDEFINED_DATE, isoformat, local_tz, utcnow +from calibre.utils.date import now as nowf from calibre.utils.iso8601 import parse_iso8601 -from calibre.utils.resources import get_path as P from calibre.utils.localization import _ from calibre.utils.recycle_bin import delete_file +from calibre.utils.resources import get_path as P from calibre.utils.xml_parse import safe_xml_fromstring from polyglot.builtins import iteritems diff --git a/src/calibre/web/feeds/recipes/model.py b/src/calibre/web/feeds/recipes/model.py index 25b8e0364b..3134db3a1c 100644 --- a/src/calibre/web/feeds/recipes/model.py +++ b/src/calibre/web/feeds/recipes/model.py @@ -4,20 +4,25 @@ import copy import zipfile from functools import total_ordering -from qt.core import ( - QAbstractItemModel, QApplication, QFont, QIcon, QModelIndex, QPalette, QPixmap, Qt, - pyqtSignal, -) + +from qt.core import QAbstractItemModel, QApplication, QFont, QIcon, QModelIndex, QPalette, QPixmap, Qt, pyqtSignal from calibre import force_unicode from calibre.utils.icu import primary_sort_key -from calibre.utils.localization import _, get_language, countrycode_to_name +from calibre.utils.localization import _, countrycode_to_name, get_language from calibre.utils.resources import get_path as P from calibre.utils.search_query_parser import ParseException, SearchQueryParser from calibre.web.feeds.recipes.collection import ( - SchedulerConfig, add_custom_recipe, add_custom_recipes, download_builtin_recipe, - get_builtin_recipe, get_builtin_recipe_collection, get_custom_recipe, - get_custom_recipe_collection, remove_custom_recipe, update_custom_recipe, + SchedulerConfig, + add_custom_recipe, + add_custom_recipes, + download_builtin_recipe, + get_builtin_recipe, + get_builtin_recipe_collection, + get_custom_recipe, + get_custom_recipe_collection, + remove_custom_recipe, + update_custom_recipe, update_custom_recipes, ) from polyglot.builtins import iteritems diff --git a/src/calibre/web/feeds/templates.py b/src/calibre/web/feeds/templates.py index 6c7f9daa00..524ae9222b 100644 --- a/src/calibre/web/feeds/templates.py +++ b/src/calibre/web/feeds/templates.py @@ -7,12 +7,11 @@ __copyright__ = '2008, Kovid Goyal ' import copy -from lxml import html, etree -from lxml.html.builder import HTML, HEAD, TITLE, STYLE, DIV, BODY, \ - STRONG, BR, SPAN, A, HR, UL, LI, H2, H3, IMG, P as PT, \ - TABLE, TD, TR +from lxml import etree, html +from lxml.html.builder import BODY, BR, DIV, H2, H3, HEAD, HR, HTML, IMG, LI, SPAN, STRONG, STYLE, TABLE, TD, TITLE, TR, UL, A +from lxml.html.builder import P as PT -from calibre import strftime, isbytestring +from calibre import isbytestring, strftime from calibre.utils.localization import _ diff --git a/src/calibre/web/fetch/simple.py b/src/calibre/web/fetch/simple.py index 050e6dd36c..32466e35cf 100644 --- a/src/calibre/web/fetch/simple.py +++ b/src/calibre/web/fetch/simple.py @@ -30,10 +30,7 @@ from calibre.utils.localization import _ from calibre.utils.logging import Log from calibre.web.fetch.utils import rescale_image from polyglot.http_client import responses -from polyglot.urllib import ( - URLError, quote, url2pathname, urljoin, urlparse, urlsplit, urlunparse, - urlunsplit -) +from polyglot.urllib import URLError, quote, url2pathname, urljoin, urlparse, urlsplit, urlunparse, urlunsplit class AbortArticle(Exception): diff --git a/src/calibre/web/fetch/utils.py b/src/calibre/web/fetch/utils.py index 4dab35c2ad..5981ddcd9d 100644 --- a/src/calibre/web/fetch/utils.py +++ b/src/calibre/web/fetch/utils.py @@ -2,7 +2,7 @@ # License: GPLv3 Copyright: 2016, Kovid Goyal -from calibre.utils.img import image_from_data, scale_image, image_to_data, blend_on_canvas +from calibre.utils.img import blend_on_canvas, image_from_data, image_to_data, scale_image def rescale_image(data, scale_news_images, compress_news_images_max_size, compress_news_images_auto_size): diff --git a/src/css_selectors/__init__.py b/src/css_selectors/__init__.py index 88ce09a151..ac78aee2ec 100644 --- a/src/css_selectors/__init__.py +++ b/src/css_selectors/__init__.py @@ -5,8 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' +from css_selectors.errors import ExpressionError, SelectorError, SelectorSyntaxError from css_selectors.parser import parse -from css_selectors.select import Select, INAPPROPRIATE_PSEUDO_CLASSES -from css_selectors.errors import SelectorError, SelectorSyntaxError, ExpressionError +from css_selectors.select import INAPPROPRIATE_PSEUDO_CLASSES, Select __all__ = ['parse', 'Select', 'INAPPROPRIATE_PSEUDO_CLASSES', 'SelectorError', 'SelectorSyntaxError', 'ExpressionError'] diff --git a/src/css_selectors/ordered_set.py b/src/css_selectors/ordered_set.py index 51c30c2eb2..c2fc230cba 100644 --- a/src/css_selectors/ordered_set.py +++ b/src/css_selectors/ordered_set.py @@ -6,6 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' import collections.abc + from polyglot.builtins import string_or_bytes SLICE_ALL = slice(None) diff --git a/src/css_selectors/parser.py b/src/css_selectors/parser.py index 826799ab7c..e39ae949a2 100644 --- a/src/css_selectors/parser.py +++ b/src/css_selectors/parser.py @@ -9,14 +9,13 @@ """ -import sys -import re import operator +import re import string +import sys -from css_selectors.errors import SelectorSyntaxError, ExpressionError -from polyglot.builtins import unicode_type, codepoint_to_chr - +from css_selectors.errors import ExpressionError, SelectorSyntaxError +from polyglot.builtins import codepoint_to_chr, unicode_type utab = {c:c+32 for c in range(ord(u'A'), ord(u'Z')+1)} diff --git a/src/css_selectors/select.py b/src/css_selectors/select.py index 5fb6428a22..00ec9c1cd1 100644 --- a/src/css_selectors/select.py +++ b/src/css_selectors/select.py @@ -5,7 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import re, itertools +import itertools +import re from collections import OrderedDict, defaultdict from functools import wraps from itertools import chain @@ -13,9 +14,8 @@ from itertools import chain from lxml import etree from css_selectors.errors import ExpressionError -from css_selectors.parser import parse, ascii_lower, Element, FunctionalPseudoElement from css_selectors.ordered_set import OrderedSet - +from css_selectors.parser import Element, FunctionalPseudoElement, ascii_lower, parse from polyglot.builtins import iteritems, itervalues PARSE_CACHE_SIZE = 200 diff --git a/src/css_selectors/tests.py b/src/css_selectors/tests.py index e07c6cbcfe..d0b99ba40e 100644 --- a/src/css_selectors/tests.py +++ b/src/css_selectors/tests.py @@ -5,12 +5,14 @@ __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import unittest, sys, argparse +import argparse +import sys +import unittest from lxml import etree, html -from css_selectors.errors import SelectorSyntaxError, ExpressionError -from css_selectors.parser import tokenize, parse +from css_selectors.errors import ExpressionError, SelectorSyntaxError +from css_selectors.parser import parse, tokenize from css_selectors.select import Select diff --git a/src/odf/anim.py b/src/odf/anim.py index 705dd49f68..c51a5a798b 100644 --- a/src/odf/anim.py +++ b/src/odf/anim.py @@ -18,8 +18,8 @@ # -from .namespaces import ANIMNS from .element import Element +from .namespaces import ANIMNS # Autogenerated diff --git a/src/odf/attrconverters.py b/src/odf/attrconverters.py index 853a728fa9..1687bff05f 100644 --- a/src/odf/attrconverters.py +++ b/src/odf/attrconverters.py @@ -19,13 +19,31 @@ import re -from .namespaces import ( - ANIMNS, CHARTNS, CONFIGNS, DR3DNS, DRAWNS, FONS, FORMNS, MANIFESTNS, METANS, - NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, SMILNS, STYLENS, SVGNS, TABLENS, - TEXTNS, XFORMSNS, XLINKNS -) from polyglot.builtins import string_or_bytes, unicode_type +from .namespaces import ( + ANIMNS, + CHARTNS, + CONFIGNS, + DR3DNS, + DRAWNS, + FONS, + FORMNS, + MANIFESTNS, + METANS, + NUMBERNS, + OFFICENS, + PRESENTATIONNS, + SCRIPTNS, + SMILNS, + STYLENS, + SVGNS, + TABLENS, + TEXTNS, + XFORMSNS, + XLINKNS, +) + pattern_color = re.compile(r'#[0-9a-fA-F]{6}') pattern_vector3D = re.compile(r'\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\)') diff --git a/src/odf/chart.py b/src/odf/chart.py index 779d4ff3e5..6d507c39a6 100644 --- a/src/odf/chart.py +++ b/src/odf/chart.py @@ -18,8 +18,8 @@ # -from .namespaces import CHARTNS from .element import Element +from .namespaces import CHARTNS # Autogenerated diff --git a/src/odf/config.py b/src/odf/config.py index 1bb0228a24..03fb16e5a8 100644 --- a/src/odf/config.py +++ b/src/odf/config.py @@ -18,8 +18,8 @@ # -from .namespaces import CONFIGNS from .element import Element +from .namespaces import CONFIGNS # Autogenerated diff --git a/src/odf/dc.py b/src/odf/dc.py index d72bbff216..55fdc5f9ac 100644 --- a/src/odf/dc.py +++ b/src/odf/dc.py @@ -18,8 +18,8 @@ # -from .namespaces import DCNS from .element import Element +from .namespaces import DCNS # Autogenerated diff --git a/src/odf/dr3d.py b/src/odf/dr3d.py index 21a93928cd..6260223ec9 100644 --- a/src/odf/dr3d.py +++ b/src/odf/dr3d.py @@ -18,8 +18,8 @@ # -from .namespaces import DR3DNS from .draw import StyleRefElement +from .namespaces import DR3DNS # Autogenerated diff --git a/src/odf/draw.py b/src/odf/draw.py index 6fe6cdf284..9708fb34ad 100644 --- a/src/odf/draw.py +++ b/src/odf/draw.py @@ -18,8 +18,8 @@ # -from .namespaces import DRAWNS, STYLENS, PRESENTATIONNS from .element import Element +from .namespaces import DRAWNS, PRESENTATIONNS, STYLENS def StyleRefElement(stylename=None, classnames=None, **args): diff --git a/src/odf/easyliststyle.py b/src/odf/easyliststyle.py index f8126bea63..11a2b8de05 100644 --- a/src/odf/easyliststyle.py +++ b/src/odf/easyliststyle.py @@ -20,10 +20,12 @@ import re -from .style import ListLevelProperties -from .text import ListStyle,ListLevelStyleNumber,ListLevelStyleBullet + from polyglot.builtins import unicode_type +from .style import ListLevelProperties +from .text import ListLevelStyleBullet, ListLevelStyleNumber, ListStyle + """ Create a element from a string or array. diff --git a/src/odf/element.py b/src/odf/element.py index fd2fb5f098..99b77e83a7 100644 --- a/src/odf/element.py +++ b/src/odf/element.py @@ -23,13 +23,14 @@ # import xml.dom -from xml.dom.minicompat import defproperty, EmptyNodeList -from .namespaces import nsdict -from . import grammar -from .attrconverters import AttrConverters +from xml.dom.minicompat import EmptyNodeList, defproperty from polyglot.builtins import unicode_type +from . import grammar +from .attrconverters import AttrConverters +from .namespaces import nsdict + # The following code is pasted form xml.sax.saxutils # Tt makes it possible to run the code without the xml sax package installed # To make it possible to have in your text elements, it is necessary to escape the texts diff --git a/src/odf/elementtypes.py b/src/odf/elementtypes.py index bb7c7fac1c..5eaee93cb1 100644 --- a/src/odf/elementtypes.py +++ b/src/odf/elementtypes.py @@ -20,8 +20,21 @@ from .namespaces import ( - ANIMNS, CHARTNS, DR3DNS, DRAWNS, FORMNS, MANIFESTNS, METANS, NUMBERNS, OFFICENS, - PRESENTATIONNS, SCRIPTNS, STYLENS, SVGNS, TABLENS, TEXTNS + ANIMNS, + CHARTNS, + DR3DNS, + DRAWNS, + FORMNS, + MANIFESTNS, + METANS, + NUMBERNS, + OFFICENS, + PRESENTATIONNS, + SCRIPTNS, + STYLENS, + SVGNS, + TABLENS, + TEXTNS, ) # Inline element don't cause a box diff --git a/src/odf/form.py b/src/odf/form.py index 1980e522ed..275dac0fc7 100644 --- a/src/odf/form.py +++ b/src/odf/form.py @@ -18,8 +18,8 @@ # -from .namespaces import FORMNS from .element import Element +from .namespaces import FORMNS # Autogenerated diff --git a/src/odf/grammar.py b/src/odf/grammar.py index e8ac805106..44584a5f76 100644 --- a/src/odf/grammar.py +++ b/src/odf/grammar.py @@ -24,9 +24,28 @@ To be used for validation check in the API """ from .namespaces import ( - ANIMNS, CHARTNS, CONFIGNS, DCNS, DR3DNS, DRAWNS, FORMNS, MANIFESTNS, MATHNS, - METANS, NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, STYLENS, SVGNS, TABLENS, - TEXTNS, XFORMSNS, XLINKNS, SMILNS, FONS + ANIMNS, + CHARTNS, + CONFIGNS, + DCNS, + DR3DNS, + DRAWNS, + FONS, + FORMNS, + MANIFESTNS, + MATHNS, + METANS, + NUMBERNS, + OFFICENS, + PRESENTATIONNS, + SCRIPTNS, + SMILNS, + STYLENS, + SVGNS, + TABLENS, + TEXTNS, + XFORMSNS, + XLINKNS, ) # The following code is generated from the RelaxNG schema with this notice: diff --git a/src/odf/load.py b/src/odf/load.py index a7b192debf..42b3e1793a 100644 --- a/src/odf/load.py +++ b/src/odf/load.py @@ -25,6 +25,7 @@ from xml.sax import handler + from .element import Element from .namespaces import OFFICENS diff --git a/src/odf/manifest.py b/src/odf/manifest.py index b3386478c4..4765fb9b75 100644 --- a/src/odf/manifest.py +++ b/src/odf/manifest.py @@ -20,8 +20,8 @@ # -from .namespaces import MANIFESTNS from .element import Element +from .namespaces import MANIFESTNS # Autogenerated diff --git a/src/odf/math.py b/src/odf/math.py index 93362754f1..08245b3ccf 100644 --- a/src/odf/math.py +++ b/src/odf/math.py @@ -18,8 +18,8 @@ # -from .namespaces import MATHNS from .element import Element +from .namespaces import MATHNS # ODF 1.0 section 12.5 # Mathematical content is represented by MathML 2.0 diff --git a/src/odf/meta.py b/src/odf/meta.py index da49c499bd..89e500c7a5 100644 --- a/src/odf/meta.py +++ b/src/odf/meta.py @@ -18,8 +18,8 @@ # -from .namespaces import METANS from .element import Element +from .namespaces import METANS # Autogenerated diff --git a/src/odf/number.py b/src/odf/number.py index df157d7319..ed2c517d04 100644 --- a/src/odf/number.py +++ b/src/odf/number.py @@ -18,8 +18,8 @@ # -from .namespaces import NUMBERNS from .element import Element +from .namespaces import NUMBERNS from .style import StyleElement diff --git a/src/odf/odf2moinmoin.py b/src/odf/odf2moinmoin.py index ca6f699531..83ce1e71a0 100644 --- a/src/odf/odf2moinmoin.py +++ b/src/odf/odf2moinmoin.py @@ -20,11 +20,14 @@ # -import zipfile, xml.dom.minidom -from .namespaces import nsdict -from .elementtypes import empty_elements, inline_elements +import xml.dom.minidom +import zipfile + from polyglot.builtins import unicode_type +from .elementtypes import empty_elements, inline_elements +from .namespaces import nsdict + IGNORED_TAGS = [ 'draw:a' 'draw:g', diff --git a/src/odf/odf2xhtml.py b/src/odf/odf2xhtml.py index 92f0066664..d889e02f88 100644 --- a/src/odf/odf2xhtml.py +++ b/src/odf/odf2xhtml.py @@ -21,17 +21,36 @@ # pdb.set_trace() from collections import defaultdict +from xml.dom import Node from xml.sax import handler from xml.sax.saxutils import escape, quoteattr -from xml.dom import Node -from .opendocument import load - -from .namespaces import ANIMNS, CHARTNS, CONFIGNS, DCNS, DR3DNS, DRAWNS, FONS, \ - FORMNS, MATHNS, METANS, NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, \ - SMILNS, STYLENS, SVGNS, TABLENS, TEXTNS, XLINKNS from polyglot.builtins import unicode_type +from .namespaces import ( + ANIMNS, + CHARTNS, + CONFIGNS, + DCNS, + DR3DNS, + DRAWNS, + FONS, + FORMNS, + MATHNS, + METANS, + NUMBERNS, + OFFICENS, + PRESENTATIONNS, + SCRIPTNS, + SMILNS, + STYLENS, + SVGNS, + TABLENS, + TEXTNS, + XLINKNS, +) +from .opendocument import load + if False: # Added by Kovid DR3DNS, MATHNS, CHARTNS, CONFIGNS, ANIMNS, FORMNS, SMILNS, SCRIPTNS diff --git a/src/odf/odfmanifest.py b/src/odf/odfmanifest.py index 403ed52b52..14986e5c67 100644 --- a/src/odf/odfmanifest.py +++ b/src/odf/odfmanifest.py @@ -20,10 +20,10 @@ # This script lists the content of the manifest.xml file -import zipfile -from xml.sax import make_parser,handler -from xml.sax.xmlreader import InputSource import io +import zipfile +from xml.sax import handler, make_parser +from xml.sax.xmlreader import InputSource MANIFESTNS="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" diff --git a/src/odf/office.py b/src/odf/office.py index 99385a3d07..41a9330404 100644 --- a/src/odf/office.py +++ b/src/odf/office.py @@ -18,9 +18,9 @@ # -from .namespaces import OFFICENS -from .element import Element from .draw import StyleRefElement +from .element import Element +from .namespaces import OFFICENS # Autogenerated diff --git a/src/odf/opendocument.py b/src/odf/opendocument.py index 25f711cd56..3bf3a4f25c 100644 --- a/src/odf/opendocument.py +++ b/src/odf/opendocument.py @@ -27,20 +27,33 @@ import zipfile from io import BytesIO from xml.sax.xmlreader import InputSource -from polyglot.io import PolyglotBytesIO, PolyglotStringIO from polyglot.builtins import unicode_type +from polyglot.io import PolyglotBytesIO, PolyglotStringIO from . import element, manifest, meta from .attrconverters import make_NCName -from .namespaces import ( - CHARTNS, DRAWNS, METANS, OFFICENS, PRESENTATIONNS, STYLENS, TABLENS, TEXTNS, - TOOLSVERSION -) +from .namespaces import CHARTNS, DRAWNS, METANS, OFFICENS, PRESENTATIONNS, STYLENS, TABLENS, TEXTNS, TOOLSVERSION from .odfmanifest import manifestlist from .office import ( - AutomaticStyles, Body, Chart, Document, DocumentContent, DocumentMeta, - DocumentSettings, DocumentStyles, Drawing, FontFaceDecls, Image, MasterStyles, - Meta, Presentation, Scripts, Settings, Spreadsheet, Styles, Text + AutomaticStyles, + Body, + Chart, + Document, + DocumentContent, + DocumentMeta, + DocumentSettings, + DocumentStyles, + Drawing, + FontFaceDecls, + Image, + MasterStyles, + Meta, + Presentation, + Scripts, + Settings, + Spreadsheet, + Styles, + Text, ) __version__= TOOLSVERSION @@ -607,8 +620,9 @@ def OpenDocumentTextMaster(): def __loadxmlparts(z, manifest, doc, objectpath): + from xml.sax import handler, make_parser + from .load import LoadParser - from xml.sax import make_parser, handler for xmlfile in (objectpath+'settings.xml', objectpath+'meta.xml', objectpath+'content.xml', objectpath+'styles.xml'): if xmlfile not in manifest: diff --git a/src/odf/presentation.py b/src/odf/presentation.py index 287a1d434b..44f6c0b0fe 100644 --- a/src/odf/presentation.py +++ b/src/odf/presentation.py @@ -18,8 +18,8 @@ # -from .namespaces import PRESENTATIONNS from .element import Element +from .namespaces import PRESENTATIONNS # ODF 1.0 section 9.6 and 9.7 # Autogenerated diff --git a/src/odf/script.py b/src/odf/script.py index d49cfb571f..113a413dad 100644 --- a/src/odf/script.py +++ b/src/odf/script.py @@ -18,8 +18,8 @@ # -from .namespaces import SCRIPTNS from .element import Element +from .namespaces import SCRIPTNS # ODF 1.0 section 12.4.1 # The element binds an event to a macro. diff --git a/src/odf/style.py b/src/odf/style.py index 3c1c97ef01..d9a2640642 100644 --- a/src/odf/style.py +++ b/src/odf/style.py @@ -18,8 +18,8 @@ # -from .namespaces import STYLENS from .element import Element +from .namespaces import STYLENS def StyleElement(**args): diff --git a/src/odf/svg.py b/src/odf/svg.py index d4bf3f87c7..3017b4ac08 100644 --- a/src/odf/svg.py +++ b/src/odf/svg.py @@ -18,9 +18,9 @@ # -from .namespaces import SVGNS -from .element import Element from .draw import DrawElement +from .element import Element +from .namespaces import SVGNS # Autogenerated diff --git a/src/odf/table.py b/src/odf/table.py index 5bd8125fbc..6afb1f676d 100644 --- a/src/odf/table.py +++ b/src/odf/table.py @@ -18,8 +18,8 @@ # -from .namespaces import TABLENS from .element import Element +from .namespaces import TABLENS # Autogenerated diff --git a/src/odf/teletype.py b/src/odf/teletype.py index 154874c97d..0384bc734b 100644 --- a/src/odf/teletype.py +++ b/src/odf/teletype.py @@ -28,7 +28,7 @@ elements. This module takes care of that problem. from .element import Node -from .text import S,LineBreak,Tab +from .text import LineBreak, S, Tab class WhitespaceText: diff --git a/src/odf/text.py b/src/odf/text.py index 10d7f8a304..38c12c103e 100644 --- a/src/odf/text.py +++ b/src/odf/text.py @@ -18,8 +18,8 @@ # -from .namespaces import TEXTNS from .element import Element +from .namespaces import TEXTNS from .style import StyleElement # Autogenerated diff --git a/src/odf/userfield.py b/src/odf/userfield.py index 83927e4feb..d9013e973b 100644 --- a/src/odf/userfield.py +++ b/src/odf/userfield.py @@ -24,9 +24,9 @@ import sys import zipfile -from odf.text import UserFieldDecl from odf.namespaces import OFFICENS from odf.opendocument import load +from odf.text import UserFieldDecl OUTENCODING = "utf-8" diff --git a/src/odf/xforms.py b/src/odf/xforms.py index c5b16bb9b9..4baee3a315 100644 --- a/src/odf/xforms.py +++ b/src/odf/xforms.py @@ -18,8 +18,8 @@ # -from .namespaces import XFORMSNS from .element import Element +from .namespaces import XFORMSNS # ODF 1.0 section 11.2 # XForms is designed to be embedded in another XML format. diff --git a/src/polyglot/html_entities.py b/src/polyglot/html_entities.py index c396e54615..1b82ebc9f1 100644 --- a/src/polyglot/html_entities.py +++ b/src/polyglot/html_entities.py @@ -3,4 +3,5 @@ # License: GPL v3 Copyright: 2019, Eli Schwartz from html.entities import name2codepoint + name2codepoint diff --git a/src/polyglot/http_client.py b/src/polyglot/http_client.py index ebd2e6b868..c79366c97a 100644 --- a/src/polyglot/http_client.py +++ b/src/polyglot/http_client.py @@ -2,13 +2,35 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2019, Eli Schwartz -from http.client import (responses, HTTPConnection, HTTPSConnection, - BAD_REQUEST, FOUND, FORBIDDEN, HTTP_VERSION_NOT_SUPPORTED, - INTERNAL_SERVER_ERROR, METHOD_NOT_ALLOWED, MOVED_PERMANENTLY, - NOT_FOUND, NOT_IMPLEMENTED, NOT_MODIFIED, OK, PARTIAL_CONTENT, - PRECONDITION_FAILED, REQUEST_ENTITY_TOO_LARGE, REQUEST_URI_TOO_LONG, - REQUESTED_RANGE_NOT_SATISFIABLE, REQUEST_TIMEOUT, SEE_OTHER, - SERVICE_UNAVAILABLE, UNAUTHORIZED, _CS_IDLE, _CS_REQ_SENT, PRECONDITION_REQUIRED, UNPROCESSABLE_ENTITY) +from http.client import ( + _CS_IDLE, + _CS_REQ_SENT, + BAD_REQUEST, + FORBIDDEN, + FOUND, + HTTP_VERSION_NOT_SUPPORTED, + INTERNAL_SERVER_ERROR, + METHOD_NOT_ALLOWED, + MOVED_PERMANENTLY, + NOT_FOUND, + NOT_IMPLEMENTED, + NOT_MODIFIED, + OK, + PARTIAL_CONTENT, + PRECONDITION_FAILED, + PRECONDITION_REQUIRED, + REQUEST_ENTITY_TOO_LARGE, + REQUEST_TIMEOUT, + REQUEST_URI_TOO_LONG, + REQUESTED_RANGE_NOT_SATISFIABLE, + SEE_OTHER, + SERVICE_UNAVAILABLE, + UNAUTHORIZED, + UNPROCESSABLE_ENTITY, + HTTPConnection, + HTTPSConnection, + responses, +) if False: responses, HTTPConnection, HTTPSConnection, BAD_REQUEST, FOUND, FORBIDDEN, HTTP_VERSION_NOT_SUPPORTED, INTERNAL_SERVER_ERROR, METHOD_NOT_ALLOWED diff --git a/src/polyglot/io.py b/src/polyglot/io.py index 443d4a93ce..44f38a68e7 100644 --- a/src/polyglot/io.py +++ b/src/polyglot/io.py @@ -3,7 +3,7 @@ # License: GPL v3 Copyright: 2019, Kovid Goyal -from io import StringIO, BytesIO +from io import BytesIO, StringIO class PolyglotStringIO(StringIO): diff --git a/src/polyglot/reprlib.py b/src/polyglot/reprlib.py index d3e5869d7b..56a7f48207 100644 --- a/src/polyglot/reprlib.py +++ b/src/polyglot/reprlib.py @@ -3,4 +3,5 @@ # License: GPL v3 Copyright: 2019, Eli Schwartz from reprlib import repr + repr diff --git a/src/qt/core.py b/src/qt/core.py index ac1ad67a3f..9e6914c8a4 100644 --- a/src/qt/core.py +++ b/src/qt/core.py @@ -3,8 +3,8 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal +from .core_name_map import module_names, name_map from .loader import dynamic_load -from .core_name_map import name_map, module_names already_imported = {} qt_modules = {} diff --git a/src/qt/core.pyi b/src/qt/core.pyi index c2682e08f8..fbac6b66d9 100644 --- a/src/qt/core.pyi +++ b/src/qt/core.pyi @@ -1,5 +1,6 @@ # autogenerated by __main__.py do not edit import PyQt6.QtCore + PYQT_VERSION = PyQt6.QtCore.PYQT_VERSION PYQT_VERSION_STR = PyQt6.QtCore.PYQT_VERSION_STR QAbstractAnimation = PyQt6.QtCore.QAbstractAnimation @@ -213,6 +214,7 @@ qUnregisterResourceData = PyQt6.QtCore.qUnregisterResourceData qVersion = PyQt6.QtCore.qVersion qWarning = PyQt6.QtCore.qWarning import PyQt6.QtGui + QAbstractFileIconProvider = PyQt6.QtGui.QAbstractFileIconProvider QAbstractTextDocumentLayout = PyQt6.QtGui.QAbstractTextDocumentLayout QAction = PyQt6.QtGui.QAction @@ -396,6 +398,7 @@ qRgba64 = PyQt6.QtGui.qRgba64 qUnpremultiply = PyQt6.QtGui.qUnpremultiply qt_set_sequence_auto_mnemonic = PyQt6.QtGui.qt_set_sequence_auto_mnemonic import PyQt6.QtWidgets + QAbstractButton = PyQt6.QtWidgets.QAbstractButton QAbstractGraphicsShapeItem = PyQt6.QtWidgets.QAbstractGraphicsShapeItem QAbstractItemDelegate = PyQt6.QtWidgets.QAbstractItemDelegate @@ -589,6 +592,7 @@ qDrawShadeRect = PyQt6.QtWidgets.qDrawShadeRect qDrawWinButton = PyQt6.QtWidgets.qDrawWinButton qDrawWinPanel = PyQt6.QtWidgets.qDrawWinPanel import PyQt6.QtNetwork + QAbstractNetworkCache = PyQt6.QtNetwork.QAbstractNetworkCache QAbstractSocket = PyQt6.QtNetwork.QAbstractSocket QAuthenticator = PyQt6.QtNetwork.QAuthenticator @@ -639,9 +643,11 @@ QTcpServer = PyQt6.QtNetwork.QTcpServer QTcpSocket = PyQt6.QtNetwork.QTcpSocket QUdpSocket = PyQt6.QtNetwork.QUdpSocket import PyQt6.QtSvg + QSvgGenerator = PyQt6.QtSvg.QSvgGenerator QSvgRenderer = PyQt6.QtSvg.QSvgRenderer import PyQt6.QtPrintSupport + QAbstractPrintDialog = PyQt6.QtPrintSupport.QAbstractPrintDialog QPageSetupDialog = PyQt6.QtPrintSupport.QPageSetupDialog QPrintDialog = PyQt6.QtPrintSupport.QPrintDialog @@ -651,6 +657,7 @@ QPrintPreviewWidget = PyQt6.QtPrintSupport.QPrintPreviewWidget QPrinter = PyQt6.QtPrintSupport.QPrinter QPrinterInfo = PyQt6.QtPrintSupport.QPrinterInfo import PyQt6.QtOpenGL + QAbstractOpenGLFunctions = PyQt6.QtOpenGL.QAbstractOpenGLFunctions QOpenGLBuffer = PyQt6.QtOpenGL.QOpenGLBuffer QOpenGLDebugLogger = PyQt6.QtOpenGL.QOpenGLDebugLogger @@ -673,8 +680,10 @@ QOpenGLVersionProfile = PyQt6.QtOpenGL.QOpenGLVersionProfile QOpenGLVertexArrayObject = PyQt6.QtOpenGL.QOpenGLVertexArrayObject QOpenGLWindow = PyQt6.QtOpenGL.QOpenGLWindow import PyQt6.QtOpenGLWidgets + QOpenGLWidget = PyQt6.QtOpenGLWidgets.QOpenGLWidget import PyQt6.QtQuick + QNativeInterface = PyQt6.QtQuick.QNativeInterface QQuickAsyncImageProvider = PyQt6.QtQuick.QQuickAsyncImageProvider QQuickCloseEvent = PyQt6.QtQuick.QQuickCloseEvent diff --git a/src/qt/dbus.py b/src/qt/dbus.py index 3fb3f5dc3a..a00a6838c7 100644 --- a/src/qt/dbus.py +++ b/src/qt/dbus.py @@ -3,8 +3,8 @@ # License: GPL v3 Copyright: 2021, Kovid Goyal +from .dbus_name_map import module_names, name_map from .loader import dynamic_load -from .dbus_name_map import name_map, module_names already_imported = {} qt_modules = {} diff --git a/src/qt/dbus.pyi b/src/qt/dbus.pyi index f289d8c3b4..5b4abd0488 100644 --- a/src/qt/dbus.pyi +++ b/src/qt/dbus.pyi @@ -1,5 +1,6 @@ # autogenerated by __main__.py do not edit import PyQt6.QtDBus + QDBus = PyQt6.QtDBus.QDBus QDBusAbstractAdaptor = PyQt6.QtDBus.QDBusAbstractAdaptor QDBusAbstractInterface = PyQt6.QtDBus.QDBusAbstractInterface diff --git a/src/qt/loader.py b/src/qt/loader.py index 286625390c..49a210babe 100644 --- a/src/qt/loader.py +++ b/src/qt/loader.py @@ -2,8 +2,8 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2021, Kovid Goyal -from importlib import import_module import sys +from importlib import import_module def dynamic_load(name, name_map, already_imported, qt_modules, module_names=()): diff --git a/src/qt/webengine.py b/src/qt/webengine.py index c1bb7d2175..a6966515b6 100644 --- a/src/qt/webengine.py +++ b/src/qt/webengine.py @@ -4,7 +4,7 @@ from .loader import dynamic_load -from .webengine_name_map import name_map, module_names +from .webengine_name_map import module_names, name_map already_imported = {} qt_modules = {} diff --git a/src/qt/webengine.pyi b/src/qt/webengine.pyi index 0a5067b82c..61f2aeb387 100644 --- a/src/qt/webengine.pyi +++ b/src/qt/webengine.pyi @@ -1,5 +1,6 @@ # autogenerated by __main__.py do not edit import PyQt6.QtWebEngineCore + PYQT_WEBENGINE_VERSION = PyQt6.QtWebEngineCore.PYQT_WEBENGINE_VERSION PYQT_WEBENGINE_VERSION_STR = PyQt6.QtWebEngineCore.PYQT_WEBENGINE_VERSION_STR QWebEngineCertificateError = PyQt6.QtWebEngineCore.QWebEngineCertificateError @@ -34,4 +35,5 @@ qWebEngineChromiumSecurityPatchVersion = PyQt6.QtWebEngineCore.qWebEngineChromiu qWebEngineChromiumVersion = PyQt6.QtWebEngineCore.qWebEngineChromiumVersion qWebEngineVersion = PyQt6.QtWebEngineCore.qWebEngineVersion import PyQt6.QtWebEngineWidgets + QWebEngineView = PyQt6.QtWebEngineWidgets.QWebEngineView \ No newline at end of file diff --git a/src/templite/__init__.py b/src/templite/__init__.py index f46e777f82..da5c72a6ed 100644 --- a/src/templite/__init__.py +++ b/src/templite/__init__.py @@ -25,10 +25,12 @@ # MA 02110-1301, USA. # -import sys, re +import re +import sys from polyglot.builtins import unicode_type + class Templite: auto_emit = re.compile('(^[\'\"])|(^[a-zA-Z0-9_\[\]\'\"]+$)') diff --git a/src/tinycss/__init__.py b/src/tinycss/__init__.py index 73451baf94..176a9ff8e5 100644 --- a/src/tinycss/__init__.py +++ b/src/tinycss/__init__.py @@ -10,13 +10,13 @@ """ from .version import VERSION + __version__ = VERSION from tinycss.css21 import CSS21Parser -from tinycss.page3 import CSSPage3Parser from tinycss.fonts3 import CSSFonts3Parser from tinycss.media3 import CSSMedia3Parser - +from tinycss.page3 import CSSPage3Parser PARSER_MODULES = { 'page3': CSSPage3Parser, diff --git a/src/tinycss/css21.py b/src/tinycss/css21.py index 1ccd45cde0..d48953fb85 100644 --- a/src/tinycss/css21.py +++ b/src/tinycss/css21.py @@ -14,12 +14,9 @@ from itertools import chain, islice from tinycss.decoding import decode +from tinycss.parsing import ParseError, remove_whitespace, split_on_comma, strip_whitespace, validate_any, validate_value from tinycss.token_data import TokenList from tinycss.tokenizer import tokenize_grouped -from tinycss.parsing import ( - strip_whitespace, remove_whitespace, split_on_comma, validate_value, - validate_any, ParseError) - # stylesheet : [ CDO | CDC | S | statement ]*; # statement : ruleset | at-rule; diff --git a/src/tinycss/decoding.py b/src/tinycss/decoding.py index 79717ff034..bdad7392d0 100644 --- a/src/tinycss/decoding.py +++ b/src/tinycss/decoding.py @@ -16,7 +16,6 @@ import re from polyglot.binary import from_hex_bytes - __all__ = ['decode'] # Everything else is implementation detail diff --git a/src/tinycss/fonts3.py b/src/tinycss/fonts3.py index f592a66730..bb43c5e5e0 100644 --- a/src/tinycss/fonts3.py +++ b/src/tinycss/fonts3.py @@ -7,7 +7,9 @@ __copyright__ = '2014, Kovid Goyal ' import re + from tinycss.css21 import CSS21Parser, ParseError + from .tokenizer import tokenize_grouped diff --git a/src/tinycss/media3.py b/src/tinycss/media3.py index ee1f6a0a40..de18a3cd07 100644 --- a/src/tinycss/media3.py +++ b/src/tinycss/media3.py @@ -5,9 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -from tinycss.css21 import CSS21Parser -from tinycss.parsing import remove_whitespace, split_on_comma, ParseError from polyglot.builtins import error_message +from tinycss.css21 import CSS21Parser +from tinycss.parsing import ParseError, remove_whitespace, split_on_comma class MediaQuery: diff --git a/src/tinycss/tests/color3.py b/src/tinycss/tests/color3.py index 81bc669dc1..05ff9f485e 100644 --- a/src/tinycss/tests/color3.py +++ b/src/tinycss/tests/color3.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -from tinycss.color3 import parse_color_string, hsl_to_rgb +from tinycss.color3 import hsl_to_rgb, parse_color_string from tinycss.tests import BaseTest diff --git a/src/tinycss/tests/css21.py b/src/tinycss/tests/css21.py index a570b26fcf..fd083e3b03 100644 --- a/src/tinycss/tests/css21.py +++ b/src/tinycss/tests/css21.py @@ -10,8 +10,9 @@ import os import tempfile from tinycss.css21 import CSS21Parser -from tinycss.tests.tokenizing import jsonify from tinycss.tests import BaseTest +from tinycss.tests.tokenizing import jsonify + class CoreParser(CSS21Parser): """A parser that always accepts unparsed at-rules.""" diff --git a/src/tinycss/tests/decoding.py b/src/tinycss/tests/decoding.py index 3ae4e5e156..79a1017994 100644 --- a/src/tinycss/tests/decoding.py +++ b/src/tinycss/tests/decoding.py @@ -8,6 +8,7 @@ __copyright__ = '2014, Kovid Goyal ' from tinycss.decoding import decode from tinycss.tests import BaseTest + def params(css, encoding, use_bom=False, expect_error=False, **kwargs): """Nicer syntax to make a tuple.""" return css, encoding, use_bom, expect_error, kwargs diff --git a/src/tinycss/tests/fonts3.py b/src/tinycss/tests/fonts3.py index 8f220c961f..a59429deca 100644 --- a/src/tinycss/tests/fonts3.py +++ b/src/tinycss/tests/fonts3.py @@ -5,10 +5,9 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -from tinycss.fonts3 import CSSFonts3Parser, parse_font_family, parse_font, serialize_font -from tinycss.tests import BaseTest - from polyglot.builtins import iteritems +from tinycss.fonts3 import CSSFonts3Parser, parse_font, parse_font_family, serialize_font +from tinycss.tests import BaseTest class TestFonts3(BaseTest): diff --git a/src/tinycss/tests/main.py b/src/tinycss/tests/main.py index 364172080b..3e56cb27df 100644 --- a/src/tinycss/tests/main.py +++ b/src/tinycss/tests/main.py @@ -5,7 +5,8 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -import unittest, argparse +import argparse +import unittest def find_tests(): diff --git a/src/tinycss/tests/media3.py b/src/tinycss/tests/media3.py index af200f2492..92572c9cb4 100644 --- a/src/tinycss/tests/media3.py +++ b/src/tinycss/tests/media3.py @@ -5,9 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' -from tinycss.media3 import CSSMedia3Parser, MediaQuery as MQ +from tinycss.media3 import CSSMedia3Parser +from tinycss.media3 import MediaQuery as MQ from tinycss.tests import BaseTest, jsonify + def jsonify_expr(e): if e is None: return None diff --git a/src/tinycss/tests/page3.py b/src/tinycss/tests/page3.py index 2387445a67..318ceb6bb7 100644 --- a/src/tinycss/tests/page3.py +++ b/src/tinycss/tests/page3.py @@ -8,6 +8,7 @@ __copyright__ = '2014, Kovid Goyal ' from tinycss.page3 import CSSPage3Parser from tinycss.tests import BaseTest + class TestPage3(BaseTest): def test_selectors(self): diff --git a/src/tinycss/tests/tokenizing.py b/src/tinycss/tests/tokenizing.py index f9d6e8bbb5..de91735c54 100644 --- a/src/tinycss/tests/tokenizing.py +++ b/src/tinycss/tests/tokenizing.py @@ -6,7 +6,7 @@ __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal ' from tinycss.tests import BaseTest, jsonify -from tinycss.tokenizer import python_tokenize_flat, c_tokenize_flat, regroup +from tinycss.tokenizer import c_tokenize_flat, python_tokenize_flat, regroup if c_tokenize_flat is None: tokenizers = (python_tokenize_flat,) diff --git a/src/tinycss/token_data.py b/src/tinycss/token_data.py index 5b78f49e88..30f6b9d72a 100644 --- a/src/tinycss/token_data.py +++ b/src/tinycss/token_data.py @@ -10,12 +10,11 @@ """ -import re -import sys -import operator import functools +import operator +import re import string - +import sys # * Raw strings with the r'' notation are used so that \ do not need # to be escaped.