From 31c32e3327c50ff713445280c061bf2c255feb19 Mon Sep 17 00:00:00 2001 From: Ian Cordasco Date: Tue, 28 Jun 2016 05:47:14 -0500 Subject: [PATCH] Parse hyphenated config names also Previously Flake8 parsed both max-line-length = 110 And max_line_length = 110 From the config file without issue. When we updated our logic, I forgot to test for that and we lost that behaviour temporarily. Closes #152 --- src/flake8/options/config.py | 2 +- src/flake8/options/manager.py | 4 ++- .../config-with-hyphenated-options.ini | 5 ++++ tests/unit/test_merged_config_parser.py | 28 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/config_files/config-with-hyphenated-options.ini diff --git a/src/flake8/options/config.py b/src/flake8/options/config.py index 4556ab1..1d18c2e 100644 --- a/src/flake8/options/config.py +++ b/src/flake8/options/config.py @@ -192,7 +192,7 @@ class MergedConfigParser(object): LOG.debug('Option "%s" returned value: %r', option_name, value) final_value = self._normalize_value(option, value) - config_dict[option_name] = final_value + config_dict[option.config_name] = final_value return config_dict diff --git a/src/flake8/options/manager.py b/src/flake8/options/manager.py index 439cba2..8c3b6bb 100644 --- a/src/flake8/options/manager.py +++ b/src/flake8/options/manager.py @@ -186,7 +186,9 @@ class OptionManager(object): self.parser.add_option(option.to_optparse()) self.options.append(option) if option.parse_from_config: - self.config_options_dict[option.config_name] = option + name = option.config_name + self.config_options_dict[name] = option + self.config_options_dict[name.replace('_', '-')] = option LOG.debug('Registered option "%s".', option) def remove_from_default_ignore(self, error_codes): diff --git a/tests/fixtures/config_files/config-with-hyphenated-options.ini b/tests/fixtures/config_files/config-with-hyphenated-options.ini new file mode 100644 index 0000000..cc0f90e --- /dev/null +++ b/tests/fixtures/config_files/config-with-hyphenated-options.ini @@ -0,0 +1,5 @@ +[flake8] +max-line-length = 110 +enable_extensions = + H101, + H235 diff --git a/tests/unit/test_merged_config_parser.py b/tests/unit/test_merged_config_parser.py index eb57802..1541df4 100644 --- a/tests/unit/test_merged_config_parser.py +++ b/tests/unit/test_merged_config_parser.py @@ -204,3 +204,31 @@ def test_parsed_configs_are_equivalent(optmanager, config_fixture_path): os.path.abspath('bar/'), os.path.abspath('bogus/'), ] + + +@pytest.mark.parametrize('config_file', [ + 'tests/fixtures/config_files/config-with-hyphenated-options.ini' +]) +def test_parsed_hyphenated_and_underscored_names(optmanager, config_file): + """Verify we find hyphenated option names as well as underscored. + + This tests for options like --max-line-length and --enable-extensions + which are able to be specified either as max-line-length or + max_line_length in our config files. + """ + optmanager.add_option('--max-line-length', parse_from_config=True, + type='int') + optmanager.add_option('--enable-extensions', parse_from_config=True, + comma_separated_list=True) + parser = config.MergedConfigParser(optmanager) + config_finder = parser.config_finder + + with mock.patch.object(config_finder, 'local_config_files') as localcfs: + localcfs.return_value = [config_file] + with mock.patch.object(config_finder, + 'user_config_file') as usercf: + usercf.return_value = [] + parsed_config = parser.merge_user_and_local_config() + + assert parsed_config['max_line_length'] == 110 + assert parsed_config['enable_extensions'] == ['H101', 'H235']