|
| 1 | +""" |
| 2 | +Functions to help with the main() |
| 3 | +""" |
| 4 | + |
| 5 | + |
| 6 | +def get_kwargs_from_args(args, logger=None, base_kwargs={}): |
| 7 | + """ Get kwargs from argparser args """ |
| 8 | + kwargs = base_kwargs.copy() |
| 9 | + if logger is not None: |
| 10 | + kwargs['logger'] = logger |
| 11 | + |
| 12 | + for arg in vars(args): |
| 13 | + value = getattr(args, arg) |
| 14 | + if value is None or value is False: |
| 15 | + continue |
| 16 | + |
| 17 | + kwargs[arg] = value |
| 18 | + return kwargs |
| 19 | + |
| 20 | + |
| 21 | +def init_logger(name=None): |
| 22 | + """ Initialize the logger with a name""" |
| 23 | + from logging import getLogger |
| 24 | + name = name or __name__ |
| 25 | + return getLogger(name) |
| 26 | + |
| 27 | + |
| 28 | +def init_argparser(prog=None, description=None): |
| 29 | + """ Initialize an argparser with common options. """ |
| 30 | + from argparse import ArgumentParser |
| 31 | + |
| 32 | + argparser = ArgumentParser(prog=prog, description=description) |
| 33 | + argparser.add_argument('-d', '--debug', action='store_true', help='Debug mode.') |
| 34 | + argparser.add_argument('-dd', '--verbose', action='store_true', help='Verbose debug mode.') |
| 35 | + argparser.add_argument('-v', '--version', action='store_true', help='Print the version and exit.') |
| 36 | + argparser.add_argument('--log-file', type=str, help='Log file path.') |
| 37 | + argparser.add_argument('--log-level', type=str, help='Log level.') |
| 38 | + argparser.add_argument('--log-time', action='store_true', help='Log timestamps.') |
| 39 | + argparser.add_argument('--no-log-color', action='store_true', help='Disable log color.') |
| 40 | + |
| 41 | + return argparser |
| 42 | + |
| 43 | + |
| 44 | +def process_args(argparser, logger=None): |
| 45 | + """ Process argparser args, optionally configuring a logger. """ |
| 46 | + from logging import Formatter |
| 47 | + from zenlib.logging import ColorLognameFormatter |
| 48 | + args = argparser.parse_args() |
| 49 | + if args.version: |
| 50 | + package = argparser.prog |
| 51 | + from importlib.metadata import version |
| 52 | + print(f"{package} {version(package)}") |
| 53 | + exit(0) |
| 54 | + |
| 55 | + if logger: |
| 56 | + if args.log_level is not None: |
| 57 | + log_level = int(args.log_level) |
| 58 | + elif args.verbose: |
| 59 | + log_level = 5 |
| 60 | + elif args.debug: |
| 61 | + log_level = 10 |
| 62 | + else: |
| 63 | + log_level = 20 |
| 64 | + logger.setLevel(log_level) |
| 65 | + |
| 66 | + format_str = '%(asctime)s | ' if args.log_time else '' |
| 67 | + if log_level < 20: |
| 68 | + format_str += '%(levelname)s | %(name)-42s | %(message)s' |
| 69 | + else: |
| 70 | + format_str += '%(levelname)s | %(message)s' |
| 71 | + formatter = ColorLognameFormatter(format_str) if not args.no_log_color else Formatter(format_str) |
| 72 | + |
| 73 | + # Add the formatter to the first handler, or add a new handler |
| 74 | + for handler in logger.handlers: |
| 75 | + handler.setFormatter(formatter) |
| 76 | + break |
| 77 | + else: |
| 78 | + from logging import StreamHandler, FileHandler |
| 79 | + handler = StreamHandler() if args.log_file is None else FileHandler(args.log_file) |
| 80 | + handler.setFormatter(formatter) |
| 81 | + logger.addHandler(handler) |
| 82 | + |
| 83 | + return args |
| 84 | + |
| 85 | + |
| 86 | +def get_args_n_logger(package, description: str, arguments=[], get_kwargs=False): |
| 87 | + """ Takes a package name and description |
| 88 | + If arguments are passed, they are added to argparser. |
| 89 | + If get_kwargs is set to True a kwarg dict will be returned. |
| 90 | + If not, returns the parsed args and logger. |
| 91 | + """ |
| 92 | + argparser = init_argparser(prog=package, description=description) |
| 93 | + logger = init_logger(package) |
| 94 | + |
| 95 | + for arg in arguments: |
| 96 | + dest = arg.pop('flags') |
| 97 | + argparser.add_argument(*dest, **arg) |
| 98 | + |
| 99 | + args = process_args(argparser, logger=logger) |
| 100 | + |
| 101 | + if get_kwargs: |
| 102 | + return get_kwargs_from_args(args, logger=logger) |
| 103 | + |
| 104 | + return args, logger |
0 commit comments