summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2011-08-01 12:44:17 (GMT)
committerÉric Araujo <merwok@netwok.org>2011-08-01 12:44:17 (GMT)
commit7dfdac0b5aed50b3c4477b577e0c639f83859b13 (patch)
tree2f3253704a240fec9e603a27b3b28b76716ac99b /Lib
parentb07df00bce440f6e4f815139df7b15049408c336 (diff)
parentb85b966de6aa1b5b5584c294656a7f574f492cc0 (diff)
downloadcpython-7dfdac0b5aed50b3c4477b577e0c639f83859b13.zip
cpython-7dfdac0b5aed50b3c4477b577e0c639f83859b13.tar.gz
cpython-7dfdac0b5aed50b3c4477b577e0c639f83859b13.tar.bz2
Branch merge
Diffstat (limited to 'Lib')
-rw-r--r--Lib/distutils/command/sdist.py48
-rw-r--r--Lib/distutils/tests/test_sdist.py39
-rw-r--r--Lib/lib2to3/tests/test_refactor.py18
-rw-r--r--Lib/packaging/tests/test_database.py54
4 files changed, 104 insertions, 55 deletions
diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py
index 48cb26b..21ea61d 100644
--- a/Lib/distutils/command/sdist.py
+++ b/Lib/distutils/command/sdist.py
@@ -174,14 +174,20 @@ class sdist(Command):
reading the manifest, or just using the default file set -- it all
depends on the user's options.
"""
- # new behavior:
+ # new behavior when using a template:
# the file list is recalculated everytime because
# even if MANIFEST.in or setup.py are not changed
# the user might have added some files in the tree that
# need to be included.
#
- # This makes --force the default and only behavior.
+ # This makes --force the default and only behavior with templates.
template_exists = os.path.isfile(self.template)
+ if not template_exists and self._manifest_is_not_generated():
+ self.read_manifest()
+ self.filelist.sort()
+ self.filelist.remove_duplicates()
+ return
+
if not template_exists:
self.warn(("manifest template '%s' does not exist " +
"(using default file list)") %
@@ -336,23 +342,28 @@ class sdist(Command):
by 'add_defaults()' and 'read_template()') to the manifest file
named by 'self.manifest'.
"""
- if os.path.isfile(self.manifest):
- fp = open(self.manifest)
- try:
- first_line = fp.readline()
- finally:
- fp.close()
-
- if first_line != '# file GENERATED by distutils, do NOT edit\n':
- log.info("not writing to manually maintained "
- "manifest file '%s'" % self.manifest)
- return
+ if self._manifest_is_not_generated():
+ log.info("not writing to manually maintained "
+ "manifest file '%s'" % self.manifest)
+ return
content = self.filelist.files[:]
content.insert(0, '# file GENERATED by distutils, do NOT edit')
self.execute(file_util.write_file, (self.manifest, content),
"writing manifest file '%s'" % self.manifest)
+ def _manifest_is_not_generated(self):
+ # check for special comment used in 3.1.3 and higher
+ if not os.path.isfile(self.manifest):
+ return False
+
+ fp = open(self.manifest)
+ try:
+ first_line = fp.readline()
+ finally:
+ fp.close()
+ return first_line != '# file GENERATED by distutils, do NOT edit\n'
+
def read_manifest(self):
"""Read the manifest file (named by 'self.manifest') and use it to
fill in 'self.filelist', the list of files to include in the source
@@ -360,12 +371,11 @@ class sdist(Command):
"""
log.info("reading manifest file '%s'", self.manifest)
manifest = open(self.manifest)
- while True:
- line = manifest.readline()
- if line == '': # end of file
- break
- if line[-1] == '\n':
- line = line[0:-1]
+ for line in manifest:
+ # ignore comments and blank lines
+ line = line.strip()
+ if line.startswith('#') or not line:
+ continue
self.filelist.append(line)
manifest.close()
diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py
index c7dd47f..440af98 100644
--- a/Lib/distutils/tests/test_sdist.py
+++ b/Lib/distutils/tests/test_sdist.py
@@ -1,21 +1,19 @@
"""Tests for distutils.command.sdist."""
import os
+import tarfile
import unittest
-import shutil
+import warnings
import zipfile
from os.path import join
-import sys
-import tempfile
-import warnings
+from textwrap import dedent
from test.support import captured_stdout, check_warnings, run_unittest
from distutils.command.sdist import sdist, show_formats
from distutils.core import Distribution
from distutils.tests.test_config import PyPIRCCommandTestCase
-from distutils.errors import DistutilsExecError, DistutilsOptionError
+from distutils.errors import DistutilsOptionError
from distutils.spawn import find_executable
-from distutils.tests import support
from distutils.log import WARN
from distutils.archive_util import ARCHIVE_FORMATS
@@ -346,13 +344,33 @@ class SDistTestCase(PyPIRCCommandTestCase):
self.assertEqual(manifest[0],
'# file GENERATED by distutils, do NOT edit')
+ @unittest.skipUnless(ZLIB_SUPPORT, "Need zlib support to run")
+ def test_manifest_comments(self):
+ # make sure comments don't cause exceptions or wrong includes
+ contents = dedent("""\
+ # bad.py
+ #bad.py
+ good.py
+ """)
+ dist, cmd = self.get_cmd()
+ cmd.ensure_finalized()
+ self.write_file((self.tmp_dir, cmd.manifest), contents)
+ self.write_file((self.tmp_dir, 'good.py'), '# pick me!')
+ self.write_file((self.tmp_dir, 'bad.py'), "# don't pick me!")
+ self.write_file((self.tmp_dir, '#bad.py'), "# don't pick me!")
+ cmd.run()
+ self.assertEqual(cmd.filelist.files, ['good.py'])
+
@unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
def test_manual_manifest(self):
# check that a MANIFEST without a marker is left alone
dist, cmd = self.get_cmd()
cmd.ensure_finalized()
self.write_file((self.tmp_dir, cmd.manifest), 'README.manual')
+ self.write_file((self.tmp_dir, 'README.manual'),
+ 'This project maintains its MANIFEST file itself.')
cmd.run()
+ self.assertEqual(cmd.filelist.files, ['README.manual'])
f = open(cmd.manifest)
try:
@@ -363,6 +381,15 @@ class SDistTestCase(PyPIRCCommandTestCase):
self.assertEqual(manifest, ['README.manual'])
+ archive_name = join(self.tmp_dir, 'dist', 'fake-1.0.tar.gz')
+ archive = tarfile.open(archive_name)
+ try:
+ filenames = [tarinfo.name for tarinfo in archive]
+ finally:
+ archive.close()
+ self.assertEqual(sorted(filenames), ['fake-1.0', 'fake-1.0/PKG-INFO',
+ 'fake-1.0/README.manual'])
+
def test_suite():
return unittest.makeSuite(SDistTestCase)
diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py
index 73122d8..54edeb4 100644
--- a/Lib/lib2to3/tests/test_refactor.py
+++ b/Lib/lib2to3/tests/test_refactor.py
@@ -177,22 +177,26 @@ from __future__ import print_function"""
self.assertEqual(results, expected)
def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS):
+ tmpdir = tempfile.mkdtemp(prefix="2to3-test_refactor")
+ self.addCleanup(shutil.rmtree, tmpdir)
+ # make a copy of the tested file that we can write to
+ shutil.copy(test_file, tmpdir)
+ test_file = os.path.join(tmpdir, os.path.basename(test_file))
+ os.chmod(test_file, 0o644)
+
def read_file():
with open(test_file, "rb") as fp:
return fp.read()
+
old_contents = read_file()
rt = self.rt(fixers=fixers)
rt.refactor_file(test_file)
self.assertEqual(old_contents, read_file())
- try:
- rt.refactor_file(test_file, True)
- new_contents = read_file()
- self.assertNotEqual(old_contents, new_contents)
- finally:
- with open(test_file, "wb") as fp:
- fp.write(old_contents)
+ rt.refactor_file(test_file, True)
+ new_contents = read_file()
+ self.assertNotEqual(old_contents, new_contents)
return new_contents
def test_refactor_file(self):
diff --git a/Lib/packaging/tests/test_database.py b/Lib/packaging/tests/test_database.py
index 119fa23..9baf396 100644
--- a/Lib/packaging/tests/test_database.py
+++ b/Lib/packaging/tests/test_database.py
@@ -39,19 +39,39 @@ def record_pieces(file):
return [path, digest, size]
-class CommonDistributionTests:
- """Mixin used to test the interface common to both Distribution classes.
-
- Derived classes define cls, sample_dist, dirs and records. These
- attributes are used in test methods. See source code for details.
- """
+class FakeDistsMixin:
def setUp(self):
- super(CommonDistributionTests, self).setUp()
+ super(FakeDistsMixin, self).setUp()
self.addCleanup(enable_cache)
disable_cache()
- self.fake_dists_path = os.path.abspath(
+
+ # make a copy that we can write into for our fake installed
+ # distributions
+ tmpdir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, tmpdir)
+ self.fake_dists_path = os.path.join(tmpdir, 'fake_dists')
+ fake_dists_src = os.path.abspath(
os.path.join(os.path.dirname(__file__), 'fake_dists'))
+ shutil.copytree(fake_dists_src, self.fake_dists_path)
+ # XXX ugly workaround: revert copystat calls done by shutil behind our
+ # back (to avoid getting a read-only copy of a read-only file). we
+ # could pass a custom copy_function to change the mode of files, but
+ # shutil gives no control over the mode of directories :(
+ for root, dirs, files in os.walk(self.fake_dists_path):
+ os.chmod(root, 0o755)
+ for f in files:
+ os.chmod(os.path.join(root, f), 0o644)
+ for d in dirs:
+ os.chmod(os.path.join(root, d), 0o755)
+
+
+class CommonDistributionTests(FakeDistsMixin):
+ """Mixin used to test the interface common to both Distribution classes.
+
+ Derived classes define cls, sample_dist, dirs and records. These
+ attributes are used in test methods. See source code for details.
+ """
def test_instantiation(self):
# check that useful attributes are here
@@ -110,6 +130,7 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase):
self.records = {}
for distinfo_dir in self.dirs:
+
record_file = os.path.join(distinfo_dir, 'RECORD')
with open(record_file, 'w') as file:
record_writer = csv.writer(
@@ -138,12 +159,6 @@ class TestDistribution(CommonDistributionTests, unittest.TestCase):
record_data[path] = md5_, size
self.records[distinfo_dir] = record_data
- def tearDown(self):
- for distinfo_dir in self.dirs:
- record_file = os.path.join(distinfo_dir, 'RECORD')
- open(record_file, 'wb').close()
- super(TestDistribution, self).tearDown()
-
def test_instantiation(self):
super(TestDistribution, self).test_instantiation()
self.assertIsInstance(self.dist.requested, bool)
@@ -252,20 +267,13 @@ class TestEggInfoDistribution(CommonDistributionTests,
class TestDatabase(support.LoggingCatcher,
+ FakeDistsMixin,
unittest.TestCase):
def setUp(self):
super(TestDatabase, self).setUp()
- disable_cache()
- # Setup the path environment with our fake distributions
- current_path = os.path.abspath(os.path.dirname(__file__))
- self.fake_dists_path = os.path.join(current_path, 'fake_dists')
sys.path.insert(0, self.fake_dists_path)
-
- def tearDown(self):
- sys.path.remove(self.fake_dists_path)
- enable_cache()
- super(TestDatabase, self).tearDown()
+ self.addCleanup(sys.path.remove, self.fake_dists_path)
def test_distinfo_dirname(self):
# Given a name and a version, we expect the distinfo_dirname function