22Functions to help with the main()
33"""
44
5- __version__ = '1.1.1'
6- __author__ = ' desultory'
5+ __version__ = "1.2.0"
6+ __author__ = " desultory"
77
88
9- BASE_ARGS = [{'flags' : ['-d' , '--debug' ], 'action' : 'store_true' , 'help' : 'enable debug mode (level 10)' },
10- {'flags' : ['-dd' , '--trace' ], 'action' : 'store_true' , 'help' : 'enable trace debug mode (level 5)' },
11- {'flags' : ['-v' , '--version' ], 'action' : 'store_true' , 'help' : 'print the version and exit' },
12- {'flags' : ['--log-file' ], 'type' : str , 'help' : 'set the path to the log file' },
13- {'flags' : ['--log-level' ], 'type' : str , 'help' : 'set the log level' },
14- {'flags' : ['--log-time' ], 'action' : 'store_true' , 'help' : 'enable log timestamps' },
15- {'flags' : ['--no-log-color' ], 'action' : 'store_true' , 'help' : 'disable log color' }]
9+ def get_base_args ():
10+ return [
11+ {"flags" : ["-d" , "--debug" ], "action" : "store_true" , "help" : "enable debug mode (level 10)" },
12+ {"flags" : ["-dd" , "--trace" ], "action" : "store_true" , "help" : "enable trace debug mode (level 5)" },
13+ {"flags" : ["-v" , "--version" ], "action" : "store_true" , "help" : "print the version and exit" },
14+ {"flags" : ["--log-file" ], "type" : str , "help" : "set the path to the log file" },
15+ {"flags" : ["--log-level" ], "type" : str , "help" : "set the log level" },
16+ {"flags" : ["--log-time" ], "action" : "store_true" , "help" : "enable log timestamps" },
17+ {"flags" : ["--no-log-color" ], "action" : "store_true" , "help" : "disable log color" },
18+ ]
19+
20+
21+ def init_logger (name = None ):
22+ """Initialize the logger with a name"""
23+ from logging import getLogger
24+
25+ name = name or __name__
26+ return getLogger (name )
27+
28+
29+ def init_argparser (prog = None , description = None ):
30+ """Initialize an argparser with common options."""
31+ from argparse import ArgumentParser
32+
33+ argparser = ArgumentParser (prog = prog , description = description )
34+ return argparser
1635
1736
1837def get_kwargs_from_args (args , logger = None , base_kwargs = {}, drop_base = True ):
19- """ Get kwargs from argparser args.
20- Drop base doesn't add init_argparser args. """
38+ """Get kwargs from argparser args.
39+ Drop base doesn't add init_argparser args."""
2140 kwargs = base_kwargs .copy ()
2241 if logger is not None :
23- kwargs [' logger' ] = logger
42+ kwargs [" logger" ] = logger
2443
2544 for arg in vars (args ):
26- if drop_base and arg in [' debug' , ' trace' , ' version' , ' log_file' , ' log_level' , ' log_time' , ' no_log_color' ]:
45+ if drop_base and arg in [" debug" , " trace" , " version" , " log_file" , " log_level" , " log_time" , " no_log_color" ]:
2746 continue
2847 value = getattr (args , arg )
2948
@@ -34,28 +53,17 @@ def get_kwargs_from_args(args, logger=None, base_kwargs={}, drop_base=True):
3453 return kwargs
3554
3655
37- def init_logger (name = None ):
38- """ Initialize the logger with a name"""
39- from logging import getLogger
40- name = name or __name__
41- return getLogger (name )
42-
43-
44- def init_argparser (prog = None , description = None ):
45- """ Initialize an argparser with common options. """
46- from argparse import ArgumentParser
47- argparser = ArgumentParser (prog = prog , description = description )
48- return argparser
49-
50-
5156def process_args (argparser , logger = None ):
52- """ Process argparser args, optionally configuring a logger. """
57+ """Process argparser args, optionally configuring a logger."""
5358 from logging import Formatter
59+
5460 from zenlib .logging import ColorLognameFormatter
61+
5562 args = argparser .parse_args ()
5663 if args .version :
5764 package = argparser .prog
5865 from importlib .metadata import version
66+
5967 print (f"{ package } { version (package )} " )
6068 exit (0 )
6169
@@ -70,54 +78,61 @@ def process_args(argparser, logger=None):
7078 log_level = 20
7179 logger .setLevel (log_level )
7280
73- format_str = ' %(asctime)s | ' if args .log_time else ''
81+ format_str = " %(asctime)s | " if args .log_time else ""
7482 if log_level < 20 :
75- format_str += ' %(levelname)s | %(name)-42s | %(message)s'
83+ format_str += " %(levelname)s | %(name)-42s | %(message)s"
7684 else :
77- format_str += ' %(levelname)s | %(message)s'
85+ format_str += " %(levelname)s | %(message)s"
7886 formatter = ColorLognameFormatter (format_str ) if not args .no_log_color else Formatter (format_str )
7987
8088 # Add the formatter to the first handler, or add a new handler
8189 for handler in logger .handlers :
8290 handler .setFormatter (formatter )
8391 break
8492 else :
85- from logging import StreamHandler , FileHandler
93+ from logging import FileHandler , StreamHandler
94+
8695 handler = StreamHandler () if args .log_file is None else FileHandler (args .log_file )
8796 handler .setFormatter (formatter )
8897 logger .addHandler (handler )
8998
9099 return args
91100
92101
93- def dump_args_for_autocomplete (args ):
94- """ Dump args for autocomplete """
102+ def dump_args_for_autocomplete (args , test = False ):
103+ """Dump args for autocomplete"""
104+ out_str = ""
95105 for arg in args :
96- if arg .get (' action' ) not in [' store_true' , ' store_false' ]:
106+ if arg .get (" action" ) not in [" store_true" , " store_false" ]:
97107 continue
98- for flag in arg ['flags' ]:
99- print (f"{ flag } { arg .get ('help' )} " )
108+ for flag in arg ["flags" ]:
109+ out_str += f"{ flag } { arg .get ('help' )} \n "
110+ if test :
111+ return out_str
112+ print (out_str )
100113 exit (0 )
101114
102115
103116def get_args_n_logger (package , description : str , arguments = [], drop_default = False ):
104- """ Takes a package name and description
117+ """Takes a package name and description
105118 If arguments are passed, they are added to argparser.
106119 Returns the parsed args and logger.
107120 """
108- arguments = BASE_ARGS + arguments
121+ arguments = get_base_args () + arguments
109122 from sys import argv
110- if '--dump_args' in argv :
123+
124+ if "--dump_args" in argv :
111125 dump_args_for_autocomplete (arguments )
112126
113127 from argparse import Namespace
128+
114129 argparser = init_argparser (prog = package , description = description )
115130 logger = init_logger (package )
116131
117132 for arg in arguments :
118- dest = arg .pop (' flags' )
133+ dest = arg .pop (" flags" )
119134 if drop_default :
120- arg [' default' ] = None
135+ arg [" default" ] = None
121136 argparser .add_argument (* dest , ** arg )
122137
123138 args = process_args (argparser , logger = logger )
@@ -129,6 +144,6 @@ def get_args_n_logger(package, description: str, arguments=[], drop_default=Fals
129144
130145
131146def get_kwargs (package , description : str , arguments = [], base_kwargs = {}, drop_default = False , drop_base = True ):
132- """ Like get_args_n_logger, but only returns kwargs """
147+ """Like get_args_n_logger, but only returns kwargs"""
133148 args , logger = get_args_n_logger (package , description , arguments , drop_default = drop_default )
134149 return get_kwargs_from_args (args , logger = logger , base_kwargs = base_kwargs , drop_base = drop_base )
0 commit comments