blob: a8eb8b1d5abab2aa9b60633f4f6ae762f298f840 [file] [log] [blame]
Fred Draked04573f2004-08-03 16:37:40 +00001"""Tests for distutils.dist."""
Fred Draked04573f2004-08-03 16:37:40 +00002import os
Guido van Rossum34d19282007-08-09 01:03:29 +00003import io
Fred Draked04573f2004-08-03 16:37:40 +00004import sys
Fred Draked04573f2004-08-03 16:37:40 +00005import unittest
Tarek Ziadé4450dcf2008-12-29 22:38:38 +00006import warnings
Tarek Ziadédf872d42009-12-06 09:28:17 +00007import textwrap
Fred Draked04573f2004-08-03 16:37:40 +00008
Tarek Ziadé36797272010-07-22 12:50:05 +00009from distutils.dist import Distribution, fix_help_options
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +000010from distutils.cmd import Command
11
Éric Araujo70ec44a2010-11-06 02:44:43 +000012from test.support import TESTFN, captured_stdout, run_unittest
Tarek Ziadéc1375d52009-02-14 14:35:51 +000013from distutils.tests import support
Fred Draked04573f2004-08-03 16:37:40 +000014
15
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +000016class test_dist(Command):
Fred Draked04573f2004-08-03 16:37:40 +000017 """Sample distutils extension command."""
18
19 user_options = [
20 ("sample-option=", "S", "help text"),
21 ]
22
23 def initialize_options(self):
24 self.sample_option = None
25
26
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +000027class TestDistribution(Distribution):
Fred Draked04573f2004-08-03 16:37:40 +000028 """Distribution subclasses that avoids the default search for
29 configuration files.
30
31 The ._config_files attribute must be set before
32 .parse_config_files() is called.
33 """
34
35 def find_config_files(self):
36 return self._config_files
37
38
Tarek Ziadé36797272010-07-22 12:50:05 +000039class DistributionTestCase(support.LoggingSilencer,
Tarek Ziadé430fb632009-10-18 11:34:51 +000040 support.EnvironGuard,
Tarek Ziadéf11be752009-06-01 22:36:26 +000041 unittest.TestCase):
Fred Draked04573f2004-08-03 16:37:40 +000042
43 def setUp(self):
Tarek Ziadébbf1f182009-05-10 12:20:44 +000044 super(DistributionTestCase, self).setUp()
Tarek Ziadé430fb632009-10-18 11:34:51 +000045 self.argv = sys.argv, sys.argv[:]
Fred Draked04573f2004-08-03 16:37:40 +000046 del sys.argv[1:]
47
48 def tearDown(self):
Tarek Ziadé430fb632009-10-18 11:34:51 +000049 sys.argv = self.argv[0]
50 sys.argv[:] = self.argv[1]
Tarek Ziadébbf1f182009-05-10 12:20:44 +000051 super(DistributionTestCase, self).tearDown()
Fred Draked04573f2004-08-03 16:37:40 +000052
53 def create_distribution(self, configfiles=()):
54 d = TestDistribution()
55 d._config_files = configfiles
56 d.parse_config_files()
57 d.parse_command_line()
58 return d
59
60 def test_command_packages_unspecified(self):
61 sys.argv.append("build")
62 d = self.create_distribution()
63 self.assertEqual(d.get_command_packages(), ["distutils.command"])
64
65 def test_command_packages_cmdline(self):
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000066 from distutils.tests.test_dist import test_dist
Fred Draked04573f2004-08-03 16:37:40 +000067 sys.argv.extend(["--command-packages",
68 "foo.bar,distutils.tests",
69 "test_dist",
70 "-Ssometext",
71 ])
72 d = self.create_distribution()
73 # let's actually try to load our test command:
74 self.assertEqual(d.get_command_packages(),
75 ["distutils.command", "foo.bar", "distutils.tests"])
76 cmd = d.get_command_obj("test_dist")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000077 self.assertTrue(isinstance(cmd, test_dist))
Fred Draked04573f2004-08-03 16:37:40 +000078 self.assertEqual(cmd.sample_option, "sometext")
79
80 def test_command_packages_configfile(self):
81 sys.argv.append("build")
Éric Araujobee5cef2010-11-05 23:51:56 +000082 self.addCleanup(os.unlink, TESTFN)
Fred Draked04573f2004-08-03 16:37:40 +000083 f = open(TESTFN, "w")
84 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000085 print("[global]", file=f)
86 print("command_packages = foo.bar, splat", file=f)
Fred Draked04573f2004-08-03 16:37:40 +000087 finally:
Éric Araujobee5cef2010-11-05 23:51:56 +000088 f.close()
89
90 d = self.create_distribution([TESTFN])
91 self.assertEqual(d.get_command_packages(),
92 ["distutils.command", "foo.bar", "splat"])
93
94 # ensure command line overrides config:
95 sys.argv[1:] = ["--command-packages", "spork", "build"]
96 d = self.create_distribution([TESTFN])
97 self.assertEqual(d.get_command_packages(),
98 ["distutils.command", "spork"])
99
100 # Setting --command-packages to '' should cause the default to
101 # be used even if a config file specified something else:
102 sys.argv[1:] = ["--command-packages", "", "build"]
103 d = self.create_distribution([TESTFN])
104 self.assertEqual(d.get_command_packages(), ["distutils.command"])
Fred Draked04573f2004-08-03 16:37:40 +0000105
Tarek Ziadé4450dcf2008-12-29 22:38:38 +0000106 def test_empty_options(self):
107 # an empty options dictionary should not stay in the
108 # list of attributes
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000109 klass = Distribution
Tarek Ziadé4450dcf2008-12-29 22:38:38 +0000110
111 # catching warnings
112 warns = []
113 def _warn(msg):
114 warns.append(msg)
115
116 old_warn = warnings.warn
117 warnings.warn = _warn
118 try:
119 dist = klass(attrs={'author': 'xxx',
120 'name': 'xxx',
121 'version': 'xxx',
122 'url': 'xxxx',
123 'options': {}})
124 finally:
125 warnings.warn = old_warn
126
127 self.assertEquals(len(warns), 0)
128
Tarek Ziadéf11be752009-06-01 22:36:26 +0000129 def test_finalize_options(self):
130
131 attrs = {'keywords': 'one,two',
132 'platforms': 'one,two'}
133
134 dist = Distribution(attrs=attrs)
135 dist.finalize_options()
136
137 # finalize_option splits platforms and keywords
138 self.assertEquals(dist.metadata.platforms, ['one', 'two'])
139 self.assertEquals(dist.metadata.keywords, ['one', 'two'])
140
Tarek Ziadéf11be752009-06-01 22:36:26 +0000141 def test_get_command_packages(self):
142 dist = Distribution()
143 self.assertEquals(dist.command_packages, None)
144 cmds = dist.get_command_packages()
145 self.assertEquals(cmds, ['distutils.command'])
146 self.assertEquals(dist.command_packages,
147 ['distutils.command'])
148
149 dist.command_packages = 'one,two'
150 cmds = dist.get_command_packages()
151 self.assertEquals(cmds, ['distutils.command', 'one', 'two'])
152
153
Tarek Ziadé31d46072009-09-21 13:55:19 +0000154 def test_announce(self):
155 # make sure the level is known
156 dist = Distribution()
157 args = ('ok',)
158 kwargs = {'level': 'ok2'}
159 self.assertRaises(ValueError, dist.announce, args, kwargs)
160
Tarek Ziadébbf1f182009-05-10 12:20:44 +0000161class MetadataTestCase(support.TempdirManager, support.EnvironGuard,
162 unittest.TestCase):
Fred Drakedb7b0022005-03-20 22:19:47 +0000163
Tarek Ziadé430fb632009-10-18 11:34:51 +0000164 def setUp(self):
165 super(MetadataTestCase, self).setUp()
166 self.argv = sys.argv, sys.argv[:]
167
168 def tearDown(self):
169 sys.argv = self.argv[0]
170 sys.argv[:] = self.argv[1]
171 super(MetadataTestCase, self).tearDown()
172
Fred Drakedb7b0022005-03-20 22:19:47 +0000173 def test_simple_metadata(self):
174 attrs = {"name": "package",
175 "version": "1.0"}
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000176 dist = Distribution(attrs)
Fred Drakedb7b0022005-03-20 22:19:47 +0000177 meta = self.format_metadata(dist)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000178 self.assertTrue("Metadata-Version: 1.0" in meta)
179 self.assertTrue("provides:" not in meta.lower())
180 self.assertTrue("requires:" not in meta.lower())
181 self.assertTrue("obsoletes:" not in meta.lower())
Fred Drakedb7b0022005-03-20 22:19:47 +0000182
183 def test_provides(self):
184 attrs = {"name": "package",
185 "version": "1.0",
186 "provides": ["package", "package.sub"]}
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000187 dist = Distribution(attrs)
Fred Drakedb7b0022005-03-20 22:19:47 +0000188 self.assertEqual(dist.metadata.get_provides(),
189 ["package", "package.sub"])
190 self.assertEqual(dist.get_provides(),
191 ["package", "package.sub"])
192 meta = self.format_metadata(dist)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000193 self.assertTrue("Metadata-Version: 1.1" in meta)
194 self.assertTrue("requires:" not in meta.lower())
195 self.assertTrue("obsoletes:" not in meta.lower())
Fred Drakedb7b0022005-03-20 22:19:47 +0000196
197 def test_provides_illegal(self):
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000198 self.assertRaises(ValueError, Distribution,
Fred Drakedb7b0022005-03-20 22:19:47 +0000199 {"name": "package",
200 "version": "1.0",
201 "provides": ["my.pkg (splat)"]})
202
203 def test_requires(self):
204 attrs = {"name": "package",
205 "version": "1.0",
206 "requires": ["other", "another (==1.0)"]}
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000207 dist = Distribution(attrs)
Fred Drakedb7b0022005-03-20 22:19:47 +0000208 self.assertEqual(dist.metadata.get_requires(),
209 ["other", "another (==1.0)"])
210 self.assertEqual(dist.get_requires(),
211 ["other", "another (==1.0)"])
212 meta = self.format_metadata(dist)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000213 self.assertTrue("Metadata-Version: 1.1" in meta)
214 self.assertTrue("provides:" not in meta.lower())
215 self.assertTrue("Requires: other" in meta)
216 self.assertTrue("Requires: another (==1.0)" in meta)
217 self.assertTrue("obsoletes:" not in meta.lower())
Fred Drakedb7b0022005-03-20 22:19:47 +0000218
219 def test_requires_illegal(self):
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000220 self.assertRaises(ValueError, Distribution,
Fred Drakedb7b0022005-03-20 22:19:47 +0000221 {"name": "package",
222 "version": "1.0",
223 "requires": ["my.pkg (splat)"]})
224
225 def test_obsoletes(self):
226 attrs = {"name": "package",
227 "version": "1.0",
228 "obsoletes": ["other", "another (<1.0)"]}
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000229 dist = Distribution(attrs)
Fred Drakedb7b0022005-03-20 22:19:47 +0000230 self.assertEqual(dist.metadata.get_obsoletes(),
231 ["other", "another (<1.0)"])
232 self.assertEqual(dist.get_obsoletes(),
233 ["other", "another (<1.0)"])
234 meta = self.format_metadata(dist)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000235 self.assertTrue("Metadata-Version: 1.1" in meta)
236 self.assertTrue("provides:" not in meta.lower())
237 self.assertTrue("requires:" not in meta.lower())
238 self.assertTrue("Obsoletes: other" in meta)
239 self.assertTrue("Obsoletes: another (<1.0)" in meta)
Fred Drakedb7b0022005-03-20 22:19:47 +0000240
241 def test_obsoletes_illegal(self):
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000242 self.assertRaises(ValueError, Distribution,
Fred Drakedb7b0022005-03-20 22:19:47 +0000243 {"name": "package",
244 "version": "1.0",
245 "obsoletes": ["my.pkg (splat)"]})
Tim Peterseba28be2005-03-28 01:08:02 +0000246
Fred Drakedb7b0022005-03-20 22:19:47 +0000247 def format_metadata(self, dist):
Guido van Rossum34d19282007-08-09 01:03:29 +0000248 sio = io.StringIO()
Fred Drakedb7b0022005-03-20 22:19:47 +0000249 dist.metadata.write_pkg_file(sio)
250 return sio.getvalue()
251
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000252 def test_custom_pydistutils(self):
253 # fixes #2166
254 # make sure pydistutils.cfg is found
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000255 if os.name == 'posix':
256 user_filename = ".pydistutils.cfg"
257 else:
258 user_filename = "pydistutils.cfg"
259
Tarek Ziadéc1375d52009-02-14 14:35:51 +0000260 temp_dir = self.mkdtemp()
261 user_filename = os.path.join(temp_dir, user_filename)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000262 f = open(user_filename, 'w')
Éric Araujobee5cef2010-11-05 23:51:56 +0000263 try:
264 f.write('.')
265 finally:
266 f.close()
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000267
268 try:
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000269 dist = Distribution()
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000270
271 # linux-style
272 if sys.platform in ('linux', 'darwin'):
Tarek Ziadé430fb632009-10-18 11:34:51 +0000273 os.environ['HOME'] = temp_dir
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000274 files = dist.find_config_files()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertTrue(user_filename in files)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000276
277 # win32-style
278 if sys.platform == 'win32':
279 # home drive should be found
Tarek Ziadé430fb632009-10-18 11:34:51 +0000280 os.environ['HOME'] = temp_dir
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000281 files = dist.find_config_files()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000282 self.assertTrue(user_filename in files,
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +0000283 '%r not found in %r' % (user_filename, files))
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000284 finally:
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000285 os.remove(user_filename)
Fred Drakedb7b0022005-03-20 22:19:47 +0000286
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000287 def test_fix_help_options(self):
288 help_tuples = [('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
289 fancy_options = fix_help_options(help_tuples)
290 self.assertEquals(fancy_options[0], ('a', 'b', 'c'))
291 self.assertEquals(fancy_options[1], (1, 2, 3))
292
293 def test_show_help(self):
294 # smoke test, just makes sure some help is displayed
295 dist = Distribution()
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000296 sys.argv = []
Tarek Ziadé430fb632009-10-18 11:34:51 +0000297 dist.help = 1
298 dist.script_name = 'setup.py'
299 with captured_stdout() as s:
300 dist.parse_command_line()
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000301
302 output = [line for line in s.getvalue().split('\n')
303 if line.strip() != '']
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000304 self.assertTrue(len(output) > 0)
Tarek Ziadéd2dd51d2009-05-17 10:50:24 +0000305
Tarek Ziadédf872d42009-12-06 09:28:17 +0000306 def test_long_description(self):
307 long_desc = textwrap.dedent("""\
308 example::
309 We start here
310 and continue here
311 and end here.""")
312 attrs = {"name": "package",
313 "version": "1.0",
314 "long_description": long_desc}
315
Tarek Ziadé36797272010-07-22 12:50:05 +0000316 dist = Distribution(attrs)
Tarek Ziadédf872d42009-12-06 09:28:17 +0000317 meta = self.format_metadata(dist)
318 meta = meta.replace('\n' + 8 * ' ', '\n')
319 self.assertTrue(long_desc in meta)
320
Fred Draked04573f2004-08-03 16:37:40 +0000321def test_suite():
Fred Drakedb7b0022005-03-20 22:19:47 +0000322 suite = unittest.TestSuite()
323 suite.addTest(unittest.makeSuite(DistributionTestCase))
324 suite.addTest(unittest.makeSuite(MetadataTestCase))
325 return suite
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000326
327if __name__ == "__main__":
Éric Araujo70ec44a2010-11-06 02:44:43 +0000328 run_unittest(test_suite())