1
1
from __future__ import annotations
2
2
3
+ import logging
3
4
import os
4
5
import sys
5
6
from contextlib import contextmanager
@@ -61,6 +62,10 @@ def __init__(self, backend_failed: BackendFailed) -> None:
61
62
)
62
63
63
64
65
+ class BuildEditableNotSupported (RuntimeError ):
66
+ """raised when build editable is not supported"""
67
+
68
+
64
69
class ToxCmdStatus (CmdStatus ):
65
70
def __init__ (self , execute_status : ExecuteStatus ) -> None :
66
71
self ._execute_status = execute_status
@@ -136,6 +141,8 @@ def register_run_env(self, run_env: RunToxEnv) -> Generator[tuple[str, str], Pac
136
141
def _setup_env (self ) -> None :
137
142
super ()._setup_env ()
138
143
if "editable" in self .builds :
144
+ if not self ._frontend .optional_hooks ["build_editable" ]:
145
+ raise BuildEditableNotSupported
139
146
build_requires = self ._frontend .get_requires_for_build_editable ().requires
140
147
self .installer .install (build_requires , PythonPackageToxEnv .__name__ , "requires_for_build_editable" )
141
148
if "wheel" in self .builds :
@@ -159,7 +166,17 @@ def _teardown(self) -> None:
159
166
160
167
def perform_packaging (self , for_env : EnvConfigSet ) -> list [Package ]:
161
168
"""build the package to install"""
162
- deps = self ._load_deps (for_env )
169
+ try :
170
+ deps = self ._load_deps (for_env )
171
+ except BuildEditableNotSupported :
172
+ logging .error (
173
+ f"package config for { for_env .env_name } is editable, however the build backend { self ._frontend .backend } "
174
+ f" does not support PEP-660, falling back to editable-legacy - change your configuration to it" ,
175
+ )
176
+ self .builds .remove ("editable" )
177
+ self .builds .add ("editable-legacy" )
178
+ for_env ._defined ["package" ].value = "editable-legacy" # type: ignore
179
+ deps = self ._load_deps (for_env )
163
180
of_type : str = for_env ["package" ]
164
181
if of_type == "editable-legacy" :
165
182
self .setup ()
@@ -176,8 +193,8 @@ def perform_packaging(self, for_env: EnvConfigSet) -> list[Package]:
176
193
return w_env .perform_packaging (for_env )
177
194
else :
178
195
self .setup ()
196
+ method = "build_editable" if of_type == "editable" else "build_wheel"
179
197
with self ._pkg_lock :
180
- method = "build_editable" if of_type == "editable" else "build_wheel"
181
198
path = getattr (self ._frontend , method )(
182
199
wheel_directory = self .pkg_dir ,
183
200
metadata_directory = self .meta_folder ,
@@ -293,12 +310,7 @@ def _send(self, cmd: str, **kwargs: Any) -> tuple[Any, str, str]:
293
310
if cmd in ("prepare_metadata_for_build_wheel" , "prepare_metadata_for_build_editable" ):
294
311
# given we'll build a wheel we might skip the prepare step
295
312
if "wheel" in self ._tox_env .builds or "editable" in self ._tox_env .builds :
296
- result = {
297
- "code" : 1 ,
298
- "exc_type" : "AvoidRedundant" ,
299
- "exc_msg" : "will need to build wheel either way, avoid prepare" ,
300
- }
301
- raise BackendFailed (result , "" , "" )
313
+ return None , "" , "" # will need to build wheel either way, avoid prepare
302
314
return super ()._send (cmd , ** kwargs )
303
315
except BackendFailed as exception :
304
316
raise exception if isinstance (exception , ToxBackendFailed ) else ToxBackendFailed (exception ) from exception
0 commit comments