test_dist.py (13024B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\tests\test_dist.py 2 import os 3 import StringIO 4 import sys 5 import unittest 6 import warnings 7 import textwrap 8 from distutils.dist import Distribution, fix_help_options, DistributionMetadata 9 from distutils.cmd import Command 10 import distutils.dist 11 from test.test_support import TESTFN, captured_stdout 12 from distutils.tests import support 13 14 class test_dist(Command): 15 user_options = [('sample-option=', 'S', 'help text')] 16 17 def initialize_options(self): 18 self.sample_option = None 19 20 21 class TestDistribution(Distribution): 22 23 def find_config_files(self): 24 return self._config_files 25 26 27 class DistributionTestCase(support.TempdirManager, support.LoggingSilencer, support.EnvironGuard, unittest.TestCase): 28 29 def setUp(self): 30 super(DistributionTestCase, self).setUp() 31 self.argv = (sys.argv, sys.argv[:]) 32 del sys.argv[1:] 33 34 def tearDown(self): 35 sys.argv = self.argv[0] 36 sys.argv[:] = self.argv[1] 37 super(DistributionTestCase, self).tearDown() 38 39 def create_distribution(self, configfiles = ()): 40 d = TestDistribution() 41 d._config_files = configfiles 42 d.parse_config_files() 43 d.parse_command_line() 44 return d 45 46 def test_debug_mode(self): 47 with open(TESTFN, 'w') as f: 48 f.write('[global]') 49 f.write('command_packages = foo.bar, splat') 50 files = [TESTFN] 51 sys.argv.append('build') 52 with captured_stdout() as stdout: 53 self.create_distribution(files) 54 stdout.seek(0) 55 self.assertEqual(stdout.read(), '') 56 distutils.dist.DEBUG = True 57 try: 58 with captured_stdout() as stdout: 59 self.create_distribution(files) 60 stdout.seek(0) 61 self.assertEqual(stdout.read(), '') 62 finally: 63 distutils.dist.DEBUG = False 64 65 def test_command_packages_unspecified(self): 66 sys.argv.append('build') 67 d = self.create_distribution() 68 self.assertEqual(d.get_command_packages(), ['distutils.command']) 69 70 def test_command_packages_cmdline(self): 71 from distutils.tests.test_dist import test_dist 72 sys.argv.extend(['--command-packages', 73 'foo.bar,distutils.tests', 74 'test_dist', 75 '-Ssometext']) 76 d = self.create_distribution() 77 self.assertEqual(d.get_command_packages(), ['distutils.command', 'foo.bar', 'distutils.tests']) 78 cmd = d.get_command_obj('test_dist') 79 self.assertTrue(isinstance(cmd, test_dist)) 80 self.assertEqual(cmd.sample_option, 'sometext') 81 82 def test_command_packages_configfile(self): 83 sys.argv.append('build') 84 self.addCleanup(os.unlink, TESTFN) 85 f = open(TESTFN, 'w') 86 try: 87 print >> f, '[global]' 88 print >> f, 'command_packages = foo.bar, splat' 89 finally: 90 f.close() 91 92 d = self.create_distribution([TESTFN]) 93 self.assertEqual(d.get_command_packages(), ['distutils.command', 'foo.bar', 'splat']) 94 sys.argv[1:] = ['--command-packages', 'spork', 'build'] 95 d = self.create_distribution([TESTFN]) 96 self.assertEqual(d.get_command_packages(), ['distutils.command', 'spork']) 97 sys.argv[1:] = ['--command-packages', '', 'build'] 98 d = self.create_distribution([TESTFN]) 99 self.assertEqual(d.get_command_packages(), ['distutils.command']) 100 101 def test_write_pkg_file(self): 102 tmp_dir = self.mkdtemp() 103 my_file = os.path.join(tmp_dir, 'f') 104 klass = Distribution 105 dist = klass(attrs={'author': u'Mister Caf\xe9', 106 'name': 'my.package', 107 'maintainer': u'Caf\xe9 Junior', 108 'description': u'Caf\xe9 torr\xe9fi\xe9', 109 'long_description': u'H\xe9h\xe9h\xe9'}) 110 dist.metadata.write_pkg_file(open(my_file, 'w')) 111 dist = klass(attrs={'author': 'Mister Cafe', 112 'name': 'my.package', 113 'maintainer': 'Cafe Junior', 114 'description': 'Cafe torrefie', 115 'long_description': 'Hehehe'}) 116 my_file2 = os.path.join(tmp_dir, 'f2') 117 dist.metadata.write_pkg_file(open(my_file, 'w')) 118 119 def test_empty_options(self): 120 klass = Distribution 121 warns = [] 122 123 def _warn(msg): 124 warns.append(msg) 125 126 old_warn = warnings.warn 127 warnings.warn = _warn 128 try: 129 dist = klass(attrs={'author': 'xxx', 130 'name': 'xxx', 131 'version': 'xxx', 132 'url': 'xxxx', 133 'options': {}}) 134 finally: 135 warnings.warn = old_warn 136 137 self.assertEqual(len(warns), 0) 138 139 def test_finalize_options(self): 140 attrs = {'keywords': 'one,two', 141 'platforms': 'one,two'} 142 dist = Distribution(attrs=attrs) 143 dist.finalize_options() 144 self.assertEqual(dist.metadata.platforms, ['one', 'two']) 145 self.assertEqual(dist.metadata.keywords, ['one', 'two']) 146 147 def test_get_command_packages(self): 148 dist = Distribution() 149 self.assertEqual(dist.command_packages, None) 150 cmds = dist.get_command_packages() 151 self.assertEqual(cmds, ['distutils.command']) 152 self.assertEqual(dist.command_packages, ['distutils.command']) 153 dist.command_packages = 'one,two' 154 cmds = dist.get_command_packages() 155 self.assertEqual(cmds, ['distutils.command', 'one', 'two']) 156 157 def test_announce(self): 158 dist = Distribution() 159 args = ('ok',) 160 kwargs = {'level': 'ok2'} 161 self.assertRaises(ValueError, dist.announce, args, kwargs) 162 163 def test_find_config_files_disable(self): 164 temp_home = self.mkdtemp() 165 if os.name == 'posix': 166 user_filename = os.path.join(temp_home, '.pydistutils.cfg') 167 else: 168 user_filename = os.path.join(temp_home, 'pydistutils.cfg') 169 with open(user_filename, 'w') as f: 170 f.write('[distutils]\n') 171 172 def _expander(path): 173 return temp_home 174 175 old_expander = os.path.expanduser 176 os.path.expanduser = _expander 177 try: 178 d = distutils.dist.Distribution() 179 all_files = d.find_config_files() 180 d = distutils.dist.Distribution(attrs={'script_args': ['--no-user-cfg']}) 181 files = d.find_config_files() 182 finally: 183 os.path.expanduser = old_expander 184 185 self.assertEqual(len(all_files) - 1, len(files)) 186 187 188 class MetadataTestCase(support.TempdirManager, support.EnvironGuard, unittest.TestCase): 189 190 def setUp(self): 191 super(MetadataTestCase, self).setUp() 192 self.argv = (sys.argv, sys.argv[:]) 193 194 def tearDown(self): 195 sys.argv = self.argv[0] 196 sys.argv[:] = self.argv[1] 197 super(MetadataTestCase, self).tearDown() 198 199 def test_simple_metadata(self): 200 attrs = {'name': 'package', 201 'version': '1.0'} 202 dist = Distribution(attrs) 203 meta = self.format_metadata(dist) 204 self.assertTrue('Metadata-Version: 1.0' in meta) 205 self.assertTrue('provides:' not in meta.lower()) 206 self.assertTrue('requires:' not in meta.lower()) 207 self.assertTrue('obsoletes:' not in meta.lower()) 208 209 def test_provides(self): 210 attrs = {'name': 'package', 211 'version': '1.0', 212 'provides': ['package', 'package.sub']} 213 dist = Distribution(attrs) 214 self.assertEqual(dist.metadata.get_provides(), ['package', 'package.sub']) 215 self.assertEqual(dist.get_provides(), ['package', 'package.sub']) 216 meta = self.format_metadata(dist) 217 self.assertTrue('Metadata-Version: 1.1' in meta) 218 self.assertTrue('requires:' not in meta.lower()) 219 self.assertTrue('obsoletes:' not in meta.lower()) 220 221 def test_provides_illegal(self): 222 self.assertRaises(ValueError, Distribution, {'name': 'package', 223 'version': '1.0', 224 'provides': ['my.pkg (splat)']}) 225 226 def test_requires(self): 227 attrs = {'name': 'package', 228 'version': '1.0', 229 'requires': ['other', 'another (==1.0)']} 230 dist = Distribution(attrs) 231 self.assertEqual(dist.metadata.get_requires(), ['other', 'another (==1.0)']) 232 self.assertEqual(dist.get_requires(), ['other', 'another (==1.0)']) 233 meta = self.format_metadata(dist) 234 self.assertTrue('Metadata-Version: 1.1' in meta) 235 self.assertTrue('provides:' not in meta.lower()) 236 self.assertTrue('Requires: other' in meta) 237 self.assertTrue('Requires: another (==1.0)' in meta) 238 self.assertTrue('obsoletes:' not in meta.lower()) 239 240 def test_requires_illegal(self): 241 self.assertRaises(ValueError, Distribution, {'name': 'package', 242 'version': '1.0', 243 'requires': ['my.pkg (splat)']}) 244 245 def test_obsoletes(self): 246 attrs = {'name': 'package', 247 'version': '1.0', 248 'obsoletes': ['other', 'another (<1.0)']} 249 dist = Distribution(attrs) 250 self.assertEqual(dist.metadata.get_obsoletes(), ['other', 'another (<1.0)']) 251 self.assertEqual(dist.get_obsoletes(), ['other', 'another (<1.0)']) 252 meta = self.format_metadata(dist) 253 self.assertTrue('Metadata-Version: 1.1' in meta) 254 self.assertTrue('provides:' not in meta.lower()) 255 self.assertTrue('requires:' not in meta.lower()) 256 self.assertTrue('Obsoletes: other' in meta) 257 self.assertTrue('Obsoletes: another (<1.0)' in meta) 258 259 def test_obsoletes_illegal(self): 260 self.assertRaises(ValueError, Distribution, {'name': 'package', 261 'version': '1.0', 262 'obsoletes': ['my.pkg (splat)']}) 263 264 def format_metadata(self, dist): 265 sio = StringIO.StringIO() 266 dist.metadata.write_pkg_file(sio) 267 return sio.getvalue() 268 269 def test_custom_pydistutils(self): 270 if os.name == 'posix': 271 user_filename = '.pydistutils.cfg' 272 else: 273 user_filename = 'pydistutils.cfg' 274 temp_dir = self.mkdtemp() 275 user_filename = os.path.join(temp_dir, user_filename) 276 f = open(user_filename, 'w') 277 try: 278 f.write('.') 279 finally: 280 f.close() 281 282 try: 283 dist = Distribution() 284 if sys.platform in ('linux', 'darwin'): 285 os.environ['HOME'] = temp_dir 286 files = dist.find_config_files() 287 self.assertTrue(user_filename in files) 288 if sys.platform == 'win32': 289 os.environ['HOME'] = temp_dir 290 files = dist.find_config_files() 291 self.assertTrue(user_filename in files, '%r not found in %r' % (user_filename, files)) 292 finally: 293 os.remove(user_filename) 294 295 def test_fix_help_options(self): 296 help_tuples = [('a', 'b', 'c', 'd'), (1, 2, 3, 4)] 297 fancy_options = fix_help_options(help_tuples) 298 self.assertEqual(fancy_options[0], ('a', 'b', 'c')) 299 self.assertEqual(fancy_options[1], (1, 2, 3)) 300 301 def test_show_help(self): 302 dist = Distribution() 303 sys.argv = [] 304 dist.help = 1 305 dist.script_name = 'setup.py' 306 with captured_stdout() as s: 307 dist.parse_command_line() 308 output = [ line for line in s.getvalue().split('\n') if line.strip() != '' ] 309 self.assertTrue(len(output) > 0) 310 311 def test_long_description(self): 312 long_desc = textwrap.dedent(' example::\n We start here\n and continue here\n and end here.') 313 attrs = {'name': 'package', 314 'version': '1.0', 315 'long_description': long_desc} 316 dist = distutils.dist.Distribution(attrs) 317 meta = self.format_metadata(dist) 318 meta = meta.replace('\n' + ' ', '\n') 319 self.assertTrue(long_desc in meta) 320 321 def test_read_metadata(self): 322 attrs = {'name': 'package', 323 'version': '1.0', 324 'long_description': 'desc', 325 'description': 'xxx', 326 'download_url': 'http://example.com', 327 'keywords': ['one', 'two'], 328 'requires': ['foo']} 329 dist = Distribution(attrs) 330 metadata = dist.metadata 331 PKG_INFO = StringIO.StringIO() 332 metadata.write_pkg_file(PKG_INFO) 333 PKG_INFO.seek(0) 334 metadata.read_pkg_file(PKG_INFO) 335 self.assertEqual(metadata.name, 'package') 336 self.assertEqual(metadata.version, '1.0') 337 self.assertEqual(metadata.description, 'xxx') 338 self.assertEqual(metadata.download_url, 'http://example.com') 339 self.assertEqual(metadata.keywords, ['one', 'two']) 340 self.assertEqual(metadata.platforms, ['UNKNOWN']) 341 self.assertEqual(metadata.obsoletes, None) 342 self.assertEqual(metadata.requires, ['foo']) 343 344 345 def test_suite(): 346 suite = unittest.TestSuite() 347 suite.addTest(unittest.makeSuite(DistributionTestCase)) 348 suite.addTest(unittest.makeSuite(MetadataTestCase)) 349 return suite 350 351 352 if __name__ == '__main__': 353 unittest.main(defaultTest='test_suite')