33import fnmatch
44import glob
55from pathlib import Path
6+ from typing import TYPE_CHECKING
67
7- import tomlkit
8+ from tomlkit import TOMLDocument , dumps , parse
9+ from tomlkit .exceptions import NonExistentKey
10+ from tomlkit .items import AoT
811
912from commitizen .providers .base_provider import TomlProvider
1013
1114
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-
1915class CargoProvider (TomlProvider ):
2016 """
2117 Cargo version management
@@ -30,65 +26,77 @@ class CargoProvider(TomlProvider):
3026 def lock_file (self ) -> Path :
3127 return Path () / self .lock_filename
3228
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" ]
31+ assert isinstance (out , str )
32+ return out
4133
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
4936
5037 def set_version (self , version : str ) -> None :
5138 super ().set_version (version )
5239 if self .lock_file .exists ():
5340 self .set_lock_version (version )
5441
5542 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+ if TYPE_CHECKING :
48+ assert isinstance (packages , AoT )
49+
5950 try :
60- package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
51+ cargo_package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
52+ if TYPE_CHECKING :
53+ assert isinstance (cargo_package_name , str )
6154 for i , package in enumerate (packages ):
62- if package ["name" ] == package_name :
55+ if package ["name" ] == cargo_package_name :
6356 cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
6457 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 = []
58+ except NonExistentKey :
59+ workspace = cargo_toml_content .get ("workspace" , {})
60+ if TYPE_CHECKING :
61+ assert isinstance (workspace , dict )
62+ workspace_members = workspace .get ("members" , [])
63+ excluded_workspace_members = workspace .get ("exclude" , [])
64+ members_inheriting : list [str ] = []
7365
7466 for member in workspace_members :
7567 for path in glob .glob (member , recursive = True ):
76- if matches_exclude (path , excluded_workspace_members ):
68+ if any (
69+ fnmatch .fnmatch (path , pattern )
70+ for pattern in excluded_workspace_members
71+ ):
7772 continue
73+
7874 cargo_file = Path (path ) / "Cargo.toml"
79- cargo_toml_content = tomlkit .parse (cargo_file .read_text ())
75+ package_content = parse (cargo_file .read_text ()).get ("package" , {})
76+ if TYPE_CHECKING :
77+ assert isinstance (package_content , dict )
8078 try :
81- version_workspace = cargo_toml_content ["package" ]["version" ][ # type: ignore[index]
82- "workspace"
83- ]
79+ version_workspace = package_content ["version" ]["workspace" ]
8480 if version_workspace is True :
85- package_name = cargo_toml_content ["package" ]["name" ] # type: ignore[index]
81+ package_name = package_content ["name" ]
82+ if TYPE_CHECKING :
83+ assert isinstance (package_name , str )
8684 members_inheriting .append (package_name )
87- except tomlkit . exceptions . NonExistentKey :
88- continue
85+ except NonExistentKey :
86+ pass
8987
9088 for i , package in enumerate (packages ):
9189 if package ["name" ] in members_inheriting :
9290 cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
9391
94- self .lock_file .write_text (tomlkit .dumps (cargo_lock_content ))
92+ self .lock_file .write_text (dumps (cargo_lock_content ))
93+
94+
95+ def _try_get_workspace (document : TOMLDocument ) -> dict :
96+ try :
97+ workspace = document ["workspace" ]
98+ if TYPE_CHECKING :
99+ assert isinstance (workspace , dict )
100+ return workspace
101+ except NonExistentKey :
102+ return document
0 commit comments