diff options
| -rw-r--r-- | flake8/main.py | 6 | ||||
| -rw-r--r-- | flake8/tests/test_util.py | 114 | ||||
| -rw-r--r-- | flake8/util.py | 24 |
3 files changed, 93 insertions, 51 deletions
diff --git a/flake8/main.py b/flake8/main.py index 297618a..570b318 100644 --- a/flake8/main.py +++ b/flake8/main.py @@ -93,18 +93,18 @@ class Flake8Command(setuptools.Command): for opt in parser.option_list: cmd_name = opt._long_opts[0][2:] option_name = cmd_name.replace('-', '_') - self.option_to_cmds[option_name] = cmd_name + self.option_to_cmds[option_name] = opt setattr(self, option_name, None) def finalize_options(self): self.options_dict = {} - for (option_name, cmd_name) in self.option_to_cmds.items(): + for (option_name, opt) in self.option_to_cmds.items(): if option_name in ['help', 'verbose']: continue value = getattr(self, option_name) if value is None: continue - value = option_normalizer(value) + value = option_normalizer(value, opt, option_name) # Check if there's any values that need to be fixed. if option_name == "include" and isinstance(value, str): value = re.findall('[^,;\s]+', value) diff --git a/flake8/tests/test_util.py b/flake8/tests/test_util.py index 32a1d44..bfbc660 100644 --- a/flake8/tests/test_util.py +++ b/flake8/tests/test_util.py @@ -1,85 +1,119 @@ +import optparse import unittest from flake8.util import option_normalizer -class TestOptionSerializer(unittest.TestCase): +class TestOptionSerializerParsesTrue(unittest.TestCase): + + def setUp(self): + self.option = optparse.Option('--foo', action='store_true') + self.option_name = 'fake_option' def test_1_is_true(self): - option = option_normalizer('1') - self.assertTrue(option) + value = option_normalizer('1', self.option, self.option_name) + self.assertTrue(value) def test_T_is_true(self): - option = option_normalizer('T') - self.assertTrue(option) + value = option_normalizer('T', self.option, self.option_name) + self.assertTrue(value) def test_TRUE_is_true(self): - option = option_normalizer('TRUE') - self.assertTrue(option, True) + value = option_normalizer('TRUE', self.option, self.option_name) + self.assertTrue(value, True) def test_ON_is_true(self): - option = option_normalizer('ON') - self.assertTrue(option) + value = option_normalizer('ON', self.option, self.option_name) + self.assertTrue(value) def test_t_is_true(self): - option = option_normalizer('t') - self.assertTrue(option) + value = option_normalizer('t', self.option, self.option_name) + self.assertTrue(value) def test_true_is_true(self): - option = option_normalizer('true') - self.assertTrue(option) + value = option_normalizer('true', self.option, self.option_name) + self.assertTrue(value) def test_on_is_true(self): - option = option_normalizer('on') - self.assertTrue(option) + value = option_normalizer('on', self.option, self.option_name) + self.assertTrue(value) + + +class TestOptionSerializerParsesFalse(unittest.TestCase): + + def setUp(self): + self.option = optparse.Option('--foo', action='store_true') + self.option_name = 'fake_option' def test_0_is_false(self): - option = option_normalizer('0') - self.assertFalse(option) + value = option_normalizer('0', self.option, self.option_name) + self.assertFalse(value) def test_F_is_false(self): - option = option_normalizer('F') - self.assertFalse(option) + value = option_normalizer('F', self.option, self.option_name) + self.assertFalse(value) def test_FALSE_is_false(self): - option = option_normalizer('FALSE') - self.assertFalse(option) + value = option_normalizer('FALSE', self.option, self.option_name) + self.assertFalse(value) def test_OFF_is_false(self): - option = option_normalizer('OFF') - self.assertFalse(option) + value = option_normalizer('OFF', self.option, self.option_name) + self.assertFalse(value) def test_f_is_false(self): - option = option_normalizer('f') - self.assertFalse(option) + value = option_normalizer('f', self.option, self.option_name) + self.assertFalse(value) def test_false_is_false(self): - option = option_normalizer('false') - self.assertFalse(option) + value = option_normalizer('false', self.option, self.option_name) + self.assertFalse(value) def test_off_is_false(self): - option = option_normalizer('off') - self.assertFalse(option) + value = option_normalizer('off', self.option, self.option_name) + self.assertFalse(value) + - def test_parses_lists(self): - answer = ['F401', 'F402', 'F403', 'F404'] +class TestOptionSerializerParsesLists(unittest.TestCase): - option = option_normalizer('F401,F402,F403,F404') - self.assertEqual(option, answer) + def setUp(self): + self.option = optparse.Option('--select') + self.option_name = 'select' + self.answer = ['F401', 'F402', 'F403', 'F404'] - option = option_normalizer('F401 ,F402 ,F403 ,F404') - self.assertEqual(option, answer) + def test_parses_simple_comma_separated_lists(self): + value = option_normalizer('F401,F402,F403,F404', self.option, + self.option_name) + self.assertEqual(value, self.answer) - option = option_normalizer('F401, F402, F403, F404') - self.assertEqual(option, answer) + def test_parses_less_simple_comma_separated_lists(self): + value = option_normalizer('F401 ,F402 ,F403 ,F404', self.option, + self.option_name) + self.assertEqual(value, self.answer) - option = option_normalizer('''\ + value = option_normalizer('F401, F402, F403, F404', self.option, + self.option_name) + self.assertEqual(value, self.answer) + + def test_parses_comma_separated_lists_with_newlines(self): + value = option_normalizer('''\ F401, F402, F403, F404, - ''') - self.assertEqual(option, answer) + ''', self.option, self.option_name) + self.assertEqual(value, self.answer) + + +class TestOptionSerializerParsesInts(unittest.TestCase): + + def setUp(self): + self.option = optparse.Option('--max-complexity', type='int') + self.option_name = 'max_complexity' + + def test_parses_an_int(self): + value = option_normalizer('2', self.option, self.option_name) + self.assertEqual(value, 2) if __name__ == '__main__': diff --git a/flake8/util.py b/flake8/util.py index da33f42..4e2c0d3 100644 --- a/flake8/util.py +++ b/flake8/util.py @@ -57,13 +57,21 @@ def force_disable_jobs(styleguide): return is_windows() or is_using_stdin(styleguide.paths) -def option_normalizer(value): - if str(value).upper() in ('1', 'T', 'TRUE', 'ON'): - value = True - if str(value).upper() in ('0', 'F', 'FALSE', 'OFF'): - value = False - - if isinstance(value, str): - value = [opt.strip() for opt in value.split(',') if opt.strip()] +INT_TYPES = ('int', 'count') +BOOL_TYPES = ('store_true', 'store_false') +LIST_OPTIONS = ('select', 'ignore', 'exclude', 'enable_extensions') + + +def option_normalizer(value, option, option_name): + if option.action in BOOL_TYPES: + if str(value).upper() in ('1', 'T', 'TRUE', 'ON'): + value = True + if str(value).upper() in ('0', 'F', 'FALSE', 'OFF'): + value = False + elif option.type in INT_TYPES: + value = int(value) + elif option_name in LIST_OPTIONS: + if isinstance(value, str): + value = [opt.strip() for opt in value.split(',') if opt.strip()] return value |
