diff --git a/src/flake8/options/config.py b/src/flake8/options/config.py index 7e770b6..71429af 100644 --- a/src/flake8/options/config.py +++ b/src/flake8/options/config.py @@ -60,13 +60,21 @@ class ConfigFileFinder(object): @staticmethod def _read_config(files): config = configparser.RawConfigParser() - try: - found_files = config.read(files) - except configparser.ParsingError: - LOG.exception("There was an error trying to parse a config " - "file. The files we were attempting to parse " - "were: %r", files) - found_files = [] + if isinstance(files, (str, type(u''))): + files = [files] + + found_files = [] + for filename in files: + try: + found_files.extend(config.read(filename)) + except UnicodeDecodeError: + LOG.exception("There was an error decoding a config file." + "The file with a problem was %s.", + filename) + except configparser.ParsingError: + LOG.exception("There was an error trying to parse a config " + "file. The file with a problem was %s.", + filename) return (config, found_files) def cli_config(self, files): diff --git a/tests/unit/test_config_file_finder.py b/tests/unit/test_config_file_finder.py index 2a9f903..d8502e7 100644 --- a/tests/unit/test_config_file_finder.py +++ b/tests/unit/test_config_file_finder.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Tests for the ConfigFileFinder.""" import configparser import os @@ -135,4 +136,14 @@ def test_local_configs_double_read(): ]) def test_read_config_catches_broken_config_files(files): """Verify that we do not allow the exception to bubble up.""" - assert config.ConfigFileFinder._read_config(files)[1] == [] + _, parsed = config.ConfigFileFinder._read_config(files) + assert BROKEN_CONFIG_PATH not in parsed + + +def test_read_config_catches_decoding_errors(tmpdir): + """Verify that we do not allow the exception to bubble up.""" + setup_cfg = tmpdir.join('setup.cfg') + # pick an encoding that's unlikely to be a default + setup_cfg.write_binary(u'[x]\ny = €'.encode('cp1252')) + _, parsed = config.ConfigFileFinder._read_config(setup_cfg.strpath) + assert parsed == []