root / env / lib / python2.7 / site-packages / distribute-0.6.19-py2.7.egg / setuptools / command / test.py @ 1a305335
History | View | Annotate | Download (4.99 KB)
1 |
from setuptools import Command |
---|---|
2 |
from distutils.errors import DistutilsOptionError |
3 |
import sys |
4 |
from pkg_resources import * |
5 |
from unittest import TestLoader, main |
6 |
|
7 |
class ScanningLoader(TestLoader): |
8 |
|
9 |
def loadTestsFromModule(self, module): |
10 |
"""Return a suite of all tests cases contained in the given module
|
11 |
|
12 |
If the module is a package, load tests from all the modules in it.
|
13 |
If the module has an ``additional_tests`` function, call it and add
|
14 |
the return value to the tests.
|
15 |
"""
|
16 |
tests = [] |
17 |
if module.__name__!='setuptools.tests.doctest': # ugh |
18 |
tests.append(TestLoader.loadTestsFromModule(self,module))
|
19 |
|
20 |
if hasattr(module, "additional_tests"): |
21 |
tests.append(module.additional_tests()) |
22 |
|
23 |
if hasattr(module, '__path__'): |
24 |
for file in resource_listdir(module.__name__, ''): |
25 |
if file.endswith('.py') and file!='__init__.py': |
26 |
submodule = module.__name__+'.'+file[:-3] |
27 |
else:
|
28 |
if resource_exists(
|
29 |
module.__name__, file+'/__init__.py' |
30 |
): |
31 |
submodule = module.__name__+'.'+file |
32 |
else:
|
33 |
continue
|
34 |
tests.append(self.loadTestsFromName(submodule))
|
35 |
|
36 |
if len(tests)!=1: |
37 |
return self.suiteClass(tests) |
38 |
else:
|
39 |
return tests[0] # don't create a nested suite for only one return |
40 |
|
41 |
|
42 |
class test(Command): |
43 |
|
44 |
"""Command to run unit tests after in-place build"""
|
45 |
|
46 |
description = "run unit tests after in-place build"
|
47 |
|
48 |
user_options = [ |
49 |
('test-module=','m', "Run 'test_suite' in specified module"), |
50 |
('test-suite=','s', |
51 |
"Test suite to run (e.g. 'some_module.test_suite')"),
|
52 |
] |
53 |
|
54 |
def initialize_options(self): |
55 |
self.test_suite = None |
56 |
self.test_module = None |
57 |
self.test_loader = None |
58 |
|
59 |
|
60 |
def finalize_options(self): |
61 |
|
62 |
if self.test_suite is None: |
63 |
if self.test_module is None: |
64 |
self.test_suite = self.distribution.test_suite |
65 |
else:
|
66 |
self.test_suite = self.test_module+".test_suite" |
67 |
elif self.test_module: |
68 |
raise DistutilsOptionError(
|
69 |
"You may specify a module or a suite, but not both"
|
70 |
) |
71 |
|
72 |
self.test_args = [self.test_suite] |
73 |
|
74 |
if self.verbose: |
75 |
self.test_args.insert(0,'--verbose') |
76 |
if self.test_loader is None: |
77 |
self.test_loader = getattr(self.distribution,'test_loader',None) |
78 |
if self.test_loader is None: |
79 |
self.test_loader = "setuptools.command.test:ScanningLoader" |
80 |
|
81 |
|
82 |
|
83 |
def with_project_on_sys_path(self, func): |
84 |
if getattr(self.distribution, 'use_2to3', False): |
85 |
# If we run 2to3 we can not do this inplace:
|
86 |
|
87 |
# Ensure metadata is up-to-date
|
88 |
self.reinitialize_command('build_py', inplace=0) |
89 |
self.run_command('build_py') |
90 |
bpy_cmd = self.get_finalized_command("build_py") |
91 |
build_path = normalize_path(bpy_cmd.build_lib) |
92 |
|
93 |
# Build extensions
|
94 |
self.reinitialize_command('egg_info', egg_base=build_path) |
95 |
self.run_command('egg_info') |
96 |
|
97 |
self.reinitialize_command('build_ext', inplace=0) |
98 |
self.run_command('build_ext') |
99 |
else:
|
100 |
# Without 2to3 inplace works fine:
|
101 |
self.run_command('egg_info') |
102 |
|
103 |
# Build extensions in-place
|
104 |
self.reinitialize_command('build_ext', inplace=1) |
105 |
self.run_command('build_ext') |
106 |
|
107 |
ei_cmd = self.get_finalized_command("egg_info") |
108 |
|
109 |
old_path = sys.path[:] |
110 |
old_modules = sys.modules.copy() |
111 |
|
112 |
try:
|
113 |
sys.path.insert(0, normalize_path(ei_cmd.egg_base))
|
114 |
working_set.__init__() |
115 |
add_activation_listener(lambda dist: dist.activate())
|
116 |
require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version))
|
117 |
func() |
118 |
finally:
|
119 |
sys.path[:] = old_path |
120 |
sys.modules.clear() |
121 |
sys.modules.update(old_modules) |
122 |
working_set.__init__() |
123 |
|
124 |
|
125 |
def run(self): |
126 |
if self.distribution.install_requires: |
127 |
self.distribution.fetch_build_eggs(self.distribution.install_requires) |
128 |
if self.distribution.tests_require: |
129 |
self.distribution.fetch_build_eggs(self.distribution.tests_require) |
130 |
|
131 |
if self.test_suite: |
132 |
cmd = ' '.join(self.test_args) |
133 |
if self.dry_run: |
134 |
self.announce('skipping "unittest %s" (dry run)' % cmd) |
135 |
else:
|
136 |
self.announce('running "unittest %s"' % cmd) |
137 |
self.with_project_on_sys_path(self.run_tests) |
138 |
|
139 |
|
140 |
def run_tests(self): |
141 |
import unittest |
142 |
loader_ep = EntryPoint.parse("x="+self.test_loader) |
143 |
loader_class = loader_ep.load(require=False)
|
144 |
unittest.main( |
145 |
None, None, [unittest.__file__]+self.test_args, |
146 |
testLoader = loader_class() |
147 |
) |
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|