Skip to content

Commit e994e12

Browse files
committed
fix(provider): use encoding settings in config
1 parent fbafcaf commit e994e12

File tree

4 files changed

+149
-4
lines changed

4 files changed

+149
-4
lines changed

commitizen/providers/base_provider.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class FileProvider(VersionProvider):
4949
def file(self) -> Path:
5050
return Path() / self.filename
5151

52+
def _get_encoding(self) -> str:
53+
return self.config.settings["encoding"]
54+
5255

5356
class JsonProvider(FileProvider):
5457
"""
@@ -58,11 +61,11 @@ class JsonProvider(FileProvider):
5861
indent: ClassVar[int] = 2
5962

6063
def get_version(self) -> str:
61-
document = json.loads(self.file.read_text())
64+
document = json.loads(self.file.read_text(encoding=self._get_encoding()))
6265
return self.get(document)
6366

6467
def set_version(self, version: str) -> None:
65-
document = json.loads(self.file.read_text())
68+
document = json.loads(self.file.read_text(encoding=self._get_encoding()))
6669
self.set(document, version)
6770
self.file.write_text(json.dumps(document, indent=self.indent) + "\n")
6871

@@ -79,11 +82,11 @@ class TomlProvider(FileProvider):
7982
"""
8083

8184
def get_version(self) -> str:
82-
document = tomlkit.parse(self.file.read_text())
85+
document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding()))
8386
return self.get(document)
8487

8588
def set_version(self, version: str) -> None:
86-
document = tomlkit.parse(self.file.read_text())
89+
document = tomlkit.parse(self.file.read_text(encoding=self._get_encoding()))
8790
self.set(document, version)
8891
self.file.write_text(tomlkit.dumps(document))
8992

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "encoding-test-composer",
3+
"description": "Тест описания для проверки кодировки",
4+
"version": "0.1.0"
5+
}
6+
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
[project]
2+
name = "pythonproject-test"
3+
version = "0.4.1"
4+
description = "Add your description here"
5+
readme = "README.md"
6+
requires-python = ">=3.12"
7+
dependencies = []
8+
9+
10+
[tool.commitizen]
11+
name = "cz_customize"
12+
tag_format = "v$version"
13+
version_scheme = "pep440"
14+
version_provider = "uv"
15+
update_changelog_on_bump = true
16+
changelog_start_rev = "v1.1.0"
17+
18+
[tool.commitizen.customize]
19+
message_template = "{{ change_type }}{% if scope != 'none' %}({{ scope }}){% endif %}: {{ message }}"
20+
commit_parser = '^(?P<change_type>feat|fix|refactor|test|perf|misc):\s(?P<message>.*)'
21+
schema_pattern = '(feat|fix|refactor|test|perf|misc)(\((api|core)\))?:\s(.{3,})'
22+
bump_pattern = "^(feat|fix|refactor|test|perf|misc)"
23+
change_type_map = { "feat" = "Новое", "fix" = "Исправление" }
24+
25+
[[tool.commitizen.customize.questions]]
26+
name = "change_type"
27+
type = "list"
28+
message = "Выберите тип изменений"
29+
choices = [
30+
{ value = "feat", name = "feat: Новая функциональность" },
31+
{ value = "fix", name = "fix: Исправление" },
32+
{ value = "refactor", name = "refactor: Рефакторинг" },
33+
{ value = "test", name = "test: Изменение авто-тестов" },
34+
{ value = "perf", name = "perf: Оптимизации" },
35+
{ value = "misc", name = "misc: Другое" },
36+
]

tests/providers/test_base_provider.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@
77
from commitizen.exceptions import VersionProviderUnknown
88
from commitizen.providers import get_provider
99
from commitizen.providers.commitizen_provider import CommitizenProvider
10+
from commitizen.providers.composer_provider import ComposerProvider
11+
from commitizen.providers.pep621_provider import Pep621Provider
12+
from commitizen.providers.uv_provider import UvProvider
1013

1114
if TYPE_CHECKING:
15+
from pathlib import Path
16+
1217
from commitizen.config.base_config import BaseConfig
1318

1419

@@ -22,3 +27,98 @@ def test_raise_for_unknown_provider(config: BaseConfig):
2227
config.settings["version_provider"] = "unknown"
2328
with pytest.raises(VersionProviderUnknown):
2429
get_provider(config)
30+
31+
32+
@pytest.mark.parametrize("encoding", ["utf-8", "latin-1"])
33+
def test_file_provider_get_encoding(config: BaseConfig, encoding: str):
34+
"""_get_encoding should return the configured encoding."""
35+
config.settings["encoding"] = encoding
36+
provider = ComposerProvider(config)
37+
assert provider._get_encoding() == encoding
38+
39+
40+
def test_json_provider_uses_encoding_with_encoding_fixture(
41+
config: BaseConfig,
42+
chdir: Path,
43+
data_dir: Path,
44+
):
45+
"""JsonProvider should correctly read a JSON file with non-ASCII content."""
46+
source = data_dir / "encoding_test_composer.json"
47+
target = chdir / "composer.json"
48+
target.write_text(source.read_text(encoding="utf-8"), encoding="utf-8")
49+
50+
config.settings["encoding"] = "utf-8"
51+
config.settings["version_provider"] = "composer"
52+
53+
provider = get_provider(config)
54+
assert isinstance(provider, ComposerProvider)
55+
assert provider.get_version() == "0.1.0"
56+
57+
58+
def test_toml_provider_uses_encoding_with_encoding_fixture(
59+
config: BaseConfig,
60+
chdir: Path,
61+
data_dir: Path,
62+
):
63+
"""TomlProvider should correctly read a TOML file with non-ASCII content."""
64+
source = data_dir / "encoding_test_pyproject.toml"
65+
target = chdir / "pyproject.toml"
66+
target.write_text(source.read_text(encoding="utf-8"), encoding="utf-8")
67+
68+
config.settings["encoding"] = "utf-8"
69+
config.settings["version_provider"] = "uv"
70+
71+
provider = get_provider(config)
72+
assert isinstance(provider, UvProvider)
73+
assert provider.get_version() == "0.4.1"
74+
75+
76+
def test_json_provider_handles_various_unicode_characters(
77+
config: BaseConfig,
78+
chdir: Path,
79+
):
80+
"""JsonProvider should handle a wide range of Unicode characters."""
81+
config.settings["encoding"] = "utf-8"
82+
config.settings["version_provider"] = "composer"
83+
84+
filename = ComposerProvider.filename
85+
file = chdir / filename
86+
file.write_text(
87+
(
88+
"{\n"
89+
' "name": "多言語-имя-árbol",\n'
90+
' "description": "Emoji 😀 – 漢字 – العربية",\n'
91+
' "version": "0.1.0"\n'
92+
"}\n"
93+
),
94+
encoding="utf-8",
95+
)
96+
97+
provider = get_provider(config)
98+
assert isinstance(provider, ComposerProvider)
99+
assert provider.get_version() == "0.1.0"
100+
101+
102+
def test_toml_provider_handles_various_unicode_characters(
103+
config: BaseConfig,
104+
chdir: Path,
105+
):
106+
"""TomlProvider should handle a wide range of Unicode characters."""
107+
config.settings["encoding"] = "utf-8"
108+
config.settings["version_provider"] = "pep621"
109+
110+
filename = Pep621Provider.filename
111+
file = chdir / filename
112+
file.write_text(
113+
(
114+
"[project]\n"
115+
'name = "多言語-имя-árbol"\n'
116+
'description = "Emoji 😀 – 漢字 – العربية"\n'
117+
'version = "0.1.0"\n'
118+
),
119+
encoding="utf-8",
120+
)
121+
122+
provider = get_provider(config)
123+
assert isinstance(provider, Pep621Provider)
124+
assert provider.get_version() == "0.1.0"

0 commit comments

Comments
 (0)