From e994e12431c69f104d69894ec430151d535c020f Mon Sep 17 00:00:00 2001 From: Yu-Ting Hsiung Date: Mon, 9 Feb 2026 15:41:46 +0800 Subject: [PATCH 1/2] fix(provider): use encoding settings in config --- commitizen/providers/base_provider.py | 11 ++- tests/data/encoding_test_composer.json | 6 ++ tests/data/encoding_test_pyproject.toml | 36 +++++++++ tests/providers/test_base_provider.py | 100 ++++++++++++++++++++++++ 4 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 tests/data/encoding_test_composer.json create mode 100644 tests/data/encoding_test_pyproject.toml diff --git a/commitizen/providers/base_provider.py b/commitizen/providers/base_provider.py index 84b745e326..3861cbf82a 100644 --- a/commitizen/providers/base_provider.py +++ b/commitizen/providers/base_provider.py @@ -49,6 +49,9 @@ class FileProvider(VersionProvider): def file(self) -> Path: return Path() / self.filename + def _get_encoding(self) -> str: + return self.config.settings["encoding"] + class JsonProvider(FileProvider): """ @@ -58,11 +61,11 @@ class JsonProvider(FileProvider): indent: ClassVar[int] = 2 def get_version(self) -> str: - document = json.loads(self.file.read_text()) + document = json.loads(self.file.read_text(encoding=self._get_encoding())) return self.get(document) def set_version(self, version: str) -> None: - document = json.loads(self.file.read_text()) + document = json.loads(self.file.read_text(encoding=self._get_encoding())) self.set(document, version) self.file.write_text(json.dumps(document, indent=self.indent) + "\n") @@ -79,11 +82,11 @@ class TomlProvider(FileProvider): """ def get_version(self) -> str: - document = tomlkit.parse(self.file.read_text()) + document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding())) return self.get(document) def set_version(self, version: str) -> None: - document = tomlkit.parse(self.file.read_text()) + document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding())) self.set(document, version) self.file.write_text(tomlkit.dumps(document)) diff --git a/tests/data/encoding_test_composer.json b/tests/data/encoding_test_composer.json new file mode 100644 index 0000000000..2cbf2e70cc --- /dev/null +++ b/tests/data/encoding_test_composer.json @@ -0,0 +1,6 @@ +{ + "name": "encoding-test-composer", + "description": "Тест описания для проверки кодировки", + "version": "0.1.0" +} + diff --git a/tests/data/encoding_test_pyproject.toml b/tests/data/encoding_test_pyproject.toml new file mode 100644 index 0000000000..6e47e88ecd --- /dev/null +++ b/tests/data/encoding_test_pyproject.toml @@ -0,0 +1,36 @@ +[project] +name = "pythonproject-test" +version = "0.4.1" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [] + + +[tool.commitizen] +name = "cz_customize" +tag_format = "v$version" +version_scheme = "pep440" +version_provider = "uv" +update_changelog_on_bump = true +changelog_start_rev = "v1.1.0" + +[tool.commitizen.customize] +message_template = "{{ change_type }}{% if scope != 'none' %}({{ scope }}){% endif %}: {{ message }}" +commit_parser = '^(?Pfeat|fix|refactor|test|perf|misc):\s(?P.*)' +schema_pattern = '(feat|fix|refactor|test|perf|misc)(\((api|core)\))?:\s(.{3,})' +bump_pattern = "^(feat|fix|refactor|test|perf|misc)" +change_type_map = { "feat" = "Новое", "fix" = "Исправление" } + +[[tool.commitizen.customize.questions]] +name = "change_type" +type = "list" +message = "Выберите тип изменений" +choices = [ + { value = "feat", name = "feat: Новая функциональность" }, + { value = "fix", name = "fix: Исправление" }, + { value = "refactor", name = "refactor: Рефакторинг" }, + { value = "test", name = "test: Изменение авто-тестов" }, + { value = "perf", name = "perf: Оптимизации" }, + { value = "misc", name = "misc: Другое" }, +] \ No newline at end of file diff --git a/tests/providers/test_base_provider.py b/tests/providers/test_base_provider.py index 782a8ba89e..4129fa8c22 100644 --- a/tests/providers/test_base_provider.py +++ b/tests/providers/test_base_provider.py @@ -7,8 +7,13 @@ from commitizen.exceptions import VersionProviderUnknown from commitizen.providers import get_provider from commitizen.providers.commitizen_provider import CommitizenProvider +from commitizen.providers.composer_provider import ComposerProvider +from commitizen.providers.pep621_provider import Pep621Provider +from commitizen.providers.uv_provider import UvProvider if TYPE_CHECKING: + from pathlib import Path + from commitizen.config.base_config import BaseConfig @@ -22,3 +27,98 @@ def test_raise_for_unknown_provider(config: BaseConfig): config.settings["version_provider"] = "unknown" with pytest.raises(VersionProviderUnknown): get_provider(config) + + +@pytest.mark.parametrize("encoding", ["utf-8", "latin-1"]) +def test_file_provider_get_encoding(config: BaseConfig, encoding: str): + """_get_encoding should return the configured encoding.""" + config.settings["encoding"] = encoding + provider = ComposerProvider(config) + assert provider._get_encoding() == encoding + + +def test_json_provider_uses_encoding_with_encoding_fixture( + config: BaseConfig, + chdir: Path, + data_dir: Path, +): + """JsonProvider should correctly read a JSON file with non-ASCII content.""" + source = data_dir / "encoding_test_composer.json" + target = chdir / "composer.json" + target.write_text(source.read_text(encoding="utf-8"), encoding="utf-8") + + config.settings["encoding"] = "utf-8" + config.settings["version_provider"] = "composer" + + provider = get_provider(config) + assert isinstance(provider, ComposerProvider) + assert provider.get_version() == "0.1.0" + + +def test_toml_provider_uses_encoding_with_encoding_fixture( + config: BaseConfig, + chdir: Path, + data_dir: Path, +): + """TomlProvider should correctly read a TOML file with non-ASCII content.""" + source = data_dir / "encoding_test_pyproject.toml" + target = chdir / "pyproject.toml" + target.write_text(source.read_text(encoding="utf-8"), encoding="utf-8") + + config.settings["encoding"] = "utf-8" + config.settings["version_provider"] = "uv" + + provider = get_provider(config) + assert isinstance(provider, UvProvider) + assert provider.get_version() == "0.4.1" + + +def test_json_provider_handles_various_unicode_characters( + config: BaseConfig, + chdir: Path, +): + """JsonProvider should handle a wide range of Unicode characters.""" + config.settings["encoding"] = "utf-8" + config.settings["version_provider"] = "composer" + + filename = ComposerProvider.filename + file = chdir / filename + file.write_text( + ( + "{\n" + ' "name": "多言語-имя-árbol",\n' + ' "description": "Emoji 😀 – 漢字 – العربية",\n' + ' "version": "0.1.0"\n' + "}\n" + ), + encoding="utf-8", + ) + + provider = get_provider(config) + assert isinstance(provider, ComposerProvider) + assert provider.get_version() == "0.1.0" + + +def test_toml_provider_handles_various_unicode_characters( + config: BaseConfig, + chdir: Path, +): + """TomlProvider should handle a wide range of Unicode characters.""" + config.settings["encoding"] = "utf-8" + config.settings["version_provider"] = "pep621" + + filename = Pep621Provider.filename + file = chdir / filename + file.write_text( + ( + "[project]\n" + 'name = "多言語-имя-árbol"\n' + 'description = "Emoji 😀 – 漢字 – العربية"\n' + 'version = "0.1.0"\n' + ), + encoding="utf-8", + ) + + provider = get_provider(config) + assert isinstance(provider, Pep621Provider) + assert provider.get_version() == "0.1.0" From e1e9d7a48197f700efd0ef1daa7eef84a60143da Mon Sep 17 00:00:00 2001 From: Yu-Ting Hsiung Date: Mon, 9 Feb 2026 15:46:07 +0800 Subject: [PATCH 2/2] fix: revert --- commitizen/providers/base_provider.py | 11 ++++------- tests/providers/test_base_provider.py | 8 -------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/commitizen/providers/base_provider.py b/commitizen/providers/base_provider.py index 3861cbf82a..84b745e326 100644 --- a/commitizen/providers/base_provider.py +++ b/commitizen/providers/base_provider.py @@ -49,9 +49,6 @@ class FileProvider(VersionProvider): def file(self) -> Path: return Path() / self.filename - def _get_encoding(self) -> str: - return self.config.settings["encoding"] - class JsonProvider(FileProvider): """ @@ -61,11 +58,11 @@ class JsonProvider(FileProvider): indent: ClassVar[int] = 2 def get_version(self) -> str: - document = json.loads(self.file.read_text(encoding=self._get_encoding())) + document = json.loads(self.file.read_text()) return self.get(document) def set_version(self, version: str) -> None: - document = json.loads(self.file.read_text(encoding=self._get_encoding())) + document = json.loads(self.file.read_text()) self.set(document, version) self.file.write_text(json.dumps(document, indent=self.indent) + "\n") @@ -82,11 +79,11 @@ class TomlProvider(FileProvider): """ def get_version(self) -> str: - document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding())) + document = tomlkit.parse(self.file.read_text()) return self.get(document) def set_version(self, version: str) -> None: - document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding())) + document = tomlkit.parse(self.file.read_text()) self.set(document, version) self.file.write_text(tomlkit.dumps(document)) diff --git a/tests/providers/test_base_provider.py b/tests/providers/test_base_provider.py index 4129fa8c22..329329172d 100644 --- a/tests/providers/test_base_provider.py +++ b/tests/providers/test_base_provider.py @@ -29,14 +29,6 @@ def test_raise_for_unknown_provider(config: BaseConfig): get_provider(config) -@pytest.mark.parametrize("encoding", ["utf-8", "latin-1"]) -def test_file_provider_get_encoding(config: BaseConfig, encoding: str): - """_get_encoding should return the configured encoding.""" - config.settings["encoding"] = encoding - provider = ComposerProvider(config) - assert provider._get_encoding() == encoding - - def test_json_provider_uses_encoding_with_encoding_fixture( config: BaseConfig, chdir: Path,