#3986 replacing string and types call (like in the Py3k branch), and put exec_msg call at the right place

This commit is contained in:
Tarek Ziadé 2009-02-07 00:05:39 +00:00
parent 363161a418
commit 8be8765a2e
2 changed files with 55 additions and 24 deletions

View file

@ -6,7 +6,7 @@ in the distutils.command package.
__revision__ = "$Id$" __revision__ = "$Id$"
import sys, os, string, re import sys, os, re
from distutils.errors import DistutilsOptionError from distutils.errors import DistutilsOptionError
from distutils import util, dir_util, file_util, archive_util, dep_util from distutils import util, dir_util, file_util, archive_util, dep_util
from distutils import log from distutils import log
@ -156,19 +156,19 @@ class Command:
"abstract method -- subclass %s must override" % self.__class__ "abstract method -- subclass %s must override" % self.__class__
def dump_options (self, header=None, indent=""): def dump_options(self, header=None, indent=""):
from distutils.fancy_getopt import longopt_xlate from distutils.fancy_getopt import longopt_xlate
if header is None: if header is None:
header = "command options for '%s':" % self.get_command_name() header = "command options for '%s':" % self.get_command_name()
print indent + header self.announce(indent + header, level=log.INFO)
indent = indent + " " indent = indent + " "
for (option, _, _) in self.user_options: for (option, _, _) in self.user_options:
option = string.translate(option, longopt_xlate) option = option.translate(longopt_xlate)
if option[-1] == "=": if option[-1] == "=":
option = option[:-1] option = option[:-1]
value = getattr(self, option) value = getattr(self, option)
print indent + "%s = %s" % (option, value) self.announce(indent + "%s = %s" % (option, value),
level=log.INFO)
def run (self): def run (self):
"""A command's raison d'etre: carry out the action it exists to """A command's raison d'etre: carry out the action it exists to
@ -405,8 +405,8 @@ class Command:
base_name, format, root_dir, base_dir, dry_run=self.dry_run) base_name, format, root_dir, base_dir, dry_run=self.dry_run)
def make_file (self, infiles, outfile, func, args, def make_file(self, infiles, outfile, func, args,
exec_msg=None, skip_msg=None, level=1): exec_msg=None, skip_msg=None, level=1):
"""Special case of 'execute()' for operations that process one or """Special case of 'execute()' for operations that process one or
more input files and generate one output file. Works just like more input files and generate one output file. Works just like
'execute()', except the operation is skipped and a different 'execute()', except the operation is skipped and a different
@ -415,24 +415,24 @@ class Command:
and it is true, then the command is unconditionally run -- does no and it is true, then the command is unconditionally run -- does no
timestamp checks. timestamp checks.
""" """
if exec_msg is None:
exec_msg = "generating %s from %s" % \
(outfile, string.join(infiles, ', '))
if skip_msg is None: if skip_msg is None:
skip_msg = "skipping %s (inputs unchanged)" % outfile skip_msg = "skipping %s (inputs unchanged)" % outfile
# Allow 'infiles' to be a single string # Allow 'infiles' to be a single string
if type(infiles) is StringType: if isinstance(infiles, str):
infiles = (infiles,) infiles = (infiles,)
elif type(infiles) not in (ListType, TupleType): elif not isinstance(infiles, (list, tuple)):
raise TypeError, \ raise TypeError, \
"'infiles' must be a string, or a list or tuple of strings" "'infiles' must be a string, or a list or tuple of strings"
if exec_msg is None:
exec_msg = "generating %s from %s" % \
(outfile, ', '.join(infiles))
# If 'outfile' must be regenerated (either because it doesn't # If 'outfile' must be regenerated (either because it doesn't
# exist, is out-of-date, or the 'force' flag is true) then # exist, is out-of-date, or the 'force' flag is true) then
# perform the action that presumably regenerates it # perform the action that presumably regenerates it
if self.force or dep_util.newer_group (infiles, outfile): if self.force or dep_util.newer_group(infiles, outfile):
self.execute(func, args, exec_msg, level) self.execute(func, args, exec_msg, level)
# Otherwise, print the "skip" message # Otherwise, print the "skip" message

View file

@ -5,23 +5,23 @@ from distutils.cmd import Command
from distutils.dist import Distribution from distutils.dist import Distribution
from distutils.errors import DistutilsOptionError from distutils.errors import DistutilsOptionError
class MyCmd(Command):
def initialize_options(self):
pass
class CommandTestCase(unittest.TestCase): class CommandTestCase(unittest.TestCase):
def setUp(self):
dist = Distribution()
self.cmd = MyCmd(dist)
def test_ensure_string_list(self): def test_ensure_string_list(self):
class MyCmd(Command): cmd = self.cmd
def initialize_options(self):
pass
dist = Distribution()
cmd = MyCmd(dist)
cmd.not_string_list = ['one', 2, 'three'] cmd.not_string_list = ['one', 2, 'three']
cmd.yes_string_list = ['one', 'two', 'three'] cmd.yes_string_list = ['one', 'two', 'three']
cmd.not_string_list2 = object() cmd.not_string_list2 = object()
cmd.yes_string_list2 = 'ok' cmd.yes_string_list2 = 'ok'
cmd.ensure_string_list('yes_string_list') cmd.ensure_string_list('yes_string_list')
cmd.ensure_string_list('yes_string_list2') cmd.ensure_string_list('yes_string_list2')
@ -31,6 +31,37 @@ class CommandTestCase(unittest.TestCase):
self.assertRaises(DistutilsOptionError, self.assertRaises(DistutilsOptionError,
cmd.ensure_string_list, 'not_string_list2') cmd.ensure_string_list, 'not_string_list2')
def test_make_file(self):
cmd = self.cmd
# making sure it raises when infiles is not a string or a list/tuple
self.assertRaises(TypeError, cmd.make_file,
infiles=1, outfile='', func='func', args=())
# making sure execute gets called properly
def _execute(func, args, exec_msg, level):
self.assertEquals(exec_msg, 'generating out from in')
cmd.force = True
cmd.execute = _execute
cmd.make_file(infiles='in', outfile='out', func='func', args=())
def test_dump_options(self):
msgs = []
def _announce(msg, level):
msgs.append(msg)
cmd = self.cmd
cmd.announce = _announce
cmd.option1 = 1
cmd.option2 = 1
cmd.user_options = [('option1', '', ''), ('option2', '', '')]
cmd.dump_options()
wanted = ["command options for 'MyCmd':", ' option1 = 1',
' option2 = 1']
self.assertEquals(msgs, wanted)
def test_suite(): def test_suite():
return unittest.makeSuite(CommandTestCase) return unittest.makeSuite(CommandTestCase)