22
33import os
44import shutil
5- from typing import Any
5+ from typing import Any , NamedTuple
66
77import questionary
88import yaml
1717from commitizen .version_schemes import KNOWN_SCHEMES , Version , get_version_scheme
1818
1919
20+ class _VersionProviderOption (NamedTuple ):
21+ value : str
22+ description : str
23+
24+ @property
25+ def title (self ) -> str :
26+ return f"{ self .value } : { self .description } "
27+
28+
29+ _VERSION_PROVIDER_CHOICES = [
30+ questionary .Choice (title = option .title , value = option .value )
31+ for option in (
32+ _VersionProviderOption (
33+ value = "commitizen" ,
34+ description = "Fetch and set version in commitizen config (default)" ,
35+ ),
36+ _VersionProviderOption (
37+ value = "cargo" ,
38+ description = "Get and set version from Cargo.toml:project.version field" ,
39+ ),
40+ _VersionProviderOption (
41+ value = "composer" ,
42+ description = "Get and set version from composer.json:project.version field" ,
43+ ),
44+ _VersionProviderOption (
45+ value = "npm" ,
46+ description = "Get and set version from package.json:project.version field" ,
47+ ),
48+ _VersionProviderOption (
49+ value = "pep621" ,
50+ description = "Get and set version from pyproject.toml:project.version field" ,
51+ ),
52+ _VersionProviderOption (
53+ value = "poetry" ,
54+ description = "Get and set version from pyproject.toml:tool.poetry.version field" ,
55+ ),
56+ _VersionProviderOption (
57+ value = "uv" ,
58+ description = "Get and set version from pyproject.toml and uv.lock" ,
59+ ),
60+ _VersionProviderOption (
61+ value = "scm" ,
62+ description = "Fetch the version from git and does not need to set it back" ,
63+ ),
64+ )
65+ ]
66+
67+
2068class ProjectInfo :
2169 """Discover information about the current folder."""
2270
@@ -228,45 +276,32 @@ def _ask_tag_format(self, latest_tag: str) -> str:
228276 def _ask_version_provider (self ) -> str :
229277 """Ask for setting: version_provider"""
230278
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 ))
262279 version_provider : str = questionary .select (
263280 "Choose the source of the version:" ,
264- choices = choices ,
281+ choices = _VERSION_PROVIDER_CHOICES ,
265282 style = self .cz .style ,
266- default = default ,
283+ default = self . _default_version_provider ,
267284 ).unsafe_ask ()
268285 return version_provider
269286
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+
270305 def _ask_version_scheme (self ) -> str :
271306 """Ask for setting: version_scheme"""
272307 default_scheme = "pep440" if self .project_info .is_python else "semver"
@@ -291,7 +326,7 @@ def _ask_major_version_zero(self, version: Version) -> bool:
291326 return major_version_zero
292327
293328 def _ask_update_changelog_on_bump (self ) -> bool :
294- "Ask for setting: update_changelog_on_bump"
329+ """ Ask for setting: update_changelog_on_bump"" "
295330 update_changelog_on_bump : bool = questionary .confirm (
296331 "Create changelog automatically on bump" ,
297332 default = True ,
0 commit comments