blob: 9be1116ee5ea32dc770d4dfd0847a8297533a1c3 [file] [log] [blame] [edit]
#!/usr/bin/env python3
import argparse
class ActionStoreBool(argparse.Action):
"""Convert a string argument into a boolean.
Use like this for a default off argument which can be turned on;
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
... '--arg', action=ActionStoreBool, default=False)
ActionStoreBool(['--arg'], False)
>>> parser.parse_args([]).arg
False
>>> parser.parse_args(['--arg']).arg
True
>>> parser.parse_args(['--no-arg']).arg
False
>>> parser.parse_args(['--arg', 'yes']).arg
True
>>> parser.parse_args(['--arg', 'no']).arg
False
>>>
Use like this for a default on argument which can be turned off;
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
... '--arg', action=ActionStoreBool, default=True)
ActionStoreBool(['--arg'], True)
>>> parser.parse_args([]).arg
True
>>> parser.parse_args(['--arg']).arg
True
>>> parser.parse_args(['--no-arg']).arg
False
>>> parser.parse_args(['--arg', 'yes']).arg
True
>>> parser.parse_args(['--arg', 'no']).arg
False
>>>
Converts the following (in can capitalization) to `True`:
* yes
* y
* true
* t
* 1
Converts the following (in can capitalization) to `False`:
* no
* n
* false
* f
* 0
"""
def __init__(
self,
option_strings,
dest,
default=None,
required=False,
help=None,
metavar=None
):
self.orig_option_strings = option_strings
new_option_strings = []
for s in option_strings:
assert s.startswith("--"), s
new_option_strings.append(s)
new_option_strings.append("--no-" + s[2:])
argparse.Action.__init__(
self,
new_option_strings,
dest=dest,
nargs='?',
const=[True],
default=default,
type=self.value,
choices=None,
required=required,
help=help,
metavar=metavar
)
def value(self, s):
if not s:
return self.default
elif s.lower() in ('yes', 'true', 't', 'y', '1'):
return [True]
elif s.lower() in ('no', 'false', 'f', 'n', '0'):
return [False]
else:
raise argparse.ArgumentTypeError('Boolean value expected.')
def __call__(self, parser, namespace, values, option_string=None):
if len(values) == 0:
values = [self.default]
assert len(values) == 1
if option_string.startswith("--no"):
values[0] = False
setattr(namespace, self.dest, values[0])
def __repr__(self):
return "ActionStoreBool({}, {})".format(
self.orig_option_strings, self.default
)
if __name__ == "__main__":
import doctest
failure_count, test_count = doctest.testmod()
assert test_count > 0
assert failure_count == 0, "Doctests failed!"