From f0d49cf8bc73670cee9a32a0b7a1fadcd5f46f30 Mon Sep 17 00:00:00 2001 From: Fabio Tesser Date: Fri, 10 Sep 2021 10:34:14 +0200 Subject: [PATCH 1/2] Added test for BooleanOptionalAction. --- tests/test_configargparse.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/test_configargparse.py b/tests/test_configargparse.py index 2ff5fb9..162b6e7 100644 --- a/tests/test_configargparse.py +++ b/tests/test_configargparse.py @@ -97,6 +97,7 @@ def testBasicCase1(self): self.add_arg("-x", "--arg-x", action="store_true") self.add_arg("-y", "--arg-y", dest="y1", type=int, required=True) self.add_arg("--arg-z", action="append", type=float, required=True) + self.add_arg('--foo', action=argparse.BooleanOptionalAction, default=False) # make sure required args are enforced self.assertParseArgsRaises("too few arg" @@ -112,12 +113,13 @@ def testBasicCase1(self): args="file1.txt file2.txt file3.txt -x -y 1") # check values after setting args on command line - ns = self.parse(args="file1.txt --arg-x -y 3 --arg-z 10", + ns = self.parse(args="file1.txt --arg-x -y 3 --arg-z 10 --foo", config_file_contents="") self.assertListEqual(ns.filenames, ["file1.txt"]) self.assertEqual(ns.arg_x, True) self.assertEqual(ns.y1, 3) self.assertEqual(ns.arg_z, [10]) + self.assertEqual(ns.foo, True) self.assertRegex(self.format_values(), 'Command Line Args: file1.txt --arg-x -y 3 --arg-z 10') @@ -129,23 +131,27 @@ def testBasicCase1(self): arg-y = 10 arg-z = 30 arg-z = 40 + foo = True """) self.assertListEqual(ns.filenames, ["file1.txt", "file2.txt"]) self.assertEqual(ns.arg_x, True) self.assertEqual(ns.y1, 10) self.assertEqual(ns.arg_z, [40]) + self.assertEqual(ns.foo, True) self.assertRegex(self.format_values(), 'Command Line Args: \\s+ file1.txt file2.txt\n' 'Config File \\(method arg\\):\n' ' arg-x: \\s+ True\n' ' arg-y: \\s+ 10\n' - ' arg-z: \\s+ 40\n') + ' arg-z: \\s+ 40\n' + ' foo: \\s+ True\n') # check values after setting args in both command line and config file ns = self.parse(args="file1.txt file2.txt --arg-x -y 3 --arg-z 100 ", config_file_contents="""arg-y = 31.5 arg-z = 30 + foo = True """) self.format_help() self.format_values() @@ -153,6 +159,7 @@ def testBasicCase1(self): self.assertEqual(ns.arg_x, True) self.assertEqual(ns.y1, 3) self.assertEqual(ns.arg_z, [100]) + self.assertEqual(ns.foo, True) self.assertRegex(self.format_values(), "Command Line Args: file1.txt file2.txt --arg-x -y 3 --arg-z 100") From 9e2cd177f40af145efc80a493d03d9d9f9baaba4 Mon Sep 17 00:00:00 2001 From: Fabio Tesser Date: Fri, 10 Sep 2021 10:41:06 +0200 Subject: [PATCH 2/2] Fixed convert_item_to_command_line_arg for BooleanOptionalAction. --- configargparse.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/configargparse.py b/configargparse.py index 9c2df50..7136c00 100644 --- a/configargparse.py +++ b/configargparse.py @@ -784,15 +784,24 @@ def convert_item_to_command_line_arg(self, action, key, value): command_line_key = \ self.get_command_line_key_for_unknown_config_file_setting(key) else: - command_line_key = action.option_strings[-1] + if not isinstance(action, argparse.BooleanOptionalAction): + command_line_key = action.option_strings[-1] # handle boolean value if action is not None and isinstance(action, ACTION_TYPES_THAT_DONT_NEED_A_VALUE): if value.lower() in ("true", "yes", "1"): - args.append( command_line_key ) + if not isinstance(action, argparse.BooleanOptionalAction): + args.append( command_line_key ) + else: + # --foo + args.append(action.option_strings[0]) elif value.lower() in ("false", "no", "0"): # don't append when set to "false" / "no" - pass + if not isinstance(action, argparse.BooleanOptionalAction): + pass + else: + # --no-foo + args.append(action.option_strings[1]) elif isinstance(action, argparse._CountAction): for arg in args: if any([arg.startswith(s) for s in action.option_strings]):