"""Run the project's test suite.""" import os import sys import logging import unittest from packaging import logger from packaging.command.cmd import Command from packaging.database import get_distribution from packaging.errors import PackagingOptionError from packaging.util import resolve_name class test(Command): description = "run the project's test suite" user_options = [ ('suite=', 's', "test suite to run (for example: 'some_module.test_suite')"), ('runner=', None, "test runner to be called."), ('tests-require=', None, "list of distributions required to run the test suite."), ] def initialize_options(self): self.suite = None self.runner = None self.tests_require = [] def finalize_options(self): self.build_lib = self.get_finalized_command("build").build_lib for requirement in self.tests_require: if get_distribution(requirement) is None: logger.warning("test dependency %s is not installed, " "tests may fail", requirement) if (not self.suite and not self.runner and self.get_ut_with_discovery() is None): raise PackagingOptionError( "no test discovery available, please give a 'suite' or " "'runner' option or install unittest2") def get_ut_with_discovery(self): if hasattr(unittest.TestLoader, "discover"): return unittest else: try: import unittest2 return unittest2 except ImportError: return None def run(self): prev_syspath = sys.path[:] try: # build release build = self.reinitialize_command('build') self.run_command('build') sys.path.insert(0, build.build_lib) # XXX maybe we could pass the verbose argument of pysetup here logger = logging.getLogger('packaging') verbose = logger.getEffectiveLevel() >= logging.DEBUG verbosity = verbose + 1 # run the tests if self.runner: resolve_name(self.runner)() elif self.suite: runner = unittest.TextTestRunner(verbosity=verbosity) runner.run(resolve_name(self.suite)()) elif self.get_ut_with_discovery(): ut = self.get_ut_with_discovery() test_suite = ut.TestLoader().discover(os.curdir) runner = ut.TextTestRunner(verbosity=verbosity) runner.run(test_suite) finally: sys.path[:] = prev_syspath