8 logger = logging.getLogger(__name__)
11 class ActionNoYes(argparse.Action):
21 msg = 'You must provide a default with Yes/No action'
24 if len(option_strings) != 1:
25 msg = 'Only single argument is allowed with YesNo action'
28 opt = option_strings[0]
29 if not opt.startswith('--'):
30 msg = 'Yes/No arguments must be prefixed with --'
35 opts = ['--' + opt, '--no_' + opt]
46 def __call__(self, parser, namespace, values, option_strings=None):
48 option_strings.startswith('--no-') or
49 option_strings.startswith('--no_')
51 setattr(namespace, self.dest, False)
53 setattr(namespace, self.dest, True)
57 if isinstance(v, bool):
59 from string_utils import to_bool
63 def valid_ip(ip: str) -> str:
64 from string_utils import extract_ip_v4
65 s = 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 from string_utils import extract_mac_address
75 s = extract_mac_address(mac)
78 msg = f"{mac} is an invalid MAC address"
80 raise argparse.ArgumentTypeError(msg)
83 def valid_percentage(num: str) -> float:
88 msg = f"{num} is an invalid percentage; expected 0 <= n <= 100.0"
90 raise argparse.ArgumentTypeError(msg)
93 def valid_filename(filename: str) -> str:
97 msg = f"{filename} was not found and is therefore invalid."
99 raise argparse.ArgumentTypeError(msg)
102 def valid_date(txt: str) -> datetime.date:
103 from string_utils import to_date
107 msg = f'Cannot parse argument as a date: {txt}'
109 raise argparse.ArgumentTypeError(msg)
112 def valid_datetime(txt: str) -> datetime.datetime:
113 from string_utils import to_datetime
114 dt = to_datetime(txt)
117 msg = f'Cannot parse argument as datetime: {txt}'
119 raise argparse.ArgumentTypeError(msg)