Skip to content

Commit 44bce60

Browse files
vemilanowoile
authored andcommitted
fix: members in workspace, use exclude
1 parent 1f2d26a commit 44bce60

File tree

2 files changed

+201
-28
lines changed

2 files changed

+201
-28
lines changed

commitizen/providers/cargo_provider.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import fnmatch
34
import glob
45
from pathlib import Path
56

@@ -8,6 +9,13 @@
89
from commitizen.providers.base_provider import TomlProvider
910

1011

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+
1119
class CargoProvider(TomlProvider):
1220
"""
1321
Cargo version management
@@ -55,27 +63,30 @@ def set_lock_version(self, version: str) -> None:
5563
cargo_lock_content["package"][i]["version"] = version # type: ignore[index]
5664
break
5765
except tomlkit.exceptions.NonExistentKey:
58-
workspace_members = (
59-
cargo_toml_content.get("workspace", {})
60-
.get("package", {})
61-
.get("members", [])
66+
workspace_members = cargo_toml_content.get("workspace", {}).get(
67+
"members", []
68+
)
69+
excluded_workspace_members = cargo_toml_content.get("workspace", {}).get(
70+
"exclude", []
6271
)
6372
members_inheriting = []
6473

6574
for member in workspace_members:
66-
matched_paths = glob.glob(member, recursive=True)
67-
for path in matched_paths:
68-
cargo_file = Path(path) / "Cargo.toml"
69-
cargo_toml_content = tomlkit.parse(cargo_file.read_text())
70-
try:
71-
version_workspace = cargo_toml_content["package"]["version"][ # type: ignore[index]
72-
"workspace"
73-
]
74-
if version_workspace is True:
75-
package_name = cargo_toml_content["package"]["name"] # type: ignore[index]
76-
members_inheriting.append(package_name)
77-
except tomlkit.exceptions.NonExistentKey:
78-
continue
75+
for path in glob.glob(member, recursive=True):
76+
if not matches_exclude(path, excluded_workspace_members):
77+
cargo_file = Path(path) / "Cargo.toml"
78+
cargo_toml_content = tomlkit.parse(cargo_file.read_text())
79+
try:
80+
version_workspace = cargo_toml_content["package"][
81+
"version"
82+
][ # type: ignore[index]
83+
"workspace"
84+
]
85+
if version_workspace is True:
86+
package_name = cargo_toml_content["package"]["name"] # type: ignore[index]
87+
members_inheriting.append(package_name)
88+
except tomlkit.exceptions.NonExistentKey:
89+
continue
7990

8091
for i, package in enumerate(packages):
8192
if package["name"] in members_inheriting:

tests/providers/test_cargo_provider.py

Lines changed: 173 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,64 @@
2323
"""
2424

2525
CARGO_WORKSPACE_TOML = """\
26+
[workspace]
27+
members = ["member1", "folder/member2", "crates/*"]
28+
exclude = ["crates/member4", "folder/member5"]
29+
2630
[workspace.package]
27-
members = ["whatever"]
2831
version = "0.1.0"
2932
"""
3033

31-
CARGO_WORKSPACE_MEMBER_TOML = """\
34+
CARGO_WORKSPACE_MEMBERS = [
35+
{
36+
"path": "member1",
37+
"content": """\
3238
[package]
33-
name = "whatever"
39+
name = "member1"
3440
version.workspace = true
35-
"""
41+
""",
42+
},
43+
{
44+
"path": "folder/member2",
45+
"content": """\
46+
[package]
47+
name = "member2"
48+
version.workspace = "1.1.1"
49+
""",
50+
},
51+
{
52+
"path": "crates/member3",
53+
"content": """\
54+
[package]
55+
name = "member3"
56+
version.workspace = true
57+
""",
58+
},
59+
{
60+
"path": "crates/member4",
61+
"content": """\
62+
[package]
63+
name = "member4"
64+
version.workspace = "2.2.2"
65+
""",
66+
},
67+
{
68+
"path": "folder/member5",
69+
"content": """\
70+
[package]
71+
name = "member5"
72+
version.workspace = "3.3.3"
73+
""",
74+
},
75+
]
76+
3677

3778
CARGO_WORKSPACE_TOML_EXPECTED = """\
79+
[workspace]
80+
members = ["member1", "folder/member2", "crates/*"]
81+
exclude = ["crates/member4", "folder/member5"]
82+
3883
[workspace.package]
39-
members = ["whatever"]
4084
version = "42.1"
4185
"""
4286

@@ -66,6 +110,120 @@
66110
]
67111
"""
68112

113+
CARGO_WORKSPACE_LOCK = """\
114+
[[package]]
115+
name = "member1"
116+
version = "0.1.0"
117+
source = "registry+https://github.com/rust-lang/crates.io-index"
118+
checksum = "123abc"
119+
dependencies = [
120+
"packageA",
121+
"packageB",
122+
"packageC",
123+
]
124+
125+
[[package]]
126+
name = "member2"
127+
version = "1.1.1"
128+
source = "registry+https://github.com/rust-lang/crates.io-index"
129+
checksum = "123abc"
130+
dependencies = [
131+
"packageA",
132+
"packageB",
133+
"packageC",
134+
]
135+
136+
[[package]]
137+
name = "member3"
138+
version = "0.1.0"
139+
source = "registry+https://github.com/rust-lang/crates.io-index"
140+
checksum = "123abc"
141+
dependencies = [
142+
"packageA",
143+
"packageB",
144+
"packageC",
145+
]
146+
147+
[[package]]
148+
name = "member4"
149+
version = "2.2.2"
150+
source = "registry+https://github.com/rust-lang/crates.io-index"
151+
checksum = "123abc"
152+
dependencies = [
153+
"packageA",
154+
"packageB",
155+
"packageC",
156+
]
157+
158+
[[package]]
159+
name = "member5"
160+
version = "3.3.3"
161+
source = "registry+https://github.com/rust-lang/crates.io-index"
162+
checksum = "123abc"
163+
dependencies = [
164+
"packageA",
165+
"packageB",
166+
"packageC",
167+
]
168+
"""
169+
170+
CARGO_WORKSPACE_LOCK_EXPECTED = """\
171+
[[package]]
172+
name = "member1"
173+
version = "42.1"
174+
source = "registry+https://github.com/rust-lang/crates.io-index"
175+
checksum = "123abc"
176+
dependencies = [
177+
"packageA",
178+
"packageB",
179+
"packageC",
180+
]
181+
182+
[[package]]
183+
name = "member2"
184+
version = "1.1.1"
185+
source = "registry+https://github.com/rust-lang/crates.io-index"
186+
checksum = "123abc"
187+
dependencies = [
188+
"packageA",
189+
"packageB",
190+
"packageC",
191+
]
192+
193+
[[package]]
194+
name = "member3"
195+
version = "42.1"
196+
source = "registry+https://github.com/rust-lang/crates.io-index"
197+
checksum = "123abc"
198+
dependencies = [
199+
"packageA",
200+
"packageB",
201+
"packageC",
202+
]
203+
204+
[[package]]
205+
name = "member4"
206+
version = "2.2.2"
207+
source = "registry+https://github.com/rust-lang/crates.io-index"
208+
checksum = "123abc"
209+
dependencies = [
210+
"packageA",
211+
"packageB",
212+
"packageC",
213+
]
214+
215+
[[package]]
216+
name = "member5"
217+
version = "3.3.3"
218+
source = "registry+https://github.com/rust-lang/crates.io-index"
219+
checksum = "123abc"
220+
dependencies = [
221+
"packageA",
222+
"packageB",
223+
"packageC",
224+
]
225+
"""
226+
69227

70228
@pytest.mark.parametrize(
71229
"content, expected",
@@ -104,9 +262,9 @@ def test_cargo_provider(
104262
),
105263
(
106264
CARGO_WORKSPACE_TOML,
107-
CARGO_LOCK,
265+
CARGO_WORKSPACE_LOCK,
108266
CARGO_WORKSPACE_TOML_EXPECTED,
109-
CARGO_LOCK_EXPECTED,
267+
CARGO_WORKSPACE_LOCK_EXPECTED,
110268
),
111269
),
112270
)
@@ -122,10 +280,14 @@ def test_cargo_provider_with_lock(
122280
file = chdir / filename
123281
file.write_text(dedent(toml_content))
124282

125-
member_folder = chdir / "whatever"
126-
os.mkdir(member_folder)
127-
member_file = member_folder / "Cargo.toml"
128-
member_file.write_text(dedent(CARGO_WORKSPACE_MEMBER_TOML))
283+
# Create workspace members
284+
os.mkdir(chdir / "crates")
285+
os.mkdir(chdir / "folder")
286+
for i in range(0, 5):
287+
member_folder = Path(CARGO_WORKSPACE_MEMBERS[i]["path"])
288+
os.mkdir(member_folder)
289+
member_file = member_folder / "Cargo.toml"
290+
member_file.write_text(dedent(CARGO_WORKSPACE_MEMBERS[i]["content"]))
129291

130292
lock_filename = CargoProvider.lock_filename
131293
lock_file = chdir / lock_filename

0 commit comments

Comments
 (0)