10 logger = logging.getLogger(__name__)
13 class ActionNoYes(argparse.Action):
23 msg = 'You must provide a default with Yes/No action'
26 if len(option_strings) != 1:
27 msg = 'Only single argument is allowed with YesNo action'
30 opt = option_strings[0]
31 if not opt.startswith('--'):
32 msg = 'Yes/No arguments must be prefixed with --'
37 opts = ['--' + opt, '--no_' + opt]
48 def __call__(self, parser, namespace, values, option_strings=None):
50 option_strings.startswith('--no-') or
51 option_strings.startswith('--no_')
53 setattr(namespace, self.dest, False)
55 setattr(namespace, self.dest, True)
59 if isinstance(v, bool):
61 return string_utils.to_bool(v)
64 def valid_ip(ip: str) -> str:
65 s = string_utils.extract_ip_v4(ip.strip())
68 msg = f"{ip} is an invalid IP address"
70 raise argparse.ArgumentTypeError(msg)
73 def valid_mac(mac: str) -> str:
74 s = string_utils.extract_mac_address(mac)
77 msg = f"{mac} is an invalid MAC address"
79 raise argparse.ArgumentTypeError(msg)
82 def valid_percentage(num: str) -> float:
87 msg = f"{num} is an invalid percentage; expected 0 <= n <= 100.0"
89 raise argparse.ArgumentTypeError(msg)
92 def valid_filename(filename: str) -> str:
96 msg = f"{filename} was not found and is therefore invalid."
98 raise argparse.ArgumentTypeError(msg)
101 def valid_date(txt: str) -> datetime.date:
102 date = string_utils.to_date(txt)
105 msg = f'Cannot parse argument as a date: {txt}'
107 raise argparse.ArgumentTypeError(msg)
110 def valid_datetime(txt: str) -> datetime.datetime:
111 dt = string_utils.to_datetime(txt)
114 msg = f'Cannot parse argument as datetime: {txt}'
116 raise argparse.ArgumentTypeError(msg)