From f07b4c1047edfabf45b9747e582d39888d9a4f21 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:07:58 +0200 Subject: [PATCH 1/3] Run CI tests for Python 3.14 free-threading --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 84f12dfae487..83cf22a09934 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,6 +59,12 @@ jobs: toxenv: py tox_extra_args: "-n 4" test_mypyc: true + - name: Test suite with py314t-ubuntu, mypyc-compiled + python: '3.14t' + os: ubuntu-24.04-arm + toxenv: py + tox_extra_args: "-n 4" + test_mypyc: true - name: Test suite with py314-windows-64 python: '3.14' os: windows-latest From f36f722c20d433fb99da72a867bfb02293432615 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:36:11 +0100 Subject: [PATCH 2/3] Disable lxml imports + tests for free-threading builds --- mypy/report.py | 8 ++++++-- mypy/test/testcheck.py | 6 +++++- mypy/test/testcmdline.py | 6 +++++- mypy/test/testreports.py | 7 ++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/mypy/report.py b/mypy/report.py index 2667c7079369..1c2bcda5a74d 100644 --- a/mypy/report.py +++ b/mypy/report.py @@ -25,9 +25,13 @@ from mypy.version import __version__ try: - from lxml import etree # type: ignore[import-untyped] + if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + # lxml doesn't support free-threading yet + LXML_INSTALLED = False + else: + from lxml import etree # type: ignore[import-untyped] - LXML_INSTALLED = True + LXML_INSTALLED = True except ImportError: LXML_INSTALLED = False diff --git a/mypy/test/testcheck.py b/mypy/test/testcheck.py index a8841392f948..cc3ab69b3bf3 100644 --- a/mypy/test/testcheck.py +++ b/mypy/test/testcheck.py @@ -27,7 +27,11 @@ from mypy.test.update_data import update_testcase_output try: - import lxml # type: ignore[import-untyped] + if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + # lxml doesn't support free-threading yet + lxml = None + else: + import lxml # type: ignore[import-untyped] except ImportError: lxml = None diff --git a/mypy/test/testcmdline.py b/mypy/test/testcmdline.py index 11d229042978..f5092280f24c 100644 --- a/mypy/test/testcmdline.py +++ b/mypy/test/testcmdline.py @@ -20,7 +20,11 @@ ) try: - import lxml # type: ignore[import-untyped] + if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + # lxml doesn't support free-threading yet + lxml = None + else: + import lxml # type: ignore[import-untyped] except ImportError: lxml = None diff --git a/mypy/test/testreports.py b/mypy/test/testreports.py index f638756ad819..81af875d870c 100644 --- a/mypy/test/testreports.py +++ b/mypy/test/testreports.py @@ -2,13 +2,18 @@ from __future__ import annotations +import sys import textwrap from mypy.report import CoberturaPackage, get_line_rate from mypy.test.helpers import Suite, assert_equal try: - import lxml # type: ignore[import-untyped] + if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + # lxml doesn't support free-threading yet + lxml = None + else: + import lxml # type: ignore[import-untyped] except ImportError: lxml = None From a79233d5552d6718ba21bb67f03833bd8a19bffd Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:36:21 +0100 Subject: [PATCH 3/3] Use sysconfig.get_config_var --- mypy/report.py | 3 ++- mypy/test/testcheck.py | 3 ++- mypy/test/testcmdline.py | 3 ++- mypy/test/testreports.py | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/mypy/report.py b/mypy/report.py index 1c2bcda5a74d..ce6a59a00209 100644 --- a/mypy/report.py +++ b/mypy/report.py @@ -8,6 +8,7 @@ import os import shutil import sys +import sysconfig import time import tokenize from abc import ABCMeta, abstractmethod @@ -25,7 +26,7 @@ from mypy.version import __version__ try: - if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + if sys.version_info >= (3, 14) and bool(sysconfig.get_config_var("Py_GIL_DISABLED")): # lxml doesn't support free-threading yet LXML_INSTALLED = False else: diff --git a/mypy/test/testcheck.py b/mypy/test/testcheck.py index cc3ab69b3bf3..96be1a044d91 100644 --- a/mypy/test/testcheck.py +++ b/mypy/test/testcheck.py @@ -5,6 +5,7 @@ import os import re import sys +import sysconfig import tempfile from pathlib import Path @@ -27,7 +28,7 @@ from mypy.test.update_data import update_testcase_output try: - if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + if sys.version_info >= (3, 14) and bool(sysconfig.get_config_var("Py_GIL_DISABLED")): # lxml doesn't support free-threading yet lxml = None else: diff --git a/mypy/test/testcmdline.py b/mypy/test/testcmdline.py index f5092280f24c..909ea13c01d5 100644 --- a/mypy/test/testcmdline.py +++ b/mypy/test/testcmdline.py @@ -10,6 +10,7 @@ import re import subprocess import sys +import sysconfig from mypy.test.config import PREFIX, test_temp_dir from mypy.test.data import DataDrivenTestCase, DataSuite @@ -20,7 +21,7 @@ ) try: - if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + if sys.version_info >= (3, 14) and bool(sysconfig.get_config_var("Py_GIL_DISABLED")): # lxml doesn't support free-threading yet lxml = None else: diff --git a/mypy/test/testreports.py b/mypy/test/testreports.py index 81af875d870c..a971f297ec92 100644 --- a/mypy/test/testreports.py +++ b/mypy/test/testreports.py @@ -3,13 +3,14 @@ from __future__ import annotations import sys +import sysconfig import textwrap from mypy.report import CoberturaPackage, get_line_rate from mypy.test.helpers import Suite, assert_equal try: - if sys.version_info >= (3, 14) and not sys._is_gil_enabled(): + if sys.version_info >= (3, 14) and bool(sysconfig.get_config_var("Py_GIL_DISABLED")): # lxml doesn't support free-threading yet lxml = None else: