OLD | NEW |
(Empty) | |
| 1 """Tests for the 'setuptools' package""" |
| 2 import sys |
| 3 import os |
| 4 import unittest |
| 5 import doctest |
| 6 import distutils.core |
| 7 import distutils.cmd |
| 8 from distutils.errors import DistutilsOptionError, DistutilsPlatformError |
| 9 from distutils.errors import DistutilsSetupError |
| 10 from distutils.core import Extension |
| 11 from distutils.version import LooseVersion |
| 12 from setuptools.compat import func_code |
| 13 |
| 14 from setuptools.compat import func_code |
| 15 import setuptools.dist |
| 16 import setuptools.depends as dep |
| 17 from setuptools import Feature |
| 18 from setuptools.depends import Require |
| 19 |
| 20 def additional_tests(): |
| 21 suite = unittest.TestSuite(( |
| 22 doctest.DocFileSuite( |
| 23 os.path.join('tests', 'api_tests.txt'), |
| 24 optionflags=doctest.ELLIPSIS, package='pkg_resources', |
| 25 ), |
| 26 )) |
| 27 if sys.platform == 'win32': |
| 28 suite.addTest(doctest.DocFileSuite('win_script_wrapper.txt')) |
| 29 return suite |
| 30 |
| 31 def makeSetup(**args): |
| 32 """Return distribution from 'setup(**args)', without executing commands""" |
| 33 |
| 34 distutils.core._setup_stop_after = "commandline" |
| 35 |
| 36 # Don't let system command line leak into tests! |
| 37 args.setdefault('script_args',['install']) |
| 38 |
| 39 try: |
| 40 return setuptools.setup(**args) |
| 41 finally: |
| 42 distutils.core._setup_stop_after = None |
| 43 |
| 44 |
| 45 class DependsTests(unittest.TestCase): |
| 46 |
| 47 def testExtractConst(self): |
| 48 if not hasattr(dep, 'extract_constant'): |
| 49 # skip on non-bytecode platforms |
| 50 return |
| 51 |
| 52 def f1(): |
| 53 global x, y, z |
| 54 x = "test" |
| 55 y = z |
| 56 |
| 57 fc = func_code(f1) |
| 58 # unrecognized name |
| 59 self.assertEqual(dep.extract_constant(fc,'q', -1), None) |
| 60 |
| 61 # constant assigned |
| 62 self.assertEqual(dep.extract_constant(fc,'x', -1), "test") |
| 63 |
| 64 # expression assigned |
| 65 self.assertEqual(dep.extract_constant(fc,'y', -1), -1) |
| 66 |
| 67 # recognized name, not assigned |
| 68 self.assertEqual(dep.extract_constant(fc,'z', -1), None) |
| 69 |
| 70 def testFindModule(self): |
| 71 self.assertRaises(ImportError, dep.find_module, 'no-such.-thing') |
| 72 self.assertRaises(ImportError, dep.find_module, 'setuptools.non-existent
') |
| 73 f,p,i = dep.find_module('setuptools.tests') |
| 74 f.close() |
| 75 |
| 76 def testModuleExtract(self): |
| 77 if not hasattr(dep, 'get_module_constant'): |
| 78 # skip on non-bytecode platforms |
| 79 return |
| 80 |
| 81 from email import __version__ |
| 82 self.assertEqual( |
| 83 dep.get_module_constant('email','__version__'), __version__ |
| 84 ) |
| 85 self.assertEqual( |
| 86 dep.get_module_constant('sys','version'), sys.version |
| 87 ) |
| 88 self.assertEqual( |
| 89 dep.get_module_constant('setuptools.tests','__doc__'),__doc__ |
| 90 ) |
| 91 |
| 92 def testRequire(self): |
| 93 if not hasattr(dep, 'extract_constant'): |
| 94 # skip on non-bytecode platformsh |
| 95 return |
| 96 |
| 97 req = Require('Email','1.0.3','email') |
| 98 |
| 99 self.assertEqual(req.name, 'Email') |
| 100 self.assertEqual(req.module, 'email') |
| 101 self.assertEqual(req.requested_version, '1.0.3') |
| 102 self.assertEqual(req.attribute, '__version__') |
| 103 self.assertEqual(req.full_name(), 'Email-1.0.3') |
| 104 |
| 105 from email import __version__ |
| 106 self.assertEqual(req.get_version(), __version__) |
| 107 self.assertTrue(req.version_ok('1.0.9')) |
| 108 self.assertTrue(not req.version_ok('0.9.1')) |
| 109 self.assertTrue(not req.version_ok('unknown')) |
| 110 |
| 111 self.assertTrue(req.is_present()) |
| 112 self.assertTrue(req.is_current()) |
| 113 |
| 114 req = Require('Email 3000','03000','email',format=LooseVersion) |
| 115 self.assertTrue(req.is_present()) |
| 116 self.assertTrue(not req.is_current()) |
| 117 self.assertTrue(not req.version_ok('unknown')) |
| 118 |
| 119 req = Require('Do-what-I-mean','1.0','d-w-i-m') |
| 120 self.assertTrue(not req.is_present()) |
| 121 self.assertTrue(not req.is_current()) |
| 122 |
| 123 req = Require('Tests', None, 'tests', homepage="http://example.com") |
| 124 self.assertEqual(req.format, None) |
| 125 self.assertEqual(req.attribute, None) |
| 126 self.assertEqual(req.requested_version, None) |
| 127 self.assertEqual(req.full_name(), 'Tests') |
| 128 self.assertEqual(req.homepage, 'http://example.com') |
| 129 |
| 130 paths = [os.path.dirname(p) for p in __path__] |
| 131 self.assertTrue(req.is_present(paths)) |
| 132 self.assertTrue(req.is_current(paths)) |
| 133 |
| 134 |
| 135 class DistroTests(unittest.TestCase): |
| 136 |
| 137 def setUp(self): |
| 138 self.e1 = Extension('bar.ext',['bar.c']) |
| 139 self.e2 = Extension('c.y', ['y.c']) |
| 140 |
| 141 self.dist = makeSetup( |
| 142 packages=['a', 'a.b', 'a.b.c', 'b', 'c'], |
| 143 py_modules=['b.d','x'], |
| 144 ext_modules = (self.e1, self.e2), |
| 145 package_dir = {}, |
| 146 ) |
| 147 |
| 148 def testDistroType(self): |
| 149 self.assertTrue(isinstance(self.dist,setuptools.dist.Distribution)) |
| 150 |
| 151 def testExcludePackage(self): |
| 152 self.dist.exclude_package('a') |
| 153 self.assertEqual(self.dist.packages, ['b','c']) |
| 154 |
| 155 self.dist.exclude_package('b') |
| 156 self.assertEqual(self.dist.packages, ['c']) |
| 157 self.assertEqual(self.dist.py_modules, ['x']) |
| 158 self.assertEqual(self.dist.ext_modules, [self.e1, self.e2]) |
| 159 |
| 160 self.dist.exclude_package('c') |
| 161 self.assertEqual(self.dist.packages, []) |
| 162 self.assertEqual(self.dist.py_modules, ['x']) |
| 163 self.assertEqual(self.dist.ext_modules, [self.e1]) |
| 164 |
| 165 # test removals from unspecified options |
| 166 makeSetup().exclude_package('x') |
| 167 |
| 168 def testIncludeExclude(self): |
| 169 # remove an extension |
| 170 self.dist.exclude(ext_modules=[self.e1]) |
| 171 self.assertEqual(self.dist.ext_modules, [self.e2]) |
| 172 |
| 173 # add it back in |
| 174 self.dist.include(ext_modules=[self.e1]) |
| 175 self.assertEqual(self.dist.ext_modules, [self.e2, self.e1]) |
| 176 |
| 177 # should not add duplicate |
| 178 self.dist.include(ext_modules=[self.e1]) |
| 179 self.assertEqual(self.dist.ext_modules, [self.e2, self.e1]) |
| 180 |
| 181 def testExcludePackages(self): |
| 182 self.dist.exclude(packages=['c','b','a']) |
| 183 self.assertEqual(self.dist.packages, []) |
| 184 self.assertEqual(self.dist.py_modules, ['x']) |
| 185 self.assertEqual(self.dist.ext_modules, [self.e1]) |
| 186 |
| 187 def testEmpty(self): |
| 188 dist = makeSetup() |
| 189 dist.include(packages=['a'], py_modules=['b'], ext_modules=[self.e2]) |
| 190 dist = makeSetup() |
| 191 dist.exclude(packages=['a'], py_modules=['b'], ext_modules=[self.e2]) |
| 192 |
| 193 def testContents(self): |
| 194 self.assertTrue(self.dist.has_contents_for('a')) |
| 195 self.dist.exclude_package('a') |
| 196 self.assertTrue(not self.dist.has_contents_for('a')) |
| 197 |
| 198 self.assertTrue(self.dist.has_contents_for('b')) |
| 199 self.dist.exclude_package('b') |
| 200 self.assertTrue(not self.dist.has_contents_for('b')) |
| 201 |
| 202 self.assertTrue(self.dist.has_contents_for('c')) |
| 203 self.dist.exclude_package('c') |
| 204 self.assertTrue(not self.dist.has_contents_for('c')) |
| 205 |
| 206 def testInvalidIncludeExclude(self): |
| 207 self.assertRaises(DistutilsSetupError, |
| 208 self.dist.include, nonexistent_option='x' |
| 209 ) |
| 210 self.assertRaises(DistutilsSetupError, |
| 211 self.dist.exclude, nonexistent_option='x' |
| 212 ) |
| 213 self.assertRaises(DistutilsSetupError, |
| 214 self.dist.include, packages={'x':'y'} |
| 215 ) |
| 216 self.assertRaises(DistutilsSetupError, |
| 217 self.dist.exclude, packages={'x':'y'} |
| 218 ) |
| 219 self.assertRaises(DistutilsSetupError, |
| 220 self.dist.include, ext_modules={'x':'y'} |
| 221 ) |
| 222 self.assertRaises(DistutilsSetupError, |
| 223 self.dist.exclude, ext_modules={'x':'y'} |
| 224 ) |
| 225 |
| 226 self.assertRaises(DistutilsSetupError, |
| 227 self.dist.include, package_dir=['q'] |
| 228 ) |
| 229 self.assertRaises(DistutilsSetupError, |
| 230 self.dist.exclude, package_dir=['q'] |
| 231 ) |
| 232 |
| 233 |
| 234 class FeatureTests(unittest.TestCase): |
| 235 |
| 236 def setUp(self): |
| 237 self.req = Require('Distutils','1.0.3','distutils') |
| 238 self.dist = makeSetup( |
| 239 features={ |
| 240 'foo': Feature("foo",standard=True,require_features=['baz',self.
req]), |
| 241 'bar': Feature("bar", standard=True, packages=['pkg.bar'], |
| 242 py_modules=['bar_et'], remove=['bar.ext'], |
| 243 ), |
| 244 'baz': Feature( |
| 245 "baz", optional=False, packages=['pkg.baz'], |
| 246 scripts = ['scripts/baz_it'], |
| 247 libraries=[('libfoo','foo/foofoo.c')] |
| 248 ), |
| 249 'dwim': Feature("DWIM", available=False, remove='bazish'), |
| 250 }, |
| 251 script_args=['--without-bar', 'install'], |
| 252 packages = ['pkg.bar', 'pkg.foo'], |
| 253 py_modules = ['bar_et', 'bazish'], |
| 254 ext_modules = [Extension('bar.ext',['bar.c'])] |
| 255 ) |
| 256 |
| 257 def testDefaults(self): |
| 258 self.assertTrue(not |
| 259 Feature( |
| 260 "test",standard=True,remove='x',available=False |
| 261 ).include_by_default() |
| 262 ) |
| 263 self.assertTrue( |
| 264 Feature("test",standard=True,remove='x').include_by_default() |
| 265 ) |
| 266 # Feature must have either kwargs, removes, or require_features |
| 267 self.assertRaises(DistutilsSetupError, Feature, "test") |
| 268 |
| 269 def testAvailability(self): |
| 270 self.assertRaises( |
| 271 DistutilsPlatformError, |
| 272 self.dist.features['dwim'].include_in, self.dist |
| 273 ) |
| 274 |
| 275 def testFeatureOptions(self): |
| 276 dist = self.dist |
| 277 self.assertTrue( |
| 278 ('with-dwim',None,'include DWIM') in dist.feature_options |
| 279 ) |
| 280 self.assertTrue( |
| 281 ('without-dwim',None,'exclude DWIM (default)') in dist.feature_optio
ns |
| 282 ) |
| 283 self.assertTrue( |
| 284 ('with-bar',None,'include bar (default)') in dist.feature_options |
| 285 ) |
| 286 self.assertTrue( |
| 287 ('without-bar',None,'exclude bar') in dist.feature_options |
| 288 ) |
| 289 self.assertEqual(dist.feature_negopt['without-foo'],'with-foo') |
| 290 self.assertEqual(dist.feature_negopt['without-bar'],'with-bar') |
| 291 self.assertEqual(dist.feature_negopt['without-dwim'],'with-dwim') |
| 292 self.assertTrue(not 'without-baz' in dist.feature_negopt) |
| 293 |
| 294 def testUseFeatures(self): |
| 295 dist = self.dist |
| 296 self.assertEqual(dist.with_foo,1) |
| 297 self.assertEqual(dist.with_bar,0) |
| 298 self.assertEqual(dist.with_baz,1) |
| 299 self.assertTrue(not 'bar_et' in dist.py_modules) |
| 300 self.assertTrue(not 'pkg.bar' in dist.packages) |
| 301 self.assertTrue('pkg.baz' in dist.packages) |
| 302 self.assertTrue('scripts/baz_it' in dist.scripts) |
| 303 self.assertTrue(('libfoo','foo/foofoo.c') in dist.libraries) |
| 304 self.assertEqual(dist.ext_modules,[]) |
| 305 self.assertEqual(dist.require_features, [self.req]) |
| 306 |
| 307 # If we ask for bar, it should fail because we explicitly disabled |
| 308 # it on the command line |
| 309 self.assertRaises(DistutilsOptionError, dist.include_feature, 'bar') |
| 310 |
| 311 def testFeatureWithInvalidRemove(self): |
| 312 self.assertRaises( |
| 313 SystemExit, makeSetup, features = {'x':Feature('x', remove='y')} |
| 314 ) |
| 315 |
| 316 class TestCommandTests(unittest.TestCase): |
| 317 |
| 318 def testTestIsCommand(self): |
| 319 test_cmd = makeSetup().get_command_obj('test') |
| 320 self.assertTrue(isinstance(test_cmd, distutils.cmd.Command)) |
| 321 |
| 322 def testLongOptSuiteWNoDefault(self): |
| 323 ts1 = makeSetup(script_args=['test','--test-suite=foo.tests.suite']) |
| 324 ts1 = ts1.get_command_obj('test') |
| 325 ts1.ensure_finalized() |
| 326 self.assertEqual(ts1.test_suite, 'foo.tests.suite') |
| 327 |
| 328 def testDefaultSuite(self): |
| 329 ts2 = makeSetup(test_suite='bar.tests.suite').get_command_obj('test') |
| 330 ts2.ensure_finalized() |
| 331 self.assertEqual(ts2.test_suite, 'bar.tests.suite') |
| 332 |
| 333 def testDefaultWModuleOnCmdLine(self): |
| 334 ts3 = makeSetup( |
| 335 test_suite='bar.tests', |
| 336 script_args=['test','-m','foo.tests'] |
| 337 ).get_command_obj('test') |
| 338 ts3.ensure_finalized() |
| 339 self.assertEqual(ts3.test_module, 'foo.tests') |
| 340 self.assertEqual(ts3.test_suite, 'foo.tests.test_suite') |
| 341 |
| 342 def testConflictingOptions(self): |
| 343 ts4 = makeSetup( |
| 344 script_args=['test','-m','bar.tests', '-s','foo.tests.suite'] |
| 345 ).get_command_obj('test') |
| 346 self.assertRaises(DistutilsOptionError, ts4.ensure_finalized) |
| 347 |
| 348 def testNoSuite(self): |
| 349 ts5 = makeSetup().get_command_obj('test') |
| 350 ts5.ensure_finalized() |
| 351 self.assertEqual(ts5.test_suite, None) |
OLD | NEW |