diff options
Diffstat (limited to 'argparse_utils.py')
| -rw-r--r-- | argparse_utils.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/argparse_utils.py b/argparse_utils.py new file mode 100644 index 0000000..75bec04 --- /dev/null +++ b/argparse_utils.py @@ -0,0 +1,96 @@ +#!/usr/bin/python3 + +import argparse +import logging +import os + +import string_utils + +logger = logging.getLogger(__name__) + + +class ActionNoYes(argparse.Action): + def __init__( + self, + option_strings, + dest, + default=None, + required=False, + help=None + ): + if default is None: + msg = 'You must provide a default with Yes/No action' + logger.critical(msg) + raise ValueError(msg) + if len(option_strings) != 1: + msg = 'Only single argument is allowed with YesNo action' + logger.critical(msg) + raise ValueError(msg) + opt = option_strings[0] + if not opt.startswith('--'): + msg = 'Yes/No arguments must be prefixed with --' + logger.critical(msg) + raise ValueError(msg) + + opt = opt[2:] + opts = ['--' + opt, '--no_' + opt] + super().__init__( + opts, + dest, + nargs=0, + const=None, + default=default, + required=required, + help=help + ) + + def __call__(self, parser, namespace, values, option_strings=None): + if ( + option_strings.startswith('--no-') or + option_strings.startswith('--no_') + ): + setattr(namespace, self.dest, False) + else: + setattr(namespace, self.dest, True) + + +def valid_bool(v): + if isinstance(v, bool): + return v + return string_utils.to_bool(v) + + +def valid_ip(ip: str) -> str: + s = string_utils.extract_ip_v4(ip.strip()) + if s is not None: + return s + msg = f"{ip} is an invalid IP address" + logger.warning(msg) + raise argparse.ArgumentTypeError(msg) + + +def valid_mac(mac: str) -> str: + s = string_utils.extract_mac_address(mac) + if s is not None: + return s + msg = f"{mac} is an invalid MAC address" + logger.warning(msg) + raise argparse.ArgumentTypeError(msg) + + +def valid_percentage(num: str) -> float: + n = float(num) + if 0.0 <= n <= 100.0: + return n + msg = f"{num} is an invalid percentage; expected 0 <= n <= 100.0" + logger.warning(msg) + raise argparse.ArgumentTypeError(msg) + + +def valid_filename(filename: str) -> str: + s = filename.strip() + if os.path.exists(s): + return s + msg = f"{filename} was not found and is therefore invalid." + logger.warning(msg) + raise argparse.ArgumentTypeError(msg) |
