Skip to content

Commit eb93819

Browse files
committed
fix support of free-threaded Python if Poetry itself is not installed with a free-threaded Python
1 parent d1211c0 commit eb93819

File tree

5 files changed

+27
-1
lines changed

5 files changed

+27
-1
lines changed

src/poetry/utils/env/base_env.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class MarkerEnv(TypedDict):
5151
interpreter_name: str
5252
interpreter_version: str
5353
sysconfig_platform: str
54+
free_threading: bool
5455

5556

5657
class Env(ABC):

src/poetry/utils/env/script_strings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def _version_nodot(version):
8686
),
8787
"interpreter_version": interpreter_version(),
8888
"sysconfig_platform": sysconfig.get_platform(),
89+
"free_threading": sysconfig.get_config_var("Py_GIL_DISABLED") or False,
8990
}
9091
9192
print(json.dumps(env))

src/poetry/utils/env/system_env.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def get_marker_env(self) -> MarkerEnv:
7474
"interpreter_name": interpreter_name(),
7575
"interpreter_version": interpreter_version(),
7676
"sysconfig_platform": sysconfig.get_platform(),
77+
"free_threading": sysconfig.get_config_var("Py_GIL_DISABLED") or False,
7778
}
7879

7980
def is_venv(self) -> bool:

src/poetry/utils/env/virtual_env.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,15 @@ def get_supported_tags(self) -> list[Tag]:
5858
interpreter_name = self.marker_env["interpreter_name"]
5959
interpreter_version = self.marker_env["interpreter_version"]
6060
sysconfig_platform = self.marker_env["sysconfig_platform"]
61+
free_threading = self.marker_env["free_threading"]
6162

63+
abis: list[str] | None = None
6264
if interpreter_name == "pp":
6365
interpreter = "pp3"
6466
elif interpreter_name == "cp":
6567
interpreter = f"{interpreter_name}{interpreter_version}"
68+
if free_threading:
69+
abis = [f"{interpreter}t"]
6670
else:
6771
interpreter = None
6872

@@ -83,7 +87,7 @@ def get_supported_tags(self) -> list[Tag]:
8387

8488
return [
8589
*(
86-
cpython_tags(python, platforms=platforms)
90+
cpython_tags(python, abis=abis, platforms=platforms)
8791
if interpreter_name == "cp"
8892
else generic_tags(platforms=platforms)
8993
),

tests/utils/env/test_env.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,25 @@ def test_env_get_supported_tags_matches_inside_virtualenv(
116116
assert run_python_script_spy.call_count == expected_call_count
117117

118118

119+
@pytest.mark.skipif(
120+
sys.implementation.name != "cpython",
121+
reason="free threading is only relevant for CPython",
122+
)
123+
def test_env_get_supported_tags_free_threading(
124+
tmp_path: Path, manager: EnvManager
125+
) -> None:
126+
venv_path = tmp_path / "Virtual Env"
127+
manager.build_venv(venv_path)
128+
venv = VirtualEnv(venv_path)
129+
130+
if venv.marker_env["free_threading"]:
131+
assert venv.get_supported_tags() == list(packaging.tags.sys_tags())
132+
else:
133+
assert not any(t.abi.endswith("t") for t in venv.get_supported_tags())
134+
venv.marker_env["free_threading"] = True
135+
assert any(t.abi.endswith("t") for t in venv.get_supported_tags())
136+
137+
119138
@pytest.mark.skipif(os.name == "nt", reason="Symlinks are not support for Windows")
120139
def test_env_has_symlinks_on_nix(tmp_path: Path, tmp_venv: VirtualEnv) -> None:
121140
assert os.path.islink(tmp_venv.python)

0 commit comments

Comments
 (0)