1
"""Tests for distutils.dist."""
11
from test.support import TESTFN
12
from distutils.tests import support
15
class test_dist(distutils.cmd.Command):
16
"""Sample distutils extension command."""
19
("sample-option=", "S", "help text"),
22
def initialize_options(self):
23
self.sample_option = None
26
class TestDistribution(distutils.dist.Distribution):
27
"""Distribution subclasses that avoids the default search for
30
The ._config_files attribute must be set before
31
.parse_config_files() is called.
34
def find_config_files(self):
35
return self._config_files
38
class DistributionTestCase(unittest.TestCase):
41
self.argv = sys.argv[:]
45
sys.argv[:] = self.argv
47
def create_distribution(self, configfiles=()):
48
d = TestDistribution()
49
d._config_files = configfiles
50
d.parse_config_files()
51
d.parse_command_line()
54
def test_command_packages_unspecified(self):
55
sys.argv.append("build")
56
d = self.create_distribution()
57
self.assertEqual(d.get_command_packages(), ["distutils.command"])
59
def test_command_packages_cmdline(self):
60
from distutils.tests.test_dist import test_dist
61
sys.argv.extend(["--command-packages",
62
"foo.bar,distutils.tests",
66
d = self.create_distribution()
67
# let's actually try to load our test command:
68
self.assertEqual(d.get_command_packages(),
69
["distutils.command", "foo.bar", "distutils.tests"])
70
cmd = d.get_command_obj("test_dist")
71
self.assert_(isinstance(cmd, test_dist))
72
self.assertEqual(cmd.sample_option, "sometext")
74
def test_command_packages_configfile(self):
75
sys.argv.append("build")
78
print("[global]", file=f)
79
print("command_packages = foo.bar, splat", file=f)
81
d = self.create_distribution([TESTFN])
82
self.assertEqual(d.get_command_packages(),
83
["distutils.command", "foo.bar", "splat"])
85
# ensure command line overrides config:
86
sys.argv[1:] = ["--command-packages", "spork", "build"]
87
d = self.create_distribution([TESTFN])
88
self.assertEqual(d.get_command_packages(),
89
["distutils.command", "spork"])
91
# Setting --command-packages to '' should cause the default to
92
# be used even if a config file specified something else:
93
sys.argv[1:] = ["--command-packages", "", "build"]
94
d = self.create_distribution([TESTFN])
95
self.assertEqual(d.get_command_packages(), ["distutils.command"])
101
def test_empty_options(self):
102
# an empty options dictionary should not stay in the
104
klass = distutils.dist.Distribution
111
old_warn = warnings.warn
112
warnings.warn = _warn
114
dist = klass(attrs={'author': 'xxx',
120
warnings.warn = old_warn
122
self.assertEquals(len(warns), 0)
124
class MetadataTestCase(support.TempdirManager, unittest.TestCase):
126
def test_simple_metadata(self):
127
attrs = {"name": "package",
129
dist = distutils.dist.Distribution(attrs)
130
meta = self.format_metadata(dist)
131
self.assert_("Metadata-Version: 1.0" in meta)
132
self.assert_("provides:" not in meta.lower())
133
self.assert_("requires:" not in meta.lower())
134
self.assert_("obsoletes:" not in meta.lower())
136
def test_provides(self):
137
attrs = {"name": "package",
139
"provides": ["package", "package.sub"]}
140
dist = distutils.dist.Distribution(attrs)
141
self.assertEqual(dist.metadata.get_provides(),
142
["package", "package.sub"])
143
self.assertEqual(dist.get_provides(),
144
["package", "package.sub"])
145
meta = self.format_metadata(dist)
146
self.assert_("Metadata-Version: 1.1" in meta)
147
self.assert_("requires:" not in meta.lower())
148
self.assert_("obsoletes:" not in meta.lower())
150
def test_provides_illegal(self):
151
self.assertRaises(ValueError,
152
distutils.dist.Distribution,
155
"provides": ["my.pkg (splat)"]})
157
def test_requires(self):
158
attrs = {"name": "package",
160
"requires": ["other", "another (==1.0)"]}
161
dist = distutils.dist.Distribution(attrs)
162
self.assertEqual(dist.metadata.get_requires(),
163
["other", "another (==1.0)"])
164
self.assertEqual(dist.get_requires(),
165
["other", "another (==1.0)"])
166
meta = self.format_metadata(dist)
167
self.assert_("Metadata-Version: 1.1" in meta)
168
self.assert_("provides:" not in meta.lower())
169
self.assert_("Requires: other" in meta)
170
self.assert_("Requires: another (==1.0)" in meta)
171
self.assert_("obsoletes:" not in meta.lower())
173
def test_requires_illegal(self):
174
self.assertRaises(ValueError,
175
distutils.dist.Distribution,
178
"requires": ["my.pkg (splat)"]})
180
def test_obsoletes(self):
181
attrs = {"name": "package",
183
"obsoletes": ["other", "another (<1.0)"]}
184
dist = distutils.dist.Distribution(attrs)
185
self.assertEqual(dist.metadata.get_obsoletes(),
186
["other", "another (<1.0)"])
187
self.assertEqual(dist.get_obsoletes(),
188
["other", "another (<1.0)"])
189
meta = self.format_metadata(dist)
190
self.assert_("Metadata-Version: 1.1" in meta)
191
self.assert_("provides:" not in meta.lower())
192
self.assert_("requires:" not in meta.lower())
193
self.assert_("Obsoletes: other" in meta)
194
self.assert_("Obsoletes: another (<1.0)" in meta)
196
def test_obsoletes_illegal(self):
197
self.assertRaises(ValueError,
198
distutils.dist.Distribution,
201
"obsoletes": ["my.pkg (splat)"]})
203
def format_metadata(self, dist):
205
dist.metadata.write_pkg_file(sio)
206
return sio.getvalue()
208
def test_custom_pydistutils(self):
210
# make sure pydistutils.cfg is found
212
for env in ('HOME', 'HOMEPATH', 'HOMEDRIVE'):
213
value = os.environ.get(env)
215
if value is not None:
218
if os.name == 'posix':
219
user_filename = ".pydistutils.cfg"
221
user_filename = "pydistutils.cfg"
223
temp_dir = self.mkdtemp()
224
user_filename = os.path.join(temp_dir, user_filename)
225
f = open(user_filename, 'w')
230
dist = distutils.dist.Distribution()
233
if sys.platform in ('linux', 'darwin'):
234
os.environ['HOME'] = temp_dir
235
files = dist.find_config_files()
236
self.assert_(user_filename in files)
239
if sys.platform == 'win32':
240
# home drive should be found
241
os.environ['HOME'] = temp_dir
242
files = dist.find_config_files()
243
self.assert_(user_filename in files,
244
'%r not found in %r' % (user_filename, files))
246
for key, value in old.items():
249
os.environ[key] = value
250
os.remove(user_filename)
253
suite = unittest.TestSuite()
254
suite.addTest(unittest.makeSuite(DistributionTestCase))
255
suite.addTest(unittest.makeSuite(MetadataTestCase))
258
if __name__ == "__main__":
259
unittest.main(defaultTest="test_suite")