22
33import fnmatch
44import glob
5+ from collections .abc import Container
56from pathlib import Path
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,71 @@ 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" ] # type: ignore[index]
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 # type: ignore[index]
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+ assert isinstance (packages , AoT )
48+
5949 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 )
6152 for i , package in enumerate (packages ):
62- if package ["name" ] == package_name :
53+ if package ["name" ] == cargo_package_name :
6354 cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
6455 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 ] = []
7362
7463 for member in workspace_members :
7564 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+ ):
7769 continue
70+
7871 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 )
8074 try :
81- version_workspace = cargo_toml_content ["package" ]["version" ][ # type: ignore[index]
82- "workspace"
83- ]
75+ version_workspace = package_content ["version" ]["workspace" ]
8476 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 )
8679 members_inheriting .append (package_name )
87- except tomlkit . exceptions . NonExistentKey :
88- continue
80+ except NonExistentKey :
81+ pass
8982
9083 for i , package in enumerate (packages ):
9184 if package ["name" ] in members_inheriting :
9285 cargo_lock_content ["package" ][i ]["version" ] = version # type: ignore[index]
9386
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