Skip to content

Commit

Permalink
Merge pull request #248 from ftesser/fix_reading_from_config_file_of_…
Browse files Browse the repository at this point in the history
…argparse.BooleanOptionalAction

Fix reading from config file of argparse.boolean optional action
  • Loading branch information
bw2 committed Sep 30, 2021
2 parents 5313cb6 + 9e2cd17 commit 8991132
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
15 changes: 12 additions & 3 deletions configargparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]):
Expand Down
11 changes: 9 additions & 2 deletions tests/test_configargparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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')
Expand All @@ -129,30 +131,35 @@ 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()
self.assertListEqual(ns.filenames, ["file1.txt", "file2.txt"])
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")
Expand Down

0 comments on commit 8991132

Please sign in to comment.