File tree Expand file tree Collapse file tree 5 files changed +27
-1
lines changed Expand file tree Collapse file tree 5 files changed +27
-1
lines changed Original file line number Diff line number Diff 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
5657class Env (ABC ):
Original file line number Diff line number Diff 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
9192print(json.dumps(env))
Original file line number Diff line number Diff 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 :
Original file line number Diff line number Diff 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 ),
Original file line number Diff line number Diff 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" )
120139def test_env_has_symlinks_on_nix (tmp_path : Path , tmp_venv : VirtualEnv ) -> None :
121140 assert os .path .islink (tmp_venv .python )
You can’t perform that action at this time.
0 commit comments