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