7
7
from pathlib import Path
8
8
from typing import Callable
9
9
10
+ from pdm .backend ._vendor .packaging .version import Version
10
11
from pdm .backend .exceptions import ConfigError , PDMWarning , ValidationError
11
12
from pdm .backend .hooks .base import Context
12
13
from pdm .backend .hooks .version .scm import SCMVersion as SCMVersion
@@ -55,12 +56,12 @@ def pdm_build_initialize(self, context: Context) -> None:
55
56
)
56
57
return
57
58
options = {k : v for k , v in version_config .items () if k != "source" }
58
- metadata ["version" ] = getattr ( self , f"resolve_version_from_ { source } " ) (
59
- context , ** options
59
+ metadata ["version" ] = str (
60
+ getattr ( self , f"resolve_version_from_ { source } " )( context , ** options )
60
61
)
61
62
metadata ["dynamic" ].remove ("version" )
62
63
63
- def resolve_version_from_file (self , context : Context , path : str ) -> str :
64
+ def resolve_version_from_file (self , context : Context , path : str ) -> Version :
64
65
"""Resolve version from a file."""
65
66
version_source = context .root / path
66
67
with open (version_source , encoding = "utf-8" ) as fp :
@@ -72,7 +73,7 @@ def resolve_version_from_file(self, context: Context, path: str) -> str:
72
73
f"Couldn't find version in file { version_source !r} , "
73
74
"it should appear as `__version__ = 'a.b.c'`." ,
74
75
)
75
- return match .group (1 )
76
+ return Version ( match .group (1 ) )
76
77
77
78
def resolve_version_from_scm (
78
79
self ,
@@ -83,7 +84,7 @@ def resolve_version_from_scm(
83
84
tag_filter : str | None = None ,
84
85
version_format : str | None = None ,
85
86
fallback_version : str | None = None ,
86
- ) -> str :
87
+ ) -> Version :
87
88
if os .environ .get ("PDM_BUILD_SCM_VERSION" ):
88
89
version = os .environ ["PDM_BUILD_SCM_VERSION" ]
89
90
else :
@@ -114,9 +115,18 @@ def resolve_version_from_scm(
114
115
version = version_formatter (scm_version , context ) # type: ignore[call-arg]
115
116
else :
116
117
version = version_formatter (scm_version ) # type: ignore[call-arg]
117
-
118
+ try :
119
+ parsed_version = Version (version )
120
+ except ValueError :
121
+ if fallback_version is not None :
122
+ return Version (fallback_version )
123
+ raise ConfigError (
124
+ f"Invalid version { version } , it must comply with PEP 440. \n "
125
+ "You can still specify the version via environment variable "
126
+ "`PDM_BUILD_SCM_VERSION`, or specify `fallback_version` config."
127
+ )
118
128
self ._write_version (context , version , write_to , write_template )
119
- return version
129
+ return parsed_version
120
130
121
131
def _write_version (
122
132
self ,
@@ -146,8 +156,17 @@ def resolve_version_from_call(
146
156
getter : str ,
147
157
write_to : str | None = None ,
148
158
write_template : str = "{}\n " ,
149
- ) -> str :
159
+ fallback_version : str | None = None ,
160
+ ) -> Version :
150
161
version_getter , args = evaluate_module_attribute (getter , context .root )
151
162
version = version_getter (* args )
163
+ if version is None :
164
+ if fallback_version is not None :
165
+ return Version (fallback_version )
166
+ else :
167
+ raise ConfigError (
168
+ "Cannot get version from the call, you can specify fallback version via `fallback_version` config."
169
+ )
170
+ parsed_version = Version (version )
152
171
self ._write_version (context , version , write_to , write_template )
153
- return version
172
+ return parsed_version
0 commit comments