From cf802b503b65542754c42289ffc512980908e3ba Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 16 Sep 2018 11:49:36 -0700 Subject: [PATCH] Closes #316 - counter output was generated incorrectly --- gooey/gui/formatters.py | 7 +++--- gooey/tests/test_formatters.py | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 gooey/tests/test_formatters.py diff --git a/gooey/gui/formatters.py b/gooey/gui/formatters.py index 7ecc28f..93c7b75 100644 --- a/gooey/gui/formatters.py +++ b/gooey/gui/formatters.py @@ -1,5 +1,7 @@ import os +import itertools + from gooey.gui.util.quoting import quote @@ -45,9 +47,8 @@ def counter(metatdata, value): ''' if not str(value).isdigit(): return None - arg = str(metatdata['commands'][0]).replace('-', '') - repeated_args = arg * int(value) - return '-' + repeated_args + command = str(metatdata['commands'][0]).strip() + return ' '.join(itertools.repeat(command, int(value))) def dropdown(metadata, value): diff --git a/gooey/tests/test_formatters.py b/gooey/tests/test_formatters.py new file mode 100644 index 0000000..1245515 --- /dev/null +++ b/gooey/tests/test_formatters.py @@ -0,0 +1,44 @@ +import argparse +import unittest + +from gui import formatters + + +class TestFormatters(unittest.TestCase): + + + def test_counter_formatter(self): + """ + Should return the first option repeated N times + None if N is unspecified + + Issue #316 - using long-form argument caused formatter to produce incorrect output + """ + expected_outputs = [ + (['-v', '--verbose'], '-v', 1), + (['-v', '--verbose'], '-v -v', 2), + (['-v', '--verbose'], '-v -v -v', 3), + (['-v', '--verbose'], '', 0), + # ensuring that log-forms are handled correctly + (['--verbose', '-v'], '--verbose', 1), + (['--verbose', '-v'], '--verbose --verbose', 2), + (['--verbose', '-v'], '--verbose --verbose --verbose', 3), + # single args + (['-v'], '-v', 1), + (['-v'], '-v -v', 2), + (['--verbose'], '--verbose', 1), + # bad inputs + (['-v'], None, None), + (['-v'], None, 'some-garbage'), + (['-v'], None, 'af3gd'), + ] + + for commands, expected, vebosity_level in expected_outputs: + result = formatters.counter({'commands': commands}, vebosity_level) + self.assertEqual(result, expected) + # make sure that argparse actually accepts it as valid. + if result: + parser = argparse.ArgumentParser() + parser.add_argument('-v', '--verbose', action='count') + parser.parse_args(result.split()) +