|
1 # -*- coding: latin-1 -*- |
|
2 |
|
3 """Tests for distutils.dist.""" |
|
4 |
|
5 import distutils.cmd |
|
6 import distutils.dist |
|
7 import os |
|
8 import StringIO |
|
9 import sys |
|
10 import unittest |
|
11 |
|
12 from test.test_support import TESTFN |
|
13 |
|
14 |
|
15 class test_dist(distutils.cmd.Command): |
|
16 """Sample distutils extension command.""" |
|
17 |
|
18 user_options = [ |
|
19 ("sample-option=", "S", "help text"), |
|
20 ] |
|
21 |
|
22 def initialize_options(self): |
|
23 self.sample_option = None |
|
24 |
|
25 |
|
26 class TestDistribution(distutils.dist.Distribution): |
|
27 """Distribution subclasses that avoids the default search for |
|
28 configuration files. |
|
29 |
|
30 The ._config_files attribute must be set before |
|
31 .parse_config_files() is called. |
|
32 """ |
|
33 |
|
34 def find_config_files(self): |
|
35 return self._config_files |
|
36 |
|
37 |
|
38 class DistributionTestCase(unittest.TestCase): |
|
39 |
|
40 def setUp(self): |
|
41 self.argv = sys.argv[:] |
|
42 del sys.argv[1:] |
|
43 |
|
44 def tearDown(self): |
|
45 sys.argv[:] = self.argv |
|
46 |
|
47 def create_distribution(self, configfiles=()): |
|
48 d = TestDistribution() |
|
49 d._config_files = configfiles |
|
50 d.parse_config_files() |
|
51 d.parse_command_line() |
|
52 return d |
|
53 |
|
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"]) |
|
58 |
|
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", |
|
63 "test_dist", |
|
64 "-Ssometext", |
|
65 ]) |
|
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") |
|
73 |
|
74 def test_command_packages_configfile(self): |
|
75 sys.argv.append("build") |
|
76 f = open(TESTFN, "w") |
|
77 try: |
|
78 print >>f, "[global]" |
|
79 print >>f, "command_packages = foo.bar, splat" |
|
80 f.close() |
|
81 d = self.create_distribution([TESTFN]) |
|
82 self.assertEqual(d.get_command_packages(), |
|
83 ["distutils.command", "foo.bar", "splat"]) |
|
84 |
|
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"]) |
|
90 |
|
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"]) |
|
96 |
|
97 finally: |
|
98 os.unlink(TESTFN) |
|
99 |
|
100 def test_write_pkg_file(self): |
|
101 # Check DistributionMetadata handling of Unicode fields |
|
102 my_file = os.path.join(os.path.dirname(__file__), 'f') |
|
103 klass = distutils.dist.Distribution |
|
104 |
|
105 dist = klass(attrs={'author': u'Mister Café', |
|
106 'name': 'my.package', |
|
107 'maintainer': u'Café Junior', |
|
108 'description': u'Café torréfié', |
|
109 'long_description': u'Héhéhé'}) |
|
110 |
|
111 |
|
112 # let's make sure the file can be written |
|
113 # with Unicode fields. they are encoded with |
|
114 # PKG_INFO_ENCODING |
|
115 try: |
|
116 dist.metadata.write_pkg_file(open(my_file, 'w')) |
|
117 finally: |
|
118 if os.path.exists(my_file): |
|
119 os.remove(my_file) |
|
120 |
|
121 # regular ascii is of course always usable |
|
122 dist = klass(attrs={'author': 'Mister Cafe', |
|
123 'name': 'my.package', |
|
124 'maintainer': 'Cafe Junior', |
|
125 'description': 'Cafe torrefie', |
|
126 'long_description': 'Hehehe'}) |
|
127 |
|
128 try: |
|
129 dist.metadata.write_pkg_file(open(my_file, 'w')) |
|
130 finally: |
|
131 if os.path.exists(my_file): |
|
132 os.remove(my_file) |
|
133 |
|
134 class MetadataTestCase(unittest.TestCase): |
|
135 |
|
136 def test_simple_metadata(self): |
|
137 attrs = {"name": "package", |
|
138 "version": "1.0"} |
|
139 dist = distutils.dist.Distribution(attrs) |
|
140 meta = self.format_metadata(dist) |
|
141 self.assert_("Metadata-Version: 1.0" in meta) |
|
142 self.assert_("provides:" not in meta.lower()) |
|
143 self.assert_("requires:" not in meta.lower()) |
|
144 self.assert_("obsoletes:" not in meta.lower()) |
|
145 |
|
146 def test_provides(self): |
|
147 attrs = {"name": "package", |
|
148 "version": "1.0", |
|
149 "provides": ["package", "package.sub"]} |
|
150 dist = distutils.dist.Distribution(attrs) |
|
151 self.assertEqual(dist.metadata.get_provides(), |
|
152 ["package", "package.sub"]) |
|
153 self.assertEqual(dist.get_provides(), |
|
154 ["package", "package.sub"]) |
|
155 meta = self.format_metadata(dist) |
|
156 self.assert_("Metadata-Version: 1.1" in meta) |
|
157 self.assert_("requires:" not in meta.lower()) |
|
158 self.assert_("obsoletes:" not in meta.lower()) |
|
159 |
|
160 def test_provides_illegal(self): |
|
161 self.assertRaises(ValueError, |
|
162 distutils.dist.Distribution, |
|
163 {"name": "package", |
|
164 "version": "1.0", |
|
165 "provides": ["my.pkg (splat)"]}) |
|
166 |
|
167 def test_requires(self): |
|
168 attrs = {"name": "package", |
|
169 "version": "1.0", |
|
170 "requires": ["other", "another (==1.0)"]} |
|
171 dist = distutils.dist.Distribution(attrs) |
|
172 self.assertEqual(dist.metadata.get_requires(), |
|
173 ["other", "another (==1.0)"]) |
|
174 self.assertEqual(dist.get_requires(), |
|
175 ["other", "another (==1.0)"]) |
|
176 meta = self.format_metadata(dist) |
|
177 self.assert_("Metadata-Version: 1.1" in meta) |
|
178 self.assert_("provides:" not in meta.lower()) |
|
179 self.assert_("Requires: other" in meta) |
|
180 self.assert_("Requires: another (==1.0)" in meta) |
|
181 self.assert_("obsoletes:" not in meta.lower()) |
|
182 |
|
183 def test_requires_illegal(self): |
|
184 self.assertRaises(ValueError, |
|
185 distutils.dist.Distribution, |
|
186 {"name": "package", |
|
187 "version": "1.0", |
|
188 "requires": ["my.pkg (splat)"]}) |
|
189 |
|
190 def test_obsoletes(self): |
|
191 attrs = {"name": "package", |
|
192 "version": "1.0", |
|
193 "obsoletes": ["other", "another (<1.0)"]} |
|
194 dist = distutils.dist.Distribution(attrs) |
|
195 self.assertEqual(dist.metadata.get_obsoletes(), |
|
196 ["other", "another (<1.0)"]) |
|
197 self.assertEqual(dist.get_obsoletes(), |
|
198 ["other", "another (<1.0)"]) |
|
199 meta = self.format_metadata(dist) |
|
200 self.assert_("Metadata-Version: 1.1" in meta) |
|
201 self.assert_("provides:" not in meta.lower()) |
|
202 self.assert_("requires:" not in meta.lower()) |
|
203 self.assert_("Obsoletes: other" in meta) |
|
204 self.assert_("Obsoletes: another (<1.0)" in meta) |
|
205 |
|
206 def test_obsoletes_illegal(self): |
|
207 self.assertRaises(ValueError, |
|
208 distutils.dist.Distribution, |
|
209 {"name": "package", |
|
210 "version": "1.0", |
|
211 "obsoletes": ["my.pkg (splat)"]}) |
|
212 |
|
213 def format_metadata(self, dist): |
|
214 sio = StringIO.StringIO() |
|
215 dist.metadata.write_pkg_file(sio) |
|
216 return sio.getvalue() |
|
217 |
|
218 def test_custom_pydistutils(self): |
|
219 # fixes #2166 |
|
220 # make sure pydistutils.cfg is found |
|
221 old = {} |
|
222 for env in ('HOME', 'HOMEPATH', 'HOMEDRIVE'): |
|
223 value = os.environ.get(env) |
|
224 old[env] = value |
|
225 if value is not None: |
|
226 del os.environ[env] |
|
227 |
|
228 if os.name == 'posix': |
|
229 user_filename = ".pydistutils.cfg" |
|
230 else: |
|
231 user_filename = "pydistutils.cfg" |
|
232 |
|
233 curdir = os.path.dirname(__file__) |
|
234 user_filename = os.path.join(curdir, user_filename) |
|
235 f = open(user_filename, 'w') |
|
236 f.write('.') |
|
237 f.close() |
|
238 |
|
239 try: |
|
240 dist = distutils.dist.Distribution() |
|
241 |
|
242 # linux-style |
|
243 if sys.platform in ('linux', 'darwin'): |
|
244 os.environ['HOME'] = curdir |
|
245 files = dist.find_config_files() |
|
246 self.assert_(user_filename in files) |
|
247 |
|
248 # win32-style |
|
249 if sys.platform == 'win32': |
|
250 # home drive should be found |
|
251 os.environ['HOME'] = curdir |
|
252 files = dist.find_config_files() |
|
253 self.assert_(user_filename in files, |
|
254 '%r not found in %r' % (user_filename, files)) |
|
255 finally: |
|
256 for key, value in old.items(): |
|
257 if value is None: |
|
258 continue |
|
259 os.environ[key] = value |
|
260 os.remove(user_filename) |
|
261 |
|
262 def test_suite(): |
|
263 suite = unittest.TestSuite() |
|
264 suite.addTest(unittest.makeSuite(DistributionTestCase)) |
|
265 suite.addTest(unittest.makeSuite(MetadataTestCase)) |
|
266 return suite |
|
267 |
|
268 if __name__ == "__main__": |
|
269 unittest.main(defaultTest="test_suite") |