From c33768b35ed1bd044f9035310b672f797125847c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 31 Mar 2019 09:31:38 +0530 Subject: [PATCH] Move the python imports test out of the build test module The build test is designed to run with frozen calibre, where the source files may not be available. So run it only as part of the setup test suite. --- setup/test.py | 49 ++++++++++++++++++++++++++++++++++++--- src/calibre/test_build.py | 38 ------------------------------ 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/setup/test.py b/setup/test.py index 6a85007898..486162b40a 100644 --- a/setup/test.py +++ b/setup/test.py @@ -2,15 +2,57 @@ # vim:fileencoding=utf-8 # License: GPLv3 Copyright: 2016, Kovid Goyal -from __future__ import (unicode_literals, division, absolute_import, - print_function) +from __future__ import absolute_import, division, print_function, unicode_literals + +import os import unittest -from setup import Command +from setup import Command, islinux, isosx, iswindows, SRC TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants build misc dbcli'.split()) +class TestImports(unittest.TestCase): + + def test_import_of_all_python_modules(self): + import importlib + exclude_modules = {'calibre.gui2.dbus_export.demo', 'calibre.gui2.dbus_export.gtk'} + exclude_packages = {'calibre.devices.mtp.unix.upstream'} + if not iswindows: + exclude_modules |= {'calibre.utils.iphlpapi', 'calibre.utils.open_with.windows', 'calibre.devices.winusb'} + exclude_packages |= {'calibre.utils.winreg'} + if not isosx: + exclude_modules.add('calibre.utils.open_with.osx') + if not islinux: + exclude_modules |= { + 'calibre.utils.dbus_service', 'calibre.linux', + 'calibre.utils.linux_trash', 'calibre.utils.open_with.linux', + 'calibre.gui2.linux_file_dialogs' + } + exclude_packages.add('calibre.gui2.dbus_export') + base = os.path.join(SRC, 'calibre') + import_base = os.path.dirname(base) + count = 0 + for root, dirs, files in os.walk(base): + for d in dirs: + if not os.path.isfile(os.path.join(root, d, '__init__.py')): + dirs.remove(d) + for fname in files: + module_name, ext = os.path.splitext(fname) + if ext != '.py': + continue + path = os.path.join(root, module_name) + relpath = os.path.relpath(path, import_base).replace(os.sep, '/') + full_module_name = '.'.join(relpath.split('/')) + if full_module_name.endswith('.__init__'): + full_module_name = full_module_name.rpartition('.')[0] + if full_module_name in exclude_modules or ('.' in full_module_name and full_module_name.rpartition('.')[0] in exclude_packages): + continue + importlib.import_module(full_module_name) + count += 1 + self.assertGreater(count, 1000) + + def find_tests(which_tests=None): ans = [] a = ans.append @@ -76,6 +118,7 @@ def ok(x): a(find_tests()) from calibre.library.comments import find_tests a(find_tests()) + a(unittest.defaultTestLoader.loadTestsFromTestCase(TestImports)) if ok('dbcli'): from calibre.db.cli.tests import find_tests a(find_tests()) diff --git a/src/calibre/test_build.py b/src/calibre/test_build.py index 7ee73a4cc0..2ba6492114 100644 --- a/src/calibre/test_build.py +++ b/src/calibre/test_build.py @@ -73,44 +73,6 @@ def test_html5_parser(self): from html5_parser import parse parse('

xxx') - def test_import_of_all_python_modules(self): - import importlib - exclude_modules = {'calibre.gui2.dbus_export.demo', 'calibre.gui2.dbus_export.gtk'} - exclude_packages = {'calibre.devices.mtp.unix.upstream'} - if not iswindows: - exclude_modules |= {'calibre.utils.iphlpapi', 'calibre.utils.open_with.windows', 'calibre.devices.winusb'} - exclude_packages |= {'calibre.utils.winreg'} - if not isosx: - exclude_modules.add('calibre.utils.open_with.osx') - if not islinux: - exclude_modules |= { - 'calibre.utils.dbus_service', 'calibre.linux', - 'calibre.utils.linux_trash', 'calibre.utils.open_with.linux', - 'calibre.gui2.linux_file_dialogs' - } - exclude_packages.add('calibre.gui2.dbus_export') - base = os.path.dirname(__file__) - import_base = os.path.dirname(base) - count = 0 - for root, dirs, files in os.walk(base): - for d in dirs: - if not os.path.isfile(os.path.join(root, d, '__init__.py')): - dirs.remove(d) - for fname in files: - module_name, ext = os.path.splitext(fname) - if ext != '.py': - continue - path = os.path.join(root, module_name) - relpath = os.path.relpath(path, import_base).replace(os.sep, '/') - full_module_name = '.'.join(relpath.split('/')) - if full_module_name.endswith('.__init__'): - full_module_name = full_module_name.rpartition('.')[0] - if full_module_name in exclude_modules or ('.' in full_module_name and full_module_name.rpartition('.')[0] in exclude_packages): - continue - importlib.import_module(full_module_name) - count += 1 - self.assertGreater(count, 1000) - def test_plugins(self): exclusions = set() if is_ci: