Fixed some bugs and mis-features in handling config files:

* options can now be spelled "foo-bar" or "foo_bar" (handled in
    'parse_config_files()', just after we parse a file)
  * added a "[global]" section so there's a place to set global
    options like verbose/quiet and dry-run
  * respect the "negative alias" dictionary so (eg.) "quiet=1" is
    the same as "verbose=0" (this had to be done twice: once in
    'parse_config_file()' for global options, and once in
    '_set_command_options()' for per-command options)
  * the other half of handling boolean options correctly: allow
    commands to list their boolean options in a 'boolean_options'
    class attribute, and use it to translate strings (like "yes", "1",
    "no", "0", etc) to true or false
This commit is contained in:
Greg Ward 2000-09-25 01:23:52 +00:00
parent 84da8aa7e2
commit ceb9e226a6
1 changed files with 44 additions and 9 deletions

View File

@ -15,7 +15,7 @@ from copy import copy
from distutils.errors import *
from distutils import sysconfig
from distutils.fancy_getopt import FancyGetopt, longopt_xlate
from distutils.util import check_environ
from distutils.util import check_environ, strtobool
# Regex to define acceptable Distutils command names. This is not *quite*
@ -321,7 +321,9 @@ class Distribution:
for opt in options:
if opt != '__name__':
opt_dict[opt] = (filename, parser.get(section,opt))
val = parser.get(section,opt)
opt = string.replace(opt, '-', '_')
opt_dict[opt] = (filename, val)
# Make the ConfigParser forget everything (so we retain
# the original filenames that options come from) -- gag,
@ -329,6 +331,22 @@ class Distribution:
# specific config parser (sigh...)
parser.__init__()
# If there was a "global" section in the config file, use it
# to set Distribution options.
if self.command_options.has_key('global'):
for (opt, (src, val)) in self.command_options['global'].items():
alias = self.negative_opt.get(opt)
try:
if alias:
setattr(self, alias, not strtobool(val))
elif opt in ('verbose', 'dry_run'): # ugh!
setattr(self, opt, strtobool(val))
except ValueError, msg:
raise DistutilsOptionError, msg
# parse_config_files ()
# -- Command-line parsing methods ----------------------------------
@ -346,7 +364,7 @@ class Distribution:
attribute raises DistutilsGetoptError; any error on the
command-line raises DistutilsArgError. If no Distutils commands
were found on the command line, raises DistutilsArgError. Return
true if command-line were successfully parsed and we should carry
true if command-line was successfully parsed and we should carry
on with executing commands; false if no errors but we shouldn't
execute commands (currently, this only happens if user asks for
help).
@ -714,7 +732,7 @@ class Distribution:
this means copying elements of a dictionary ('option_dict') to
attributes of an instance ('command').
'command_obj' must be a Commnd instance. If 'option_dict' is not
'command_obj' must be a Command instance. If 'option_dict' is not
supplied, uses the standard option dictionary for this command
(from 'self.command_options').
"""
@ -727,11 +745,28 @@ class Distribution:
if DEBUG: print " setting options for '%s' command:" % command_name
for (option, (source, value)) in option_dict.items():
if DEBUG: print " %s = %s (from %s)" % (option, value, source)
if not hasattr(command_obj, option):
raise DistutilsOptionError, \
("error in %s: command '%s' has no such option '%s'") % \
(source, command_name, option)
setattr(command_obj, option, value)
try:
bool_opts = command_obj.boolean_options
except AttributeError:
bool_opts = []
try:
neg_opt = command_obj.negative_opt
except AttributeError:
neg_opt = {}
try:
if neg_opt.has_key(option):
setattr(command_obj, neg_opt[option], not strtobool(value))
elif option in bool_opts:
setattr(command_obj, option, strtobool(value))
elif hasattr(command_obj, option):
setattr(command_obj, option, value)
else:
raise DistutilsOptionError, \
("error in %s: command '%s' has no such option '%s'"
% (source, command_name, option))
except ValueError, msg:
raise DistutilsOptionError, msg
def reinitialize_command (self, command, reinit_subcommands=0):
"""Reinitializes a command to the state it was in when first