mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-07 07:34:31 -04:00
159 lines
6.5 KiB
Python
159 lines
6.5 KiB
Python
#!/usr/bin/env python2
|
|
# vim:fileencoding=utf-8
|
|
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
|
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
|
|
import os
|
|
import unittest
|
|
|
|
from setup import Command, islinux, isosx, iswindows, SRC
|
|
|
|
TEST_MODULES = frozenset('srv db polish opf css docx cfi matcher icu smartypants build misc dbcli ebooks'.split())
|
|
|
|
|
|
class TestImports(unittest.TestCase):
|
|
|
|
def base_check(self, base, exclude_packages, exclude_modules):
|
|
import importlib
|
|
import_base = os.path.dirname(base)
|
|
count = 0
|
|
for root, dirs, files in os.walk(base):
|
|
for d in tuple(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
|
|
return count
|
|
|
|
def test_import_of_all_python_modules(self):
|
|
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')
|
|
self.assertGreater(self.base_check(os.path.join(SRC, 'odf'), exclude_packages, exclude_modules), 10)
|
|
base = os.path.join(SRC, 'calibre')
|
|
self.assertGreater(self.base_check(base, exclude_packages, exclude_modules), 1000)
|
|
|
|
|
|
def find_tests(which_tests=None):
|
|
ans = []
|
|
a = ans.append
|
|
|
|
def ok(x):
|
|
return not which_tests or x in which_tests
|
|
|
|
if ok('build'):
|
|
from calibre.test_build import find_tests
|
|
a(find_tests())
|
|
if ok('srv'):
|
|
from calibre.srv.tests.main import find_tests
|
|
a(find_tests())
|
|
if ok('db'):
|
|
from calibre.db.tests.main import find_tests
|
|
a(find_tests())
|
|
if ok('polish'):
|
|
from calibre.ebooks.oeb.polish.tests.main import find_tests
|
|
a(find_tests())
|
|
if ok('opf'):
|
|
from calibre.ebooks.metadata.opf2 import suite
|
|
a(suite())
|
|
from calibre.ebooks.metadata.opf3_test import suite
|
|
a(suite())
|
|
if ok('css'):
|
|
from tinycss.tests.main import find_tests
|
|
a(find_tests())
|
|
from calibre.ebooks.oeb.normalize_css import test_normalization
|
|
a(test_normalization(return_tests=True))
|
|
from calibre.ebooks.css_transform_rules import test
|
|
a(test(return_tests=True))
|
|
from css_selectors.tests import find_tests
|
|
a(find_tests())
|
|
if ok('docx'):
|
|
from calibre.ebooks.docx.fields import test_parse_fields
|
|
a(test_parse_fields(return_tests=True))
|
|
from calibre.ebooks.docx.writer.utils import test_convert_color
|
|
a(test_convert_color(return_tests=True))
|
|
if ok('cfi'):
|
|
from calibre.ebooks.epub.cfi.tests import find_tests
|
|
a(find_tests())
|
|
if ok('matcher'):
|
|
from calibre.utils.matcher import test
|
|
a(test(return_tests=True))
|
|
if ok('icu'):
|
|
from calibre.utils.icu_test import find_tests
|
|
a(find_tests())
|
|
if ok('smartypants'):
|
|
from calibre.utils.smartypants import run_tests
|
|
a(run_tests(return_tests=True))
|
|
if ok('ebooks'):
|
|
from calibre.ebooks.metadata.rtf import find_tests
|
|
a(find_tests())
|
|
if ok('misc'):
|
|
from calibre.ebooks.metadata.tag_mapper import find_tests
|
|
a(find_tests())
|
|
from calibre.ebooks.metadata.author_mapper import find_tests
|
|
a(find_tests())
|
|
from calibre.utils.shared_file import find_tests
|
|
a(find_tests())
|
|
from calibre.utils.test_lock import find_tests
|
|
a(find_tests())
|
|
from calibre.utils.search_query_parser_test import find_tests
|
|
a(find_tests())
|
|
from calibre.utils.html2text import find_tests
|
|
a(find_tests())
|
|
from calibre.library.comments import find_tests
|
|
a(find_tests())
|
|
from calibre.ebooks.compression.palmdoc 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())
|
|
|
|
tests = unittest.TestSuite(ans)
|
|
return tests
|
|
|
|
|
|
class Test(Command):
|
|
|
|
description = 'Run the calibre test suite'
|
|
|
|
def add_options(self, parser):
|
|
parser.add_option('--test-module', '--test-group', default=[], action='append', type='choice', choices=sorted(map(str, TEST_MODULES)),
|
|
help='The test module to run (can be specified more than once for multiple modules). Choices: %s' % ', '.join(sorted(TEST_MODULES)))
|
|
parser.add_option('--test-verbosity', type=int, default=4, help='Test verbosity (0-4)')
|
|
parser.add_option('--test-name', default=[], action='append',
|
|
help='The name of an individual test to run. Can be specified more than once for multiple tests. The name of the'
|
|
' test is the name of the test function without the leading test_. For example, the function test_something()'
|
|
' can be run by specifying the name "something".')
|
|
|
|
def run(self, opts):
|
|
from calibre.utils.run_tests import run_cli, filter_tests_by_name
|
|
tests = find_tests(which_tests=frozenset(opts.test_module))
|
|
if opts.test_name:
|
|
tests = filter_tests_by_name(tests, *opts.test_name)
|
|
run_cli(tests, verbosity=opts.test_verbosity)
|