Make the new cmd_showing_output select and display data from stderr in
[python_utils.git] / config.py
index fc19f3d70a89483bf8d0f35e8601a220beea69d6..dc0042d5b664228a67a04925435b2e9f83729386 100644 (file)
--- a/config.py
+++ b/config.py
@@ -89,18 +89,20 @@ args = argparse.ArgumentParser(
     description=None,
     formatter_class=argparse.ArgumentDefaultsHelpFormatter,
     fromfile_prefix_chars="@",
-    epilog=f'------------------------------------------------------------------------------\n{program_name} uses config.py ({__file__}) for global, cross-module configuration setup and parsing.\n------------------------------------------------------------------------------'
+    epilog=f'{program_name} uses config.py ({__file__}) for global, cross-module configuration setup and parsing.'
 )
 
 # Keep track of if we've been called and prevent being called more
 # than once.
 config_parse_called = False
 
+
 # A global configuration dictionary that will contain parsed arguments.
 # It is also this variable that modules use to access parsed arguments.
 # This is the data that is most interesting to our callers; it will hold
 # the configuration result.
-config: Dict[str, Any] = {}
+config = {}
+# It would be really nice if this shit worked from interactive python
 
 
 def add_commandline_args(title: str, description: str = ""):
@@ -131,6 +133,16 @@ group.add_argument(
     default=None,
     help='Populate config file compatible with --config_loadfile to save global config for later use.',
 )
+group.add_argument(
+    '--config_rejects_unrecognized_arguments',
+    default=False,
+    action='store_true',
+    help=(
+        'If present, config will raise an exception if it doesn\'t recognize an argument.  The ' +
+        'default behavior is to ignore this so as to allow interoperability with programs that ' +
+        'want to use their own argparse calls to parse their own, separate commandline args.'
+    )
+)
 
 
 def is_flag_already_in_argv(var: str):
@@ -247,6 +259,12 @@ def parse(entry_module: Optional[str]) -> Dict[str, Any]:
     # 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.
+    if len(unknown) > 0:
+        if config['config_rejects_unrecognized_arguments']:
+            raise Exception(
+                f'Encountered unrecognized config argument(s) {unknown} with --config_rejects_unrecognized_arguments enabled; halting.'
+            )
+        saved_messages.append(f'Config encountered unrecognized commandline arguments: {unknown}')
     sys.argv = sys.argv[:1] + unknown
 
     # Check for savefile and populate it if requested.