Skip to content

Commit 57ca3c2

Browse files
y0urselfgreenbonebot
authored andcommitted
change: Make it possible to read [workspace.project] in cargo.toml
1 parent a5e524c commit 57ca3c2

File tree

2 files changed

+54
-25
lines changed

2 files changed

+54
-25
lines changed

pontos/version/commands/_cargo.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
# SPDX-License-Identifier: GPL-3.0-or-later
44

55
from pathlib import Path
6-
from typing import Iterator, Literal, Tuple, Union
6+
from typing import Any, Iterator, Literal, Tuple, Union
77

88
import tomlkit
9+
from tomlkit.items import Table
910

1011
from .._errors import VersionError
1112
from .._version import Version, VersionUpdate
@@ -20,25 +21,31 @@ def __as_project_document(
2021
) -> Iterator[Tuple[Path, tomlkit.TOMLDocument],]:
2122
"""
2223
Parse the given origin and yields a tuple of path to a
23-
cargo toml that contains a version
24+
Cargo.toml that contains a version
25+
Version should be in the table package or workspace.package
2426
2527
If the origin is invalid toml than it will raise a VersionError.
2628
"""
29+
version: Any = None
2730
content = origin.read_text(encoding="utf-8")
2831
content = tomlkit.parse(content)
2932
package = content.get("package")
30-
if package:
31-
version = package.get("version")
32-
if version:
33-
yield (origin, content)
33+
workspace = content.get("workspace")
34+
if not isinstance(package, Table) and isinstance(workspace, Table):
35+
package = workspace.get("package")
36+
if isinstance(package, Table):
37+
version = package.get("version", "")
38+
if version:
39+
yield (origin, content)
3440
else:
35-
workspace = content.get("workspace")
36-
if workspace:
41+
# check sub directories for toml files with version
42+
if isinstance(workspace, Table):
3743
members = workspace.get("members")
38-
for member in members:
39-
yield from self.__as_project_document(
40-
origin.parent / member / self.project_file_name
41-
)
44+
if members:
45+
for member in members:
46+
yield from self.__as_project_document(
47+
origin.parent / member / self.project_file_name
48+
)
4249
return None
4350

4451
def update_version(
@@ -68,9 +75,12 @@ def update_version(
6875

6976
def get_current_version(self) -> Version:
7077
(_, document) = next(self.__as_project_document(self.project_file_path))
71-
current_version = self.versioning_scheme.parse_version(
72-
document["package"]["version"] # type: ignore[index, arg-type]
73-
)
78+
try:
79+
version = document["package"]["version"] # type: ignore[index, arg-type]
80+
except KeyError:
81+
version = document["workspace"]["package"]["version"] # type: ignore[index, arg-type]
82+
if isinstance(version, str):
83+
current_version = self.versioning_scheme.parse_version(version)
7484
return self.versioning_scheme.from_version(current_version)
7585

7686
def verify_version(

tests/version/commands/test_cargo.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SPDX-FileCopyrightText: 2023 Greenbone AG
1+
# SPDX-FileCopyrightText: 2023-2025 Greenbone AG
22
#
33
# SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -21,6 +21,13 @@
2121
edition = "2021"
2222
license = "GPL-2.0-or-later"
2323
"""
24+
VERSION_WITH_WORKSPACE_EXAMPLE = """
25+
[workspace.package]
26+
name = "nasl-syntax"
27+
version = "1.1.1"
28+
edition = "2025"
29+
license = "GPL-2.0-or-later"
30+
"""
2431
WORKSPACE_EXAMPLE = """
2532
[workspace]
2633
members = [
@@ -42,16 +49,18 @@ def __create_cargo_layout(self) -> Iterator[Path]:
4249
with temp_directory(change_into=True) as temporary_dir:
4350
workspace = temporary_dir / "Cargo.toml"
4451
workspace.write_text(WORKSPACE_EXAMPLE)
45-
members = tomlkit.parse(WORKSPACE_EXAMPLE)["workspace"]["members"]
46-
for cargo_workspace_member in members:
47-
npath = temporary_dir / f"{cargo_workspace_member}"
48-
npath.mkdir()
49-
pf = npath / "Cargo.toml"
50-
pf.write_text(
51-
VERSION_EXAMPLE.replace(
52-
"nasl-syntax", cargo_workspace_member
52+
toml_file = tomlkit.parse(WORKSPACE_EXAMPLE)
53+
members = toml_file["workspace"]["members"] # type: ignore[index, arg-type]
54+
if isinstance(members, tomlkit.items.Table):
55+
for cargo_workspace_member in members:
56+
npath = temporary_dir / f"{cargo_workspace_member}"
57+
npath.mkdir()
58+
pf = npath / "Cargo.toml"
59+
pf.write_text(
60+
VERSION_EXAMPLE.replace(
61+
"nasl-syntax", cargo_workspace_member
62+
)
5363
)
54-
)
5564
yield temporary_dir
5665
return None
5766

@@ -115,3 +124,13 @@ def test_success(self):
115124
version = PEP440VersioningScheme.parse_version("0.1.0")
116125
cargo = CargoVersionCommand(PEP440VersioningScheme)
117126
cargo.verify_version(version)
127+
128+
def test_success_with_workspace(self):
129+
with temp_file(
130+
VERSION_WITH_WORKSPACE_EXAMPLE,
131+
name="Cargo.toml",
132+
change_into=True,
133+
):
134+
version = PEP440VersioningScheme.parse_version("1.1.1")
135+
cargo = CargoVersionCommand(PEP440VersioningScheme)
136+
cargo.verify_version(version)

0 commit comments

Comments
 (0)