| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | """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 | 
					
						
							| 
									
										
										
										
											2011-11-06 06:54:05 +01:00
										 |  |  |             build = self.reinitialize_command('build') | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |             self.run_command('build') | 
					
						
							|  |  |  |             sys.path.insert(0, build.build_lib) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-15 11:43:20 +01:00
										 |  |  |             # XXX maybe we could pass the verbose argument of pysetup here | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |             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 |