diff --git a/src/flake8/options/config.py b/src/flake8/options/config.py index 7cba936..9756e7d 100644 --- a/src/flake8/options/config.py +++ b/src/flake8/options/config.py @@ -20,7 +20,7 @@ def _find_config_file(path: str) -> Optional[str]: for candidate in ("setup.cfg", "tox.ini", ".flake8"): cfg_path = os.path.join(path, candidate) try: - cfg.read(cfg_path) + cfg.read(cfg_path, encoding="UTF-8") except (UnicodeDecodeError, configparser.ParsingError) as e: LOG.warning("ignoring unparseable config %s: %s", cfg_path, e) else: @@ -61,7 +61,7 @@ def load_config( cfg = configparser.RawConfigParser() if config is not None: - if not cfg.read(config): + if not cfg.read(config, encoding="UTF-8"): raise exceptions.ExecutionError( f"The specified config file does not exist: {config}" ) @@ -72,7 +72,7 @@ def load_config( # TODO: remove this and replace it with configuration modifying plugins # read the additional configs afterwards for filename in extra: - cfg.read(filename) + cfg.read(filename, encoding="UTF-8") return cfg, cfg_dir diff --git a/tests/unit/test_options_config.py b/tests/unit/test_options_config.py index c5d1476..02dd218 100644 --- a/tests/unit/test_options_config.py +++ b/tests/unit/test_options_config.py @@ -118,6 +118,31 @@ def test_load_config_append_config(tmpdir): assert cfg_dir == str(tmpdir) +NON_ASCII_CONFIG = "# ☃\n[flake8]\nindent-size=8\n" + + +def test_load_auto_config_utf8(tmpdir): + tmpdir.join("setup.cfg").write_text(NON_ASCII_CONFIG, encoding="UTF-8") + with tmpdir.as_cwd(): + cfg, cfg_dir = config.load_config(None, [], isolated=False) + assert cfg["flake8"]["indent-size"] == "8" + + +def test_load_explicit_config_utf8(tmpdir): + tmpdir.join("t.cfg").write_text(NON_ASCII_CONFIG, encoding="UTF-8") + with tmpdir.as_cwd(): + cfg, cfg_dir = config.load_config("t.cfg", [], isolated=False) + assert cfg["flake8"]["indent-size"] == "8" + + +def test_load_extra_config_utf8(tmpdir): + tmpdir.join("setup.cfg").write("[flake8]\nindent-size=2\n") + tmpdir.join("t.cfg").write_text(NON_ASCII_CONFIG, encoding="UTF-8") + with tmpdir.as_cwd(): + cfg, cfg_dir = config.load_config(None, ["t.cfg"], isolated=False) + assert cfg["flake8"]["indent-size"] == "8" + + @pytest.fixture def opt_manager(): ret = OptionManager(version="123", plugin_versions="", parents=[])