[Python-checkins] distutils2: Allow to have more than one file in description-file. Also check that those

tarek.ziade python-checkins at python.org
Sat Jan 29 12:59:10 CET 2011


tarek.ziade pushed c8dfb3c63894 to distutils2:
http://hg.python.org/distutils2/rev/c8dfb3c63894
changeset: 901:c8dfb3c63894
user: Gael Pasgrimaud <gael at gawel.org>
date: Fri Jan 28 17:48:07 2011 +0100
summary:
 Allow to have more than one file in description-file. Also check that those files are added to MANIFEST
files:
 distutils2/command/sdist.py
 distutils2/config.py
 distutils2/metadata.py
 distutils2/tests/test_config.py
diff --git a/distutils2/command/sdist.py b/distutils2/command/sdist.py
--- a/distutils2/command/sdist.py
+++ b/distutils2/command/sdist.py
@@ -18,7 +18,8 @@
 from distutils2.command import get_command_names
 from distutils2.command.cmd import Command
 from distutils2.errors import (DistutilsPlatformError, DistutilsOptionError,
- DistutilsTemplateError, DistutilsModuleError)
+ DistutilsTemplateError, DistutilsModuleError,
+ DistutilsFileError)
 from distutils2.manifest import Manifest
 from distutils2 import logger
 from distutils2.util import convert_path, resolve_name
@@ -319,6 +320,12 @@
 logger.warn("no files to distribute -- empty manifest?")
 else:
 logger.info(msg)
+
+ for file in self.distribution.metadata.requires_files:
+ if file not in files:
+ msg = "'%s' must be included explicitly extra-files metadata" % file
+ raise DistutilsFileError(msg)
+
 for file in files:
 if not os.path.isfile(file):
 logger.warn("'%s' not a regular file -- skipping" % file)
diff --git a/distutils2/config.py b/distutils2/config.py
--- a/distutils2/config.py
+++ b/distutils2/config.py
@@ -112,11 +112,23 @@
 "mutually exclusive")
 raise DistutilsOptionError(msg)
 
- f = open(value) # will raise if file not found
- try:
- value = f.read()
- finally:
- f.close()
+ if isinstance(value, list):
+ filenames = value
+ else:
+ filenames = value.split()
+
+ # concatenate each files
+ value = ''
+ for filename in filenames:
+ f = open(filename) # will raise if file not found
+ try:
+ value += f.read().strip() + '\n'
+ finally:
+ f.close()
+ # add filename as a required file
+ if filename not in metadata.requires_files:
+ metadata.requires_files.append(filename)
+ value = value.strip()
 key = 'description'
 
 if metadata.is_metadata_field(key):
diff --git a/distutils2/metadata.py b/distutils2/metadata.py
--- a/distutils2/metadata.py
+++ b/distutils2/metadata.py
@@ -202,6 +202,7 @@
 self._fields = {}
 self.display_warnings = display_warnings
 self.version = None
+ self.requires_files = []
 self.docutils_support = _HAS_DOCUTILS
 self.platform_dependent = platform_dependent
 self.execution_context = execution_context
diff --git a/distutils2/tests/test_config.py b/distutils2/tests/test_config.py
--- a/distutils2/tests/test_config.py
+++ b/distutils2/tests/test_config.py
@@ -5,6 +5,8 @@
 from StringIO import StringIO
 
 from distutils2.tests import unittest, support, run_unittest
+from distutils2.command.sdist import sdist
+from distutils2.errors import DistutilsFileError
 
 
 SETUP_CFG = """
@@ -16,7 +18,7 @@
 maintainer = Éric Araujo
 maintainer_email = merwok at netwok.org
 summary = A sample project demonstrating distutils2 packaging
-description-file = README
+description-file = %(description-file)s
 keywords = distutils2, packaging, sample project
 
 classifier =
@@ -66,6 +68,8 @@
 config = cfg/data.cfg
 /etc/init.d = init-script
 
+extra_files = %(extra-files)s
+
 # Replaces MANIFEST.in
 sdist_extra =
 include THANKS HACKING
@@ -130,22 +134,32 @@
 self.addCleanup(setattr, sys, 'stderr', sys.stderr)
 self.addCleanup(os.chdir, os.getcwd())
 
- def test_config(self):
- tempdir = self.mkdtemp()
- os.chdir(tempdir)
- self.write_file('setup.cfg', SETUP_CFG)
- self.write_file('README', 'yeah')
+ def write_setup(self, kwargs=None):
+ opts = {'description-file': 'README', 'extra-files':''}
+ if kwargs:
+ opts.update(kwargs)
+ self.write_file('setup.cfg', SETUP_CFG % opts)
 
- # try to load the metadata now
+ def run_setup(self, *args):
+ # run setup with args
 sys.stdout = StringIO()
- sys.argv[:] = ['setup.py', '--version']
+ sys.argv[:] = [''] + list(args)
 old_sys = sys.argv[:]
-
 try:
 from distutils2.run import commands_main
 dist = commands_main()
 finally:
 sys.argv[:] = old_sys
+ return dist
+
+ def test_config(self):
+ tempdir = self.mkdtemp()
+ os.chdir(tempdir)
+ self.write_setup()
+ self.write_file('README', 'yeah')
+
+ # try to load the metadata now
+ dist = self.run_setup('--version')
 
 # sanity check
 self.assertEqual(sys.stdout.getvalue(), '0.6.4.dev1' + os.linesep)
@@ -213,10 +227,80 @@
 d = new_compiler(compiler='d')
 self.assertEqual(d.description, 'D Compiler')
 
+
+ def test_multiple_description_file(self):
+ tempdir = self.mkdtemp()
+ os.chdir(tempdir)
+
+ self.write_setup({'description-file': 'README CHANGES'})
+ self.write_file('README', 'yeah')
+ self.write_file('CHANGES', 'changelog2')
+ dist = self.run_setup('--version')
+ self.assertEqual(dist.metadata.requires_files, ['README', 'CHANGES'])
+
+ def test_multiline_description_file(self):
+ tempdir = self.mkdtemp()
+ os.chdir(tempdir)
+
+ self.write_setup({'description-file': 'README\n CHANGES'})
+ self.write_file('README', 'yeah')
+ self.write_file('CHANGES', 'changelog')
+ dist = self.run_setup('--version')
+ self.assertEqual(dist.metadata['description'], 'yeah\nchangelog')
+ self.assertEqual(dist.metadata.requires_files, ['README', 'CHANGES'])
+
+ def test_metadata_requires_description_files_missing(self):
+ tempdir = self.mkdtemp()
+ os.chdir(tempdir)
+ self.write_setup({'description-file': 'README\n README2'})
+ self.write_file('README', 'yeah')
+ self.write_file('README2', 'yeah')
+ self.write_file('haven.py', '#')
+ self.write_file('script1.py', '#')
+ os.mkdir('scripts')
+ self.write_file(os.path.join('scripts', 'find-coconuts'), '#')
+ os.mkdir('bin')
+ self.write_file(os.path.join('bin', 'taunt'), '#')
+
+ for pkg in ('one', 'src', 'src2'):
+ os.mkdir(pkg)
+ self.write_file(os.path.join(pkg, '__init__.py'), '#')
+
+ dist = self.run_setup('--version')
+ cmd = sdist(dist)
+ cmd.finalize_options()
+ cmd.get_file_list()
+ self.assertRaises(DistutilsFileError, cmd.make_distribution)
+
+ def test_metadata_requires_description_files(self):
+ tempdir = self.mkdtemp()
+ os.chdir(tempdir)
+ self.write_setup({'description-file': 'README\n README2', 'extra-files':'\n README2'})
+ self.write_file('README', 'yeah')
+ self.write_file('README2', 'yeah')
+ self.write_file('haven.py', '#')
+ self.write_file('script1.py', '#')
+ os.mkdir('scripts')
+ self.write_file(os.path.join('scripts', 'find-coconuts'), '#')
+ os.mkdir('bin')
+ self.write_file(os.path.join('bin', 'taunt'), '#')
+
+ for pkg in ('one', 'src', 'src2'):
+ os.mkdir(pkg)
+ self.write_file(os.path.join(pkg, '__init__.py'), '#')
+
+ dist = self.run_setup('--version')
+ cmd = sdist(dist)
+ cmd.finalize_options()
+ cmd.get_file_list()
+ cmd.make_distribution()
+ self.assertIn('README\nREADME2\n', open('MANIFEST').read())
+
+
 def test_sub_commands(self):
 tempdir = self.mkdtemp()
 os.chdir(tempdir)
- self.write_file('setup.cfg', SETUP_CFG)
+ self.write_setup()
 self.write_file('README', 'yeah')
 self.write_file('haven.py', '#')
 self.write_file('script1.py', '#')
@@ -230,14 +314,7 @@
 self.write_file(os.path.join(pkg, '__init__.py'), '#')
 
 # try to run the install command to see if foo is called
- sys.stdout = sys.stderr = StringIO()
- sys.argv[:] = ['', 'install_dist']
- old_sys = sys.argv[:]
- try:
- from distutils2.run import main
- dist = main()
- finally:
- sys.argv[:] = old_sys
+ dist = self.run_setup('install_dist')
 
 self.assertEqual(dist.foo_was_here, 1)
 
--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /