33# SPDX-License-Identifier: GPL-3.0-or-later
44
55from pathlib import Path
6- from typing import Iterator , Literal , Tuple , Union
6+ from typing import Any , Iterator , Literal , Tuple , Union
77
88import tomlkit
9+ from tomlkit .items import Table
910
1011from .._errors import VersionError
1112from .._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 (
0 commit comments