Added the capability for alias options.
This commit is contained in:
parent
320df700dc
commit
1e7b509526
|
@ -66,6 +66,10 @@ class FancyGetopt:
|
||||||
if self.option_table:
|
if self.option_table:
|
||||||
self._build_index()
|
self._build_index()
|
||||||
|
|
||||||
|
# 'alias' records (duh) alias options; {'foo': 'bar'} means
|
||||||
|
# --foo is an alias for --bar
|
||||||
|
self.alias = {}
|
||||||
|
|
||||||
# 'negative_alias' keeps track of options that are the boolean
|
# 'negative_alias' keeps track of options that are the boolean
|
||||||
# opposite of some other option
|
# opposite of some other option
|
||||||
self.negative_alias = {}
|
self.negative_alias = {}
|
||||||
|
@ -118,23 +122,29 @@ class FancyGetopt:
|
||||||
return string.translate (long_option, longopt_xlate)
|
return string.translate (long_option, longopt_xlate)
|
||||||
|
|
||||||
|
|
||||||
|
def _check_alias_dict (self, aliases, what):
|
||||||
|
assert type(aliases) is DictionaryType
|
||||||
|
for (alias, opt) in aliases.items():
|
||||||
|
if not self.option_index.has_key(alias):
|
||||||
|
raise DistutilsGetoptError, \
|
||||||
|
("invalid %s '%s': "
|
||||||
|
"option '%s' not defined") % (what, alias, alias)
|
||||||
|
if not self.option_index.has_key(opt):
|
||||||
|
raise DistutilsGetoptError, \
|
||||||
|
("invalid %s '%s': "
|
||||||
|
"aliased option '%s' not defined") % (what, alias, opt)
|
||||||
|
|
||||||
|
def set_aliases (self, alias):
|
||||||
|
"""Set the aliases for this option parser."""
|
||||||
|
self._check_alias_dict (alias, "alias")
|
||||||
|
self.alias = alias
|
||||||
|
|
||||||
def set_negative_aliases (self, negative_alias):
|
def set_negative_aliases (self, negative_alias):
|
||||||
"""Set the negative aliases for this option parser.
|
"""Set the negative aliases for this option parser.
|
||||||
'negative_alias' should be a dictionary mapping option names to
|
'negative_alias' should be a dictionary mapping option names to
|
||||||
option names, both the key and value must already be defined
|
option names, both the key and value must already be defined
|
||||||
in the option table."""
|
in the option table."""
|
||||||
|
self._check_alias_dict (negative_alias, "negative alias")
|
||||||
assert type(negative_alias) is DictionaryType
|
|
||||||
for (negopt, opt) in negative_alias.items():
|
|
||||||
if not self.option_index.has_key(negopt):
|
|
||||||
raise DistutilsGetoptError, \
|
|
||||||
("invalid negative alias '%s': "
|
|
||||||
"option '%s' not defined") % (negopt, negopt)
|
|
||||||
if not self.option_index.has_key(opt):
|
|
||||||
raise DistutilsGetoptError, \
|
|
||||||
("invalid negative alias '%s': "
|
|
||||||
"aliased option '%s' not defined") % (negopt, opt)
|
|
||||||
|
|
||||||
self.negative_alias = negative_alias
|
self.negative_alias = negative_alias
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,6 +196,16 @@ class FancyGetopt:
|
||||||
else:
|
else:
|
||||||
self.takes_arg[long] = 0
|
self.takes_arg[long] = 0
|
||||||
|
|
||||||
|
# If this is an alias option, make sure its "takes arg" flag is
|
||||||
|
# the same as the option it's aliased to.
|
||||||
|
alias_to = self.alias.get(long)
|
||||||
|
if alias_to is not None:
|
||||||
|
if self.takes_arg[long] != self.takes_arg[alias_to]:
|
||||||
|
raise DistutilsGetoptError, \
|
||||||
|
("invalid alias '%s': inconsistent with "
|
||||||
|
"aliased option '%s' (one of them takes a value, "
|
||||||
|
"the other doesn't") % (long, alias_to)
|
||||||
|
|
||||||
|
|
||||||
# Now enforce some bondage on the long option name, so we can
|
# Now enforce some bondage on the long option name, so we can
|
||||||
# later translate it to an attribute name on some object. Have
|
# later translate it to an attribute name on some object. Have
|
||||||
|
@ -243,6 +263,10 @@ class FancyGetopt:
|
||||||
raise DistutilsInternalError, \
|
raise DistutilsInternalError, \
|
||||||
"this can't happen: bad option string '%s'" % opt
|
"this can't happen: bad option string '%s'" % opt
|
||||||
|
|
||||||
|
alias = self.alias.get(opt)
|
||||||
|
if alias:
|
||||||
|
opt = alias
|
||||||
|
|
||||||
if not self.takes_arg[opt]: # boolean option?
|
if not self.takes_arg[opt]: # boolean option?
|
||||||
if val != '': # shouldn't have a value!
|
if val != '': # shouldn't have a value!
|
||||||
raise DistutilsInternalError, \
|
raise DistutilsInternalError, \
|
||||||
|
|
Loading…
Reference in New Issue