2
2
3
3
import fnmatch
4
4
import glob
5
+ from collections .abc import Container
5
6
from pathlib import Path
6
7
7
- import tomlkit
8
+ from tomlkit import TOMLDocument , dumps , parse
9
+ from tomlkit .exceptions import NonExistentKey
10
+ from tomlkit .items import AoT
8
11
9
12
from commitizen .providers .base_provider import TomlProvider
10
13
11
14
12
- def matches_exclude (path : str , exclude_patterns : list [str ]) -> bool :
13
- for pattern in exclude_patterns :
14
- if fnmatch .fnmatch (path , pattern ):
15
- return True
16
- return False
17
-
18
-
19
15
class CargoProvider (TomlProvider ):
20
16
"""
21
17
Cargo version management
@@ -30,65 +26,71 @@ class CargoProvider(TomlProvider):
30
26
def lock_file (self ) -> Path :
31
27
return Path () / self .lock_filename
32
28
33
- def get (self , document : tomlkit .TOMLDocument ) -> str :
34
- # If there is a root package, change its version (but not the workspace version)
35
- try :
36
- return document ["package" ]["version" ] # type: ignore[index,return-value]
37
- # Else, bump the workspace version
38
- except tomlkit .exceptions .NonExistentKey :
39
- ...
40
- return document ["workspace" ]["package" ]["version" ] # type: ignore[index,return-value]
29
+ def get (self , document : TOMLDocument ) -> str :
30
+ out = _try_get_workspace (document )["package" ]["version" ] # type: ignore[index]
31
+ assert isinstance (out , str )
32
+ return out
41
33
42
- def set (self , document : tomlkit .TOMLDocument , version : str ) -> None :
43
- try :
44
- document ["workspace" ]["package" ]["version" ] = version # type: ignore[index]
45
- return
46
- except tomlkit .exceptions .NonExistentKey :
47
- ...
48
- document ["package" ]["version" ] = version # type: ignore[index]
34
+ def set (self , document : TOMLDocument , version : str ) -> None :
35
+ _try_get_workspace (document )["package" ]["version" ] = version # type: ignore[index]
49
36
50
37
def set_version (self , version : str ) -> None :
51
38
super ().set_version (version )
52
39
if self .lock_file .exists ():
53
40
self .set_lock_version (version )
54
41
55
42
def set_lock_version (self , version : str ) -> None :
56
- cargo_toml_content = tomlkit .parse (self .file .read_text ())
57
- cargo_lock_content = tomlkit .parse (self .lock_file .read_text ())
58
- packages : tomlkit .items .AoT = cargo_lock_content ["package" ] # type: ignore[assignment]
43
+ cargo_toml_content = parse (self .file .read_text ())
44
+ cargo_lock_content = parse (self .lock_file .read_text ())
45
+ packages = cargo_lock_content ["package" ]
46
+
47
+ assert isinstance (packages , AoT )
48
+
59
49
try :
60
- package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
50
+ cargo_package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
51
+ assert isinstance (cargo_package_name , str )
61
52
for i , package in enumerate (packages ):
62
- if package ["name" ] == package_name :
53
+ if package ["name" ] == cargo_package_name :
63
54
cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
64
55
break
65
- except tomlkit .exceptions .NonExistentKey :
66
- workspace_members = cargo_toml_content .get ("workspace" , {}).get (
67
- "members" , []
68
- )
69
- excluded_workspace_members = cargo_toml_content .get ("workspace" , {}).get (
70
- "exclude" , []
71
- )
72
- members_inheriting = []
56
+ except NonExistentKey :
57
+ workspace = cargo_toml_content .get ("workspace" , {})
58
+ assert isinstance (workspace , dict )
59
+ workspace_members = workspace .get ("members" , [])
60
+ excluded_workspace_members = workspace .get ("exclude" , [])
61
+ members_inheriting : list [str ] = []
73
62
74
63
for member in workspace_members :
75
64
for path in glob .glob (member , recursive = True ):
76
- if matches_exclude (path , excluded_workspace_members ):
65
+ if any (
66
+ fnmatch .fnmatch (path , pattern )
67
+ for pattern in excluded_workspace_members
68
+ ):
77
69
continue
70
+
78
71
cargo_file = Path (path ) / "Cargo.toml"
79
- cargo_toml_content = tomlkit .parse (cargo_file .read_text ())
72
+ package_content = parse (cargo_file .read_text ()).get ("package" , {})
73
+ assert isinstance (package_content , dict )
80
74
try :
81
- version_workspace = cargo_toml_content ["package" ]["version" ][ # type: ignore[index]
82
- "workspace"
83
- ]
75
+ version_workspace = package_content ["version" ]["workspace" ]
84
76
if version_workspace is True :
85
- package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
77
+ package_name = package_content ["name" ]
78
+ assert isinstance (package_name , str )
86
79
members_inheriting .append (package_name )
87
- except tomlkit . exceptions . NonExistentKey :
88
- continue
80
+ except NonExistentKey :
81
+ pass
89
82
90
83
for i , package in enumerate (packages ):
91
84
if package ["name" ] in members_inheriting :
92
85
cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
93
86
94
- self .lock_file .write_text (tomlkit .dumps (cargo_lock_content ))
87
+ self .lock_file .write_text (dumps (cargo_lock_content ))
88
+
89
+
90
+ def _try_get_workspace (document : TOMLDocument ) -> Container :
91
+ try :
92
+ workspace = document ["workspace" ]
93
+ assert isinstance (workspace , Container )
94
+ return workspace
95
+ except NonExistentKey :
96
+ return document
0 commit comments