import sys
from typing import Any, Dict, List
-import string_utils
+# This module is commonly used by others in here and should avoid
+# taking any unnecessary dependencies back on them.
# Note: at this point in time, logging hasn't been configured and
# anything we log will come out the root logger.
# A global parser that we will collect arguments into.
+prog = os.path.basename(sys.argv[0])
args = argparse.ArgumentParser(
- description=f"This program uses config.py ({__file__}) for global, cross-module configuration.",
+ description=None,
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
fromfile_prefix_chars="@",
+ epilog=f'-----------------------------------------------------------------------------\n{prog} uses config.py ({__file__}) for global, cross-module configuration setup and parsing.\n-----------------------------------------------------------------------------'
)
config_parse_called = False
return False
-def parse() -> Dict[str, Any]:
+def parse(entry_module: str) -> Dict[str, Any]:
"""Main program should call this early in main()"""
global config_parse_called
if config_parse_called:
- return
+ return config
config_parse_called = True
global saved_messages
+ # If we're about to do the usage message dump, put the main module's
+ # argument group first in the list, please.
+ reordered_action_groups = []
+ prog = sys.argv[0]
+ for arg in sys.argv:
+ if arg == '--help' or arg == '-h':
+ print(entry_module)
+ for group in args._action_groups:
+ if entry_module in group.title or prog in group.title:
+ reordered_action_groups.insert(0, group)
+ else:
+ reordered_action_groups.append(group)
+ args._action_groups = reordered_action_groups
+
# Examine the environment variables to settings that match
- # known flags.
+ # known flags. For a flag called --example_flag the corresponding
+ # environment variable would be called EXAMPLE_FLAG.
usage_message = args.format_usage()
optional = False
var = ''
saved_messages.append(
f'Initialized from environment: {var} = {value}'
)
- if len(chunks) == 1 and string_utils.to_bool(value):
+ from string_utils import to_bool
+ if len(chunks) == 1 and to_bool(value):
sys.argv.append(var)
elif len(chunks) > 1:
sys.argv.append(var)
next
# Parse (possibly augmented) commandline args with argparse normally.
- #config.update(vars(args.parse_args()))
known, unknown = args.parse_known_args()
config.update(vars(known))
# Reconstruct the argv with unrecognized flags for the benefit of
- # future argument parsers.
+ # future argument parsers. For example, unittest_main in python
+ # has some of its own flags. If we didn't recognize it, maybe
+ # someone else will.
sys.argv = sys.argv[:1] + unknown
if config['config_savefile']: