From a69fda59db89a1a95c5b367a6ebc9bb3487e9e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 12 Aug 2026 17:44:23 +0200 Subject: [PATCH 1/2] Skip more pyexpat tests based on compile-time expat version, not runtime This is a followup for GH-144739 and GH-155485 --- Lib/test/test_pyexpat.py | 10 ++++++---- Lib/test/test_sax.py | 4 ++-- Lib/test/test_xml_etree.py | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index baa4f178427d532..c8fbeca6a60bc18 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -1095,9 +1095,11 @@ def test_error_path_no_crash(self): class ReparseDeferralTest(unittest.TestCase): + deferal_supported = expat.ParserCreate().GetReparseDeferralEnabled() + def test_getter_setter_round_trip(self): parser = expat.ParserCreate() - enabled = (expat.version_info >= (2, 6, 0)) + enabled = self.deferal_supported self.assertIs(parser.GetReparseDeferralEnabled(), enabled) parser.SetReparseDeferralEnabled(False) @@ -1106,8 +1108,8 @@ def test_getter_setter_round_trip(self): self.assertIs(parser.GetReparseDeferralEnabled(), enabled) def test_reparse_deferral_enabled(self): - if expat.version_info < (2, 6, 0): - self.skipTest(f'Expat {expat.version_info} does not ' + if not self.deferal_supported: + self.skipTest(f'Expat < 2.6.0 does not ' 'support reparse deferral') started = [] @@ -1137,7 +1139,7 @@ def start_element(name, _): parser = expat.ParserCreate() parser.StartElementHandler = start_element - if expat.version_info >= (2, 6, 0): + if self.deferal_supported: parser.SetReparseDeferralEnabled(False) self.assertFalse(parser.GetReparseDeferralEnabled()) diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index 29babd7bf6996ad..27ae6c8a953149c 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -1216,8 +1216,8 @@ def test_expat_incremental_reset(self): self.assertEqual(result.getvalue(), start + b"text") - @unittest.skipIf(pyexpat.version_info < (2, 6, 0), - f'Expat {pyexpat.version_info} does not ' + @unittest.skipIf(not pyexpat.ParserCreate().GetReparseDeferralEnabled(), + 'Python compiled with Expat < 2.6.0 does not ' 'support reparse deferral') def test_flush_reparse_deferral_enabled(self): result = BytesIO() diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 0c944516ae115f1..df2815a71e5fc2a 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1915,8 +1915,8 @@ def test_unknown_event(self): with self.assertRaisesRegex(ValueError, "unknown event 'bogus'"): ET.XMLPullParser(events=(x.decode() for x in (b'start', b'end', b'bogus'))) - @unittest.skipIf(pyexpat.version_info < (2, 6, 0), - f'Expat {pyexpat.version_info} does not ' + @unittest.skipIf(not pyexpat.ParserCreate().GetReparseDeferralEnabled(), + 'Python compiled with Expat < 2.6.0 does not ' 'support reparse deferral') def test_flush_reparse_deferral_enabled(self): parser = ET.XMLPullParser(events=('start', 'end')) From 226138162b76b87f55b533b5936bf61efd43d99a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 13 Aug 2026 12:18:17 +0200 Subject: [PATCH 2/2] fixup! Skip more pyexpat tests based on compile-time expat version, not runtime --- Lib/test/test_pyexpat.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index c8fbeca6a60bc18..0019477cd1368b8 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -19,6 +19,11 @@ from xml.parsers.expat import errors +# pyexpat built with expat 2.6.0+ has support for reparse deferral +# and defaults to enabled +HAS_REPARSE_DEFERRAL = expat.ParserCreate().GetReparseDeferralEnabled() + + class SetAttributeTest(unittest.TestCase): def setUp(self): self.parser = expat.ParserCreate(namespace_separator='!') @@ -1095,11 +1100,9 @@ def test_error_path_no_crash(self): class ReparseDeferralTest(unittest.TestCase): - deferal_supported = expat.ParserCreate().GetReparseDeferralEnabled() - def test_getter_setter_round_trip(self): parser = expat.ParserCreate() - enabled = self.deferal_supported + enabled = HAS_REPARSE_DEFERRAL self.assertIs(parser.GetReparseDeferralEnabled(), enabled) parser.SetReparseDeferralEnabled(False) @@ -1108,7 +1111,7 @@ def test_getter_setter_round_trip(self): self.assertIs(parser.GetReparseDeferralEnabled(), enabled) def test_reparse_deferral_enabled(self): - if not self.deferal_supported: + if not HAS_REPARSE_DEFERRAL: self.skipTest(f'Expat < 2.6.0 does not ' 'support reparse deferral') @@ -1139,7 +1142,7 @@ def start_element(name, _): parser = expat.ParserCreate() parser.StartElementHandler = start_element - if self.deferal_supported: + if HAS_REPARSE_DEFERRAL: parser.SetReparseDeferralEnabled(False) self.assertFalse(parser.GetReparseDeferralEnabled())