blob: 02c1d12e20ccd6a0237ef80c7251c50c335680b9 [file] [log] [blame]
Tarek Ziadé85d6fb52009-01-04 00:04:49 +00001"""Tests for distutils.command.sdist."""
2import os
Tarek Ziadé1b486712009-10-02 23:49:48 +00003import tarfile
Éric Araujo560bf852011-07-31 02:04:00 +02004import unittest
5import warnings
6import zipfile
7from os.path import join
8from textwrap import dedent
Éric Araujoae50bab2012-02-26 01:53:53 +01009from test.test_support import captured_stdout, check_warnings, run_unittest
Ezio Melotti1036a7f2009-09-12 14:43:43 +000010
11# zlib is not used here, but if it's not available
12# the tests that use zipfile may fail
13try:
14 import zlib
15except ImportError:
16 zlib = None
17
Tarek Ziadé1b486712009-10-02 23:49:48 +000018try:
19 import grp
20 import pwd
21 UID_GID_SUPPORT = True
22except ImportError:
23 UID_GID_SUPPORT = False
24
Tarek Ziadé064a7682009-05-14 12:40:59 +000025
Éric Araujo54274ad2011-02-03 00:12:18 +000026from distutils.command.sdist import sdist, show_formats
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000027from distutils.core import Distribution
28from distutils.tests.test_config import PyPIRCCommandTestCase
Éric Araujo560bf852011-07-31 02:04:00 +020029from distutils.errors import DistutilsOptionError
Tarek Ziadé5da9a512009-01-29 23:49:17 +000030from distutils.spawn import find_executable
Tarek Ziadécb768042009-05-16 16:37:06 +000031from distutils.log import WARN
Éric Araujo0f2dbf32011-09-03 00:47:07 +020032from distutils.filelist import FileList
Tarek Ziadé064a7682009-05-14 12:40:59 +000033from distutils.archive_util import ARCHIVE_FORMATS
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000034
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000035SETUP_PY = """
36from distutils.core import setup
37import somecode
38
39setup(name='fake')
40"""
41
Tarek Ziadé7dd53392009-02-16 21:38:01 +000042MANIFEST = """\
Éric Araujo0389ae62010-08-14 03:07:46 +000043# file GENERATED by distutils, do NOT edit
Tarek Ziadé7dd53392009-02-16 21:38:01 +000044README
Éric Araujo31378df2012-02-25 16:13:53 +010045buildout.cfg
Tarek Ziadé0e5001e2009-02-17 23:06:51 +000046inroot.txt
Tarek Ziadé7dd53392009-02-16 21:38:01 +000047setup.py
Tarek Ziadéae9dc8c2009-02-16 21:41:54 +000048data%(sep)sdata.dt
49scripts%(sep)sscript.py
Tarek Ziadéf68b5b82009-02-17 09:42:44 +000050some%(sep)sfile.txt
51some%(sep)sother_file.txt
Tarek Ziadéae9dc8c2009-02-16 21:41:54 +000052somecode%(sep)s__init__.py
53somecode%(sep)sdoc.dat
54somecode%(sep)sdoc.txt
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000055"""
56
Tarek Ziadécb768042009-05-16 16:37:06 +000057class SDistTestCase(PyPIRCCommandTestCase):
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000058
59 def setUp(self):
Tarek Ziadé13699002009-02-14 14:10:23 +000060 # PyPIRCCommandTestCase creates a temp dir already
61 # and put it in self.tmp_dir
Tarek Ziadécb768042009-05-16 16:37:06 +000062 super(SDistTestCase, self).setUp()
Tarek Ziadé13699002009-02-14 14:10:23 +000063 # setting up an environment
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000064 self.old_path = os.getcwd()
Tarek Ziadé13699002009-02-14 14:10:23 +000065 os.mkdir(join(self.tmp_dir, 'somecode'))
66 os.mkdir(join(self.tmp_dir, 'dist'))
Tarek Ziadé7dd53392009-02-16 21:38:01 +000067 # a package, and a README
68 self.write_file((self.tmp_dir, 'README'), 'xxx')
69 self.write_file((self.tmp_dir, 'somecode', '__init__.py'), '#')
70 self.write_file((self.tmp_dir, 'setup.py'), SETUP_PY)
Tarek Ziadé13699002009-02-14 14:10:23 +000071 os.chdir(self.tmp_dir)
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000072
73 def tearDown(self):
Tarek Ziadé13699002009-02-14 14:10:23 +000074 # back to normal
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000075 os.chdir(self.old_path)
Tarek Ziadécb768042009-05-16 16:37:06 +000076 super(SDistTestCase, self).tearDown()
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000077
Tarek Ziadé7dd53392009-02-16 21:38:01 +000078 def get_cmd(self, metadata=None):
79 """Returns a cmd"""
80 if metadata is None:
81 metadata = {'name': 'fake', 'version': '1.0',
82 'url': 'xxx', 'author': 'xxx',
83 'author_email': 'xxx'}
84 dist = Distribution(metadata)
85 dist.script_name = 'setup.py'
86 dist.packages = ['somecode']
87 dist.include_package_data = True
88 cmd = sdist(dist)
89 cmd.dist_dir = 'dist'
Tarek Ziadé7dd53392009-02-16 21:38:01 +000090 return dist, cmd
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000091
Ezio Melotti1036a7f2009-09-12 14:43:43 +000092 @unittest.skipUnless(zlib, "requires zlib")
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000093 def test_prune_file_list(self):
Éric Araujo3cf202e2012-07-03 01:12:42 -040094 # this test creates a project with some VCS dirs and an NFS rename
95 # file, then launches sdist to check they get pruned on all systems
Tarek Ziadé85d6fb52009-01-04 00:04:49 +000096
97 # creating VCS directories with some files in them
Tarek Ziadé13699002009-02-14 14:10:23 +000098 os.mkdir(join(self.tmp_dir, 'somecode', '.svn'))
Tarek Ziadé7dd53392009-02-16 21:38:01 +000099 self.write_file((self.tmp_dir, 'somecode', '.svn', 'ok.py'), 'xxx')
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000100
Tarek Ziadé13699002009-02-14 14:10:23 +0000101 os.mkdir(join(self.tmp_dir, 'somecode', '.hg'))
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000102 self.write_file((self.tmp_dir, 'somecode', '.hg',
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000103 'ok'), 'xxx')
104
Tarek Ziadé13699002009-02-14 14:10:23 +0000105 os.mkdir(join(self.tmp_dir, 'somecode', '.git'))
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000106 self.write_file((self.tmp_dir, 'somecode', '.git',
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000107 'ok'), 'xxx')
108
Éric Araujo3cf202e2012-07-03 01:12:42 -0400109 self.write_file((self.tmp_dir, 'somecode', '.nfs0001'), 'xxx')
110
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000111 # now building a sdist
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000112 dist, cmd = self.get_cmd()
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000113
114 # zip is available universally
115 # (tar might not be installed under win32)
116 cmd.formats = ['zip']
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000117
118 cmd.ensure_finalized()
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000119 cmd.run()
120
121 # now let's check what we have
Tarek Ziadé13699002009-02-14 14:10:23 +0000122 dist_folder = join(self.tmp_dir, 'dist')
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000123 files = os.listdir(dist_folder)
Ezio Melotti2623a372010-11-21 13:34:58 +0000124 self.assertEqual(files, ['fake-1.0.zip'])
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000125
126 zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
127 try:
128 content = zip_file.namelist()
129 finally:
130 zip_file.close()
131
132 # making sure everything has been pruned correctly
Ezio Melotti2623a372010-11-21 13:34:58 +0000133 self.assertEqual(len(content), 4)
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000134
Ezio Melotti1036a7f2009-09-12 14:43:43 +0000135 @unittest.skipUnless(zlib, "requires zlib")
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000136 def test_make_distribution(self):
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000137 # now building a sdist
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000138 dist, cmd = self.get_cmd()
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000139
140 # creating a gztar then a tar
141 cmd.formats = ['gztar', 'tar']
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000142 cmd.ensure_finalized()
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000143 cmd.run()
144
145 # making sure we have two files
Tarek Ziadé13699002009-02-14 14:10:23 +0000146 dist_folder = join(self.tmp_dir, 'dist')
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000147 result = os.listdir(dist_folder)
148 result.sort()
Éric Araujo31378df2012-02-25 16:13:53 +0100149 self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000150
151 os.remove(join(dist_folder, 'fake-1.0.tar'))
152 os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
153
154 # now trying a tar then a gztar
155 cmd.formats = ['tar', 'gztar']
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000156
157 cmd.ensure_finalized()
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000158 cmd.run()
159
160 result = os.listdir(dist_folder)
161 result.sort()
Ezio Melotti2623a372010-11-21 13:34:58 +0000162 self.assertEqual(result, ['fake-1.0.tar', 'fake-1.0.tar.gz'])
Tarek Ziadéaaedcef2009-01-25 23:34:00 +0000163
Ezio Melotti1036a7f2009-09-12 14:43:43 +0000164 @unittest.skipUnless(zlib, "requires zlib")
Jason R. Coombs042370e2011-12-26 10:15:15 -0500165 def test_unicode_metadata_tgz(self):
166 """
167 Unicode name or version should not break building to tar.gz format.
168 Reference issue #11638.
169 """
170
171 # create the sdist command with unicode parameters
172 dist, cmd = self.get_cmd({'name': u'fake', 'version': u'1.0'})
173
174 # create the sdist as gztar and run the command
175 cmd.formats = ['gztar']
176 cmd.ensure_finalized()
177 cmd.run()
178
179 # The command should have created the .tar.gz file
180 dist_folder = join(self.tmp_dir, 'dist')
181 result = os.listdir(dist_folder)
182 self.assertEqual(result, ['fake-1.0.tar.gz'])
183
184 os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
185
186 @unittest.skipUnless(zlib, "requires zlib")
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000187 def test_add_defaults(self):
188
189 # http://bugs.python.org/issue2279
190
191 # add_default should also include
192 # data_files and package_data
193 dist, cmd = self.get_cmd()
194
195 # filling data_files by pointing files
196 # in package_data
197 dist.package_data = {'': ['*.cfg', '*.dat'],
198 'somecode': ['*.txt']}
199 self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
200 self.write_file((self.tmp_dir, 'somecode', 'doc.dat'), '#')
201
202 # adding some data in data_files
203 data_dir = join(self.tmp_dir, 'data')
204 os.mkdir(data_dir)
205 self.write_file((data_dir, 'data.dt'), '#')
Tarek Ziadéf68b5b82009-02-17 09:42:44 +0000206 some_dir = join(self.tmp_dir, 'some')
207 os.mkdir(some_dir)
Éric Araujo31378df2012-02-25 16:13:53 +0100208 # make sure VCS directories are pruned (#14004)
209 hg_dir = join(self.tmp_dir, '.hg')
210 os.mkdir(hg_dir)
211 self.write_file((hg_dir, 'last-message.txt'), '#')
212 # a buggy regex used to prevent this from working on windows (#6884)
213 self.write_file((self.tmp_dir, 'buildout.cfg'), '#')
Tarek Ziadé0e5001e2009-02-17 23:06:51 +0000214 self.write_file((self.tmp_dir, 'inroot.txt'), '#')
Tarek Ziadéf68b5b82009-02-17 09:42:44 +0000215 self.write_file((some_dir, 'file.txt'), '#')
216 self.write_file((some_dir, 'other_file.txt'), '#')
217
Tarek Ziadé0e5001e2009-02-17 23:06:51 +0000218 dist.data_files = [('data', ['data/data.dt',
Éric Araujo31378df2012-02-25 16:13:53 +0100219 'buildout.cfg',
Tarek Ziadé0e5001e2009-02-17 23:06:51 +0000220 'inroot.txt',
221 'notexisting']),
Tarek Ziadéf68b5b82009-02-17 09:42:44 +0000222 'some/file.txt',
223 'some/other_file.txt']
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000224
225 # adding a script
226 script_dir = join(self.tmp_dir, 'scripts')
227 os.mkdir(script_dir)
228 self.write_file((script_dir, 'script.py'), '#')
229 dist.scripts = [join('scripts', 'script.py')]
230
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000231 cmd.formats = ['zip']
232 cmd.use_defaults = True
233
234 cmd.ensure_finalized()
235 cmd.run()
236
237 # now let's check what we have
238 dist_folder = join(self.tmp_dir, 'dist')
239 files = os.listdir(dist_folder)
Ezio Melotti2623a372010-11-21 13:34:58 +0000240 self.assertEqual(files, ['fake-1.0.zip'])
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000241
242 zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
243 try:
244 content = zip_file.namelist()
245 finally:
246 zip_file.close()
247
248 # making sure everything was added
Éric Araujo31378df2012-02-25 16:13:53 +0100249 self.assertEqual(len(content), 12)
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000250
251 # checking the MANIFEST
Éric Araujod1feff72010-11-06 04:06:18 +0000252 f = open(join(self.tmp_dir, 'MANIFEST'))
253 try:
254 manifest = f.read()
Éric Araujod1feff72010-11-06 04:06:18 +0000255 finally:
256 f.close()
Éric Araujo31378df2012-02-25 16:13:53 +0100257 self.assertEqual(manifest, MANIFEST % {'sep': os.sep})
Tarek Ziadé7dd53392009-02-16 21:38:01 +0000258
Ezio Melotti1036a7f2009-09-12 14:43:43 +0000259 @unittest.skipUnless(zlib, "requires zlib")
Tarek Ziadécb768042009-05-16 16:37:06 +0000260 def test_metadata_check_option(self):
261 # testing the `medata-check` option
262 dist, cmd = self.get_cmd(metadata={})
263
264 # this should raise some warnings !
265 # with the `check` subcommand
266 cmd.ensure_finalized()
267 cmd.run()
Éric Araujocb18d072011-09-03 00:28:43 +0200268 warnings = [msg for msg in self.get_logs(WARN) if
269 msg.startswith('warning: check:')]
Ezio Melotti2623a372010-11-21 13:34:58 +0000270 self.assertEqual(len(warnings), 2)
Tarek Ziadécb768042009-05-16 16:37:06 +0000271
272 # trying with a complete set of metadata
273 self.clear_logs()
274 dist, cmd = self.get_cmd()
275 cmd.ensure_finalized()
276 cmd.metadata_check = 0
277 cmd.run()
Éric Araujocb18d072011-09-03 00:28:43 +0200278 warnings = [msg for msg in self.get_logs(WARN) if
279 msg.startswith('warning: check:')]
Ezio Melotti2623a372010-11-21 13:34:58 +0000280 self.assertEqual(len(warnings), 0)
Tarek Ziadécb768042009-05-16 16:37:06 +0000281
282 def test_check_metadata_deprecated(self):
283 # makes sure make_metadata is deprecated
284 dist, cmd = self.get_cmd()
285 with check_warnings() as w:
286 warnings.simplefilter("always")
287 cmd.check_metadata()
Ezio Melotti2623a372010-11-21 13:34:58 +0000288 self.assertEqual(len(w.warnings), 1)
Tarek Ziadécb768042009-05-16 16:37:06 +0000289
Tarek Ziadé064a7682009-05-14 12:40:59 +0000290 def test_show_formats(self):
291 with captured_stdout() as stdout:
292 show_formats()
293
294 # the output should be a header line + one line per format
295 num_formats = len(ARCHIVE_FORMATS.keys())
296 output = [line for line in stdout.getvalue().split('\n')
297 if line.strip().startswith('--formats=')]
Ezio Melotti2623a372010-11-21 13:34:58 +0000298 self.assertEqual(len(output), num_formats)
Tarek Ziadé064a7682009-05-14 12:40:59 +0000299
Tarek Ziadé89539132009-05-14 14:56:14 +0000300 def test_finalize_options(self):
Tarek Ziadé89539132009-05-14 14:56:14 +0000301 dist, cmd = self.get_cmd()
302 cmd.finalize_options()
303
304 # default options set by finalize
Ezio Melotti2623a372010-11-21 13:34:58 +0000305 self.assertEqual(cmd.manifest, 'MANIFEST')
306 self.assertEqual(cmd.template, 'MANIFEST.in')
307 self.assertEqual(cmd.dist_dir, 'dist')
Tarek Ziadé89539132009-05-14 14:56:14 +0000308
309 # formats has to be a string splitable on (' ', ',') or
310 # a stringlist
311 cmd.formats = 1
312 self.assertRaises(DistutilsOptionError, cmd.finalize_options)
313 cmd.formats = ['zip']
314 cmd.finalize_options()
315
316 # formats has to be known
317 cmd.formats = 'supazipa'
318 self.assertRaises(DistutilsOptionError, cmd.finalize_options)
319
Tarek Ziadé1b486712009-10-02 23:49:48 +0000320 @unittest.skipUnless(zlib, "requires zlib")
321 @unittest.skipUnless(UID_GID_SUPPORT, "Requires grp and pwd support")
Serhiy Storchaka57bc6da2013-12-18 16:45:37 +0200322 @unittest.skipIf(find_executable('tar') is None,
323 "The tar command is not found")
324 @unittest.skipIf(find_executable('gzip') is None,
325 "The gzip command is not found")
Tarek Ziadé1b486712009-10-02 23:49:48 +0000326 def test_make_distribution_owner_group(self):
Tarek Ziadé1b486712009-10-02 23:49:48 +0000327 # now building a sdist
328 dist, cmd = self.get_cmd()
329
330 # creating a gztar and specifying the owner+group
331 cmd.formats = ['gztar']
332 cmd.owner = pwd.getpwuid(0)[0]
333 cmd.group = grp.getgrgid(0)[0]
334 cmd.ensure_finalized()
335 cmd.run()
336
337 # making sure we have the good rights
338 archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
339 archive = tarfile.open(archive_name)
340 try:
341 for member in archive.getmembers():
Ezio Melotti2623a372010-11-21 13:34:58 +0000342 self.assertEqual(member.uid, 0)
343 self.assertEqual(member.gid, 0)
Tarek Ziadé1b486712009-10-02 23:49:48 +0000344 finally:
345 archive.close()
346
347 # building a sdist again
348 dist, cmd = self.get_cmd()
349
350 # creating a gztar
351 cmd.formats = ['gztar']
352 cmd.ensure_finalized()
353 cmd.run()
354
355 # making sure we have the good rights
356 archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
357 archive = tarfile.open(archive_name)
Tarek Ziadéa5076a22009-11-29 22:20:30 +0000358
359 # note that we are not testing the group ownership here
360 # because, depending on the platforms and the container
361 # rights (see #7408)
Tarek Ziadé1b486712009-10-02 23:49:48 +0000362 try:
363 for member in archive.getmembers():
Ezio Melotti2623a372010-11-21 13:34:58 +0000364 self.assertEqual(member.uid, os.getuid())
Tarek Ziadé1b486712009-10-02 23:49:48 +0000365 finally:
366 archive.close()
Tarek Ziadé89539132009-05-14 14:56:14 +0000367
Éric Araujo0f2dbf32011-09-03 00:47:07 +0200368 # the following tests make sure there is a nice error message instead
369 # of a traceback when parsing an invalid manifest template
370
Éric Araujoae50bab2012-02-26 01:53:53 +0100371 def _check_template(self, content):
Éric Araujo0f2dbf32011-09-03 00:47:07 +0200372 dist, cmd = self.get_cmd()
373 os.chdir(self.tmp_dir)
374 self.write_file('MANIFEST.in', content)
375 cmd.ensure_finalized()
376 cmd.filelist = FileList()
377 cmd.read_template()
378 warnings = self.get_logs(WARN)
379 self.assertEqual(len(warnings), 1)
380
381 def test_invalid_template_unknown_command(self):
Éric Araujoae50bab2012-02-26 01:53:53 +0100382 self._check_template('taunt knights *')
Éric Araujo0f2dbf32011-09-03 00:47:07 +0200383
384 def test_invalid_template_wrong_arguments(self):
385 # this manifest command takes one argument
Éric Araujoae50bab2012-02-26 01:53:53 +0100386 self._check_template('prune')
Éric Araujo0f2dbf32011-09-03 00:47:07 +0200387
388 @unittest.skipIf(os.name != 'nt', 'test relevant for Windows only')
389 def test_invalid_template_wrong_path(self):
390 # on Windows, trailing slashes are not allowed
391 # this used to crash instead of raising a warning: #8286
Éric Araujoae50bab2012-02-26 01:53:53 +0100392 self._check_template('include examples/')
Éric Araujo0f2dbf32011-09-03 00:47:07 +0200393
Ezio Melottic425f8f2010-07-12 19:52:15 +0000394 @unittest.skipUnless(zlib, "requires zlib")
Tarek Ziadé422545f2010-05-17 10:06:20 +0000395 def test_get_file_list(self):
396 # make sure MANIFEST is recalculated
397 dist, cmd = self.get_cmd()
398
399 # filling data_files by pointing files in package_data
400 dist.package_data = {'somecode': ['*.txt']}
401 self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#')
Nadeem Vawda367d4c82011-08-21 22:40:04 +0200402 cmd.formats = ['gztar']
Tarek Ziadé422545f2010-05-17 10:06:20 +0000403 cmd.ensure_finalized()
404 cmd.run()
405
406 f = open(cmd.manifest)
407 try:
408 manifest = [line.strip() for line in f.read().split('\n')
409 if line.strip() != '']
410 finally:
411 f.close()
412
Ezio Melotti2623a372010-11-21 13:34:58 +0000413 self.assertEqual(len(manifest), 5)
Tarek Ziadé422545f2010-05-17 10:06:20 +0000414
415 # adding a file
416 self.write_file((self.tmp_dir, 'somecode', 'doc2.txt'), '#')
417
Ezio Melottic2077b02011-03-16 12:34:31 +0200418 # make sure build_py is reinitialized, like a fresh run
Tarek Ziadé422545f2010-05-17 10:06:20 +0000419 build_py = dist.get_command_obj('build_py')
420 build_py.finalized = False
421 build_py.ensure_finalized()
422
423 cmd.run()
424
425 f = open(cmd.manifest)
426 try:
427 manifest2 = [line.strip() for line in f.read().split('\n')
428 if line.strip() != '']
429 finally:
430 f.close()
431
432 # do we have the new file in MANIFEST ?
Ezio Melotti2623a372010-11-21 13:34:58 +0000433 self.assertEqual(len(manifest2), 6)
Tarek Ziadé422545f2010-05-17 10:06:20 +0000434 self.assertIn('doc2.txt', manifest2[-1])
435
Éric Araujob76eb972011-05-08 16:27:13 +0200436 @unittest.skipUnless(zlib, "requires zlib")
Éric Araujo0389ae62010-08-14 03:07:46 +0000437 def test_manifest_marker(self):
438 # check that autogenerated MANIFESTs have a marker
439 dist, cmd = self.get_cmd()
440 cmd.ensure_finalized()
441 cmd.run()
442
443 f = open(cmd.manifest)
444 try:
445 manifest = [line.strip() for line in f.read().split('\n')
446 if line.strip() != '']
447 finally:
448 f.close()
449
450 self.assertEqual(manifest[0],
451 '# file GENERATED by distutils, do NOT edit')
452
Éric Araujo560bf852011-07-31 02:04:00 +0200453 @unittest.skipUnless(zlib, 'requires zlib')
454 def test_manifest_comments(self):
455 # make sure comments don't cause exceptions or wrong includes
456 contents = dedent("""\
457 # bad.py
458 #bad.py
459 good.py
460 """)
461 dist, cmd = self.get_cmd()
462 cmd.ensure_finalized()
463 self.write_file((self.tmp_dir, cmd.manifest), contents)
464 self.write_file((self.tmp_dir, 'good.py'), '# pick me!')
465 self.write_file((self.tmp_dir, 'bad.py'), "# don't pick me!")
466 self.write_file((self.tmp_dir, '#bad.py'), "# don't pick me!")
467 cmd.run()
468 self.assertEqual(cmd.filelist.files, ['good.py'])
469
Éric Araujob76eb972011-05-08 16:27:13 +0200470 @unittest.skipUnless(zlib, "requires zlib")
Éric Araujo0389ae62010-08-14 03:07:46 +0000471 def test_manual_manifest(self):
472 # check that a MANIFEST without a marker is left alone
473 dist, cmd = self.get_cmd()
Éric Araujocea5fc02011-08-26 02:05:44 +0200474 cmd.formats = ['gztar']
Éric Araujo0389ae62010-08-14 03:07:46 +0000475 cmd.ensure_finalized()
476 self.write_file((self.tmp_dir, cmd.manifest), 'README.manual')
Éric Araujo560bf852011-07-31 02:04:00 +0200477 self.write_file((self.tmp_dir, 'README.manual'),
478 'This project maintains its MANIFEST file itself.')
Éric Araujo0389ae62010-08-14 03:07:46 +0000479 cmd.run()
Éric Araujo560bf852011-07-31 02:04:00 +0200480 self.assertEqual(cmd.filelist.files, ['README.manual'])
Éric Araujo0389ae62010-08-14 03:07:46 +0000481
482 f = open(cmd.manifest)
483 try:
484 manifest = [line.strip() for line in f.read().split('\n')
485 if line.strip() != '']
486 finally:
487 f.close()
488
489 self.assertEqual(manifest, ['README.manual'])
Tarek Ziadé422545f2010-05-17 10:06:20 +0000490
Éric Araujo560bf852011-07-31 02:04:00 +0200491 archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
492 archive = tarfile.open(archive_name)
493 try:
494 filenames = [tarinfo.name for tarinfo in archive]
495 finally:
496 archive.close()
497 self.assertEqual(sorted(filenames), ['fake-1.0', 'fake-1.0/PKG-INFO',
498 'fake-1.0/README.manual'])
499
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000500def test_suite():
Tarek Ziadécb768042009-05-16 16:37:06 +0000501 return unittest.makeSuite(SDistTestCase)
Tarek Ziadé85d6fb52009-01-04 00:04:49 +0000502
503if __name__ == "__main__":
Éric Araujo54274ad2011-02-03 00:12:18 +0000504 run_unittest(test_suite())