From 29d19b52f3e117bc3cf164cce3e83f4e7e6de4d3 Mon Sep 17 00:00:00 2001 From: bogay Date: Fri, 22 Sep 2023 01:49:40 +0800 Subject: [PATCH 1/3] test(conf): invalid contents already exist in file handle parse error so that the error message looks better. --- tests/test_conf.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_conf.py b/tests/test_conf.py index 9406ff53f2..43d7d045e0 100644 --- a/tests/test_conf.py +++ b/tests/test_conf.py @@ -6,6 +6,7 @@ import yaml from commitizen import config, defaults, git +from commitizen.exceptions import InvalidConfigurationError PYPROJECT = """ [tool.commitizen] @@ -177,6 +178,13 @@ def test_init_empty_config_content_with_existing_content(self, tmpdir): with open(path, "r", encoding="utf-8") as toml_file: assert toml_file.read() == existing_content + "\n[tool.commitizen]\n" + def test_init_with_invalid_config_content(self, tmpdir): + existing_content = "invalid toml content" + path = tmpdir.mkdir("commitizen").join(".cz.toml") + + with pytest.raises(InvalidConfigurationError, match=r"\.cz\.toml"): + config.TomlConfig(data=existing_content, path=path) + class TestJsonConfig: def test_init_empty_config_content(self, tmpdir): @@ -187,6 +195,13 @@ def test_init_empty_config_content(self, tmpdir): with open(path, "r", encoding="utf-8") as json_file: assert json.load(json_file) == {"commitizen": {}} + def test_init_with_invalid_config_content(self, tmpdir): + existing_content = "invalid json content" + path = tmpdir.mkdir("commitizen").join(".cz.json") + + with pytest.raises(InvalidConfigurationError, match=r"\.cz\.json"): + config.JsonConfig(data=existing_content, path=path) + class TestYamlConfig: def test_init_empty_config_content(self, tmpdir): @@ -196,3 +211,10 @@ def test_init_empty_config_content(self, tmpdir): with open(path, "r") as yaml_file: assert yaml.safe_load(yaml_file) == {"commitizen": {}} + + def test_init_with_invalid_content(self, tmpdir): + existing_content = "invalid: .cz.yaml: content: maybe?" + path = tmpdir.mkdir("commitizen").join(".cz.yaml") + + with pytest.raises(InvalidConfigurationError, match=r"\.cz\.yaml"): + config.YAMLConfig(data=existing_content, path=path) From a6acab220f041015fe2c6e0bf931060a3185c5c4 Mon Sep 17 00:00:00 2001 From: bogay Date: Fri, 22 Sep 2023 01:50:27 +0800 Subject: [PATCH 2/3] fix(conf): handle parse error when init --- commitizen/config/toml_config.py | 9 +++++++-- commitizen/config/yaml_config.py | 11 +++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/commitizen/config/toml_config.py b/commitizen/config/toml_config.py index 1c8ea8ef61..722e6fcfbc 100644 --- a/commitizen/config/toml_config.py +++ b/commitizen/config/toml_config.py @@ -5,6 +5,7 @@ from tomlkit import exceptions, parse, table +from commitizen.exceptions import InvalidConfigurationError from .base_config import BaseConfig @@ -12,8 +13,8 @@ class TomlConfig(BaseConfig): def __init__(self, *, data: bytes | str, path: Path | str): super(TomlConfig, self).__init__() self.is_empty_config = False - self._parse_setting(data) self.add_path(path) + self._parse_setting(data) def init_empty_config_content(self): if os.path.isfile(self.path): @@ -50,7 +51,11 @@ def _parse_setting(self, data: bytes | str) -> None: name = "cz_conventional_commits" ``` """ - doc = parse(data) + try: + doc = parse(data) + except exceptions.ParseError as e: + raise InvalidConfigurationError(f"Failed to parse {self.path}: {e}") + try: self.settings.update(doc["tool"]["commitizen"]) # type: ignore except exceptions.NonExistentKey: diff --git a/commitizen/config/yaml_config.py b/commitizen/config/yaml_config.py index 5863aaa7b5..4cf78cf3ee 100644 --- a/commitizen/config/yaml_config.py +++ b/commitizen/config/yaml_config.py @@ -5,6 +5,7 @@ import yaml from commitizen.git import smart_open +from commitizen.exceptions import InvalidConfigurationError from .base_config import BaseConfig @@ -13,8 +14,8 @@ class YAMLConfig(BaseConfig): def __init__(self, *, data: bytes | str, path: Path | str): super(YAMLConfig, self).__init__() self.is_empty_config = False - self._parse_setting(data) self.add_path(path) + self._parse_setting(data) def init_empty_config_content(self): with smart_open(self.path, "a", encoding=self.encoding) as json_file: @@ -28,7 +29,13 @@ def _parse_setting(self, data: bytes | str) -> None: name: cz_conventional_commits ``` """ - doc = yaml.safe_load(data) + import yaml.scanner + + try: + doc = yaml.safe_load(data) + except yaml.YAMLError as e: + raise InvalidConfigurationError(f"Failed to parse {self.path}: {e}") + try: self.settings.update(doc["commitizen"]) except (KeyError, TypeError): From 7bd57c602007ae4d7f0a1a7892fb194b4ffb6aa4 Mon Sep 17 00:00:00 2001 From: bogay Date: Fri, 22 Sep 2023 01:54:50 +0800 Subject: [PATCH 3/3] refactor(json_config): add parse error message from json lib --- commitizen/config/json_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commitizen/config/json_config.py b/commitizen/config/json_config.py index a22d3485db..5e821a5a95 100644 --- a/commitizen/config/json_config.py +++ b/commitizen/config/json_config.py @@ -47,8 +47,8 @@ def _parse_setting(self, data: bytes | str) -> None: """ try: doc = json.loads(data) - except json.JSONDecodeError: - raise InvalidConfigurationError(f"Failed to parse {self.path}") + except json.JSONDecodeError as e: + raise InvalidConfigurationError(f"Failed to parse {self.path}: {e}") try: self.settings.update(doc["commitizen"])