summaryrefslogtreecommitdiff
path: root/argparse_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'argparse_utils.py')
-rw-r--r--argparse_utils.py96
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)