8 # This module is commonly used by others in here and should avoid
9 # taking any unnecessary dependencies back on them.
11 logger = logging.getLogger(__name__)
14 class ActionNoYes(argparse.Action):
24 msg = 'You must provide a default with Yes/No action'
27 if len(option_strings) != 1:
28 msg = 'Only single argument is allowed with YesNo action'
31 opt = option_strings[0]
32 if not opt.startswith('--'):
33 msg = 'Yes/No arguments must be prefixed with --'
38 opts = ['--' + opt, '--no_' + opt]
49 def __call__(self, parser, namespace, values, option_strings=None):
51 option_strings.startswith('--no-') or
52 option_strings.startswith('--no_')
54 setattr(namespace, self.dest, False)
56 setattr(namespace, self.dest, True)
60 if isinstance(v, bool):
62 from string_utils import to_bool
66 def valid_ip(ip: str) -> str:
67 from string_utils import extract_ip_v4
68 s = extract_ip_v4(ip.strip())
71 msg = f"{ip} is an invalid IP address"
73 raise argparse.ArgumentTypeError(msg)
76 def valid_mac(mac: str) -> str:
77 from string_utils import extract_mac_address
78 s = extract_mac_address(mac)
81 msg = f"{mac} is an invalid MAC address"
83 raise argparse.ArgumentTypeError(msg)
86 def valid_percentage(num: str) -> float:
91 msg = f"{num} is an invalid percentage; expected 0 <= n <= 100.0"
93 raise argparse.ArgumentTypeError(msg)
96 def valid_filename(filename: str) -> str:
100 msg = f"{filename} was not found and is therefore invalid."
102 raise argparse.ArgumentTypeError(msg)
105 def valid_date(txt: str) -> datetime.date:
106 from string_utils import to_date
110 msg = f'Cannot parse argument as a date: {txt}'
112 raise argparse.ArgumentTypeError(msg)
115 def valid_datetime(txt: str) -> datetime.datetime:
116 from string_utils import to_datetime
117 dt = to_datetime(txt)
120 msg = f'Cannot parse argument as datetime: {txt}'
122 raise argparse.ArgumentTypeError(msg)