2
2
3
3
import os
4
4
import shutil
5
- from typing import Any
5
+ from typing import Any , NamedTuple
6
6
7
7
import questionary
8
8
import yaml
17
17
from commitizen .version_schemes import KNOWN_SCHEMES , Version , get_version_scheme
18
18
19
19
20
+ class _VersionProviderOption (NamedTuple ):
21
+ provider_name : str
22
+ description : str
23
+
24
+ @property
25
+ def title (self ) -> str :
26
+ return f"{ self .provider_name } : { self .description } "
27
+
28
+
29
+ _VERSION_PROVIDER_CHOICES = tuple (
30
+ questionary .Choice (title = option .title , value = option .provider_name )
31
+ for option in (
32
+ _VersionProviderOption (
33
+ provider_name = "commitizen" ,
34
+ description = "Fetch and set version in commitizen config (default)" ,
35
+ ),
36
+ _VersionProviderOption (
37
+ provider_name = "cargo" ,
38
+ description = "Get and set version from Cargo.toml:project.version field" ,
39
+ ),
40
+ _VersionProviderOption (
41
+ provider_name = "composer" ,
42
+ description = "Get and set version from composer.json:project.version field" ,
43
+ ),
44
+ _VersionProviderOption (
45
+ provider_name = "npm" ,
46
+ description = "Get and set version from package.json:project.version field" ,
47
+ ),
48
+ _VersionProviderOption (
49
+ provider_name = "pep621" ,
50
+ description = "Get and set version from pyproject.toml:project.version field" ,
51
+ ),
52
+ _VersionProviderOption (
53
+ provider_name = "poetry" ,
54
+ description = "Get and set version from pyproject.toml:tool.poetry.version field" ,
55
+ ),
56
+ _VersionProviderOption (
57
+ provider_name = "uv" ,
58
+ description = "Get and set version from pyproject.toml and uv.lock" ,
59
+ ),
60
+ _VersionProviderOption (
61
+ provider_name = "scm" ,
62
+ description = "Fetch the version from git and does not need to set it back" ,
63
+ ),
64
+ )
65
+ )
66
+
67
+
20
68
class ProjectInfo :
21
69
"""Discover information about the current folder."""
22
70
@@ -228,45 +276,32 @@ def _ask_tag_format(self, latest_tag: str) -> str:
228
276
def _ask_version_provider (self ) -> str :
229
277
"""Ask for setting: version_provider"""
230
278
231
- OPTS = {
232
- "commitizen" : "commitizen: Fetch and set version in commitizen config (default)" ,
233
- "cargo" : "cargo: Get and set version from Cargo.toml:project.version field" ,
234
- "composer" : "composer: Get and set version from composer.json:project.version field" ,
235
- "npm" : "npm: Get and set version from package.json:project.version field" ,
236
- "pep621" : "pep621: Get and set version from pyproject.toml:project.version field" ,
237
- "poetry" : "poetry: Get and set version from pyproject.toml:tool.poetry.version field" ,
238
- "uv" : "uv: Get and set version from pyproject.toml and uv.lock" ,
239
- "scm" : "scm: Fetch the version from git and does not need to set it back" ,
240
- }
241
-
242
- default_val = "commitizen"
243
- if self .project_info .is_python :
244
- if self .project_info .is_python_poetry :
245
- default_val = "poetry"
246
- elif self .project_info .is_python_uv :
247
- default_val = "uv"
248
- else :
249
- default_val = "pep621"
250
- elif self .project_info .is_rust_cargo :
251
- default_val = "cargo"
252
- elif self .project_info .is_npm_package :
253
- default_val = "npm"
254
- elif self .project_info .is_php_composer :
255
- default_val = "composer"
256
-
257
- choices = [
258
- questionary .Choice (title = title , value = value )
259
- for value , title in OPTS .items ()
260
- ]
261
- default = next (filter (lambda x : x .value == default_val , choices ))
262
279
version_provider : str = questionary .select (
263
280
"Choose the source of the version:" ,
264
- choices = choices ,
281
+ choices = _VERSION_PROVIDER_CHOICES ,
265
282
style = self .cz .style ,
266
- default = default ,
283
+ default = self . _default_version_provider ,
267
284
).unsafe_ask ()
268
285
return version_provider
269
286
287
+ @property
288
+ def _default_version_provider (self ) -> str :
289
+ if self .project_info .is_python :
290
+ if self .project_info .is_python_poetry :
291
+ return "poetry"
292
+ if self .project_info .is_python_uv :
293
+ return "uv"
294
+ return "pep621"
295
+
296
+ if self .project_info .is_rust_cargo :
297
+ return "cargo"
298
+ if self .project_info .is_npm_package :
299
+ return "npm"
300
+ if self .project_info .is_php_composer :
301
+ return "composer"
302
+
303
+ return "commitizen"
304
+
270
305
def _ask_version_scheme (self ) -> str :
271
306
"""Ask for setting: version_scheme"""
272
307
default_scheme = "pep440" if self .project_info .is_python else "semver"
@@ -291,7 +326,7 @@ def _ask_major_version_zero(self, version: Version) -> bool:
291
326
return major_version_zero
292
327
293
328
def _ask_update_changelog_on_bump (self ) -> bool :
294
- "Ask for setting: update_changelog_on_bump"
329
+ """ Ask for setting: update_changelog_on_bump"" "
295
330
update_changelog_on_bump : bool = questionary .confirm (
296
331
"Create changelog automatically on bump" ,
297
332
default = True ,
0 commit comments