mirror of
https://github.com/python/cpython.git
synced 2025-08-18 15:51:23 +00:00
[3.10] bpo-44852: Support ignoring specific DeprecationWarnings wholesale in regrtest (GH-27634) (GH-27784)
(cherry picked from commit a0a6d39295
)
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
parent
6f6648e436
commit
bc98f98132
4 changed files with 72 additions and 0 deletions
|
@ -13,6 +13,7 @@ import sysconfig
|
||||||
import time
|
import time
|
||||||
import types
|
import types
|
||||||
import unittest
|
import unittest
|
||||||
|
import warnings
|
||||||
|
|
||||||
from .testresult import get_test_runner
|
from .testresult import get_test_runner
|
||||||
|
|
||||||
|
@ -2040,3 +2041,33 @@ def check_disallow_instantiation(testcase, tp, *args, **kwds):
|
||||||
qualname = f"{name}"
|
qualname = f"{name}"
|
||||||
msg = f"cannot create '{re.escape(qualname)}' instances"
|
msg = f"cannot create '{re.escape(qualname)}' instances"
|
||||||
testcase.assertRaisesRegex(TypeError, msg, tp, *args, **kwds)
|
testcase.assertRaisesRegex(TypeError, msg, tp, *args, **kwds)
|
||||||
|
|
||||||
|
|
||||||
|
def ignore_deprecations_from(module: str, *, like: str) -> object:
|
||||||
|
token = object()
|
||||||
|
warnings.filterwarnings(
|
||||||
|
"ignore",
|
||||||
|
category=DeprecationWarning,
|
||||||
|
module=module,
|
||||||
|
message=like + fr"(?#support{id(token)})",
|
||||||
|
)
|
||||||
|
return token
|
||||||
|
|
||||||
|
|
||||||
|
def clear_ignored_deprecations(*tokens: object) -> None:
|
||||||
|
if not tokens:
|
||||||
|
raise ValueError("Provide token or tokens returned by ignore_deprecations_from")
|
||||||
|
|
||||||
|
new_filters = []
|
||||||
|
for action, message, category, module, lineno in warnings.filters:
|
||||||
|
if action == "ignore" and category is DeprecationWarning:
|
||||||
|
if isinstance(message, re.Pattern):
|
||||||
|
message = message.pattern
|
||||||
|
if tokens:
|
||||||
|
endswith = tuple(rf"(?#support{id(token)})" for token in tokens)
|
||||||
|
if message.endswith(endswith):
|
||||||
|
continue
|
||||||
|
new_filters.append((action, message, category, module, lineno))
|
||||||
|
if warnings.filters != new_filters:
|
||||||
|
warnings.filters[:] = new_filters
|
||||||
|
warnings._filters_mutated()
|
||||||
|
|
|
@ -187,3 +187,13 @@ def save_restore_warnings_filters():
|
||||||
yield
|
yield
|
||||||
finally:
|
finally:
|
||||||
warnings.filters[:] = old_filters
|
warnings.filters[:] = old_filters
|
||||||
|
|
||||||
|
|
||||||
|
def _warn_about_deprecation():
|
||||||
|
warnings.warn(
|
||||||
|
"This is used in test_support test to ensure"
|
||||||
|
" support.ignore_deprecations_from() works as expected."
|
||||||
|
" You should not be seeing this.",
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=0,
|
||||||
|
)
|
||||||
|
|
|
@ -11,6 +11,8 @@ import tempfile
|
||||||
import textwrap
|
import textwrap
|
||||||
import time
|
import time
|
||||||
import unittest
|
import unittest
|
||||||
|
import warnings
|
||||||
|
|
||||||
from test import support
|
from test import support
|
||||||
from test.support import import_helper
|
from test.support import import_helper
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
|
@ -22,6 +24,33 @@ TESTFN = os_helper.TESTFN
|
||||||
|
|
||||||
|
|
||||||
class TestSupport(unittest.TestCase):
|
class TestSupport(unittest.TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
orig_filter_len = len(warnings.filters)
|
||||||
|
cls._warnings_helper_token = support.ignore_deprecations_from(
|
||||||
|
"test.support.warnings_helper", like=".*used in test_support.*"
|
||||||
|
)
|
||||||
|
cls._test_support_token = support.ignore_deprecations_from(
|
||||||
|
"test.test_support", like=".*You should NOT be seeing this.*"
|
||||||
|
)
|
||||||
|
assert len(warnings.filters) == orig_filter_len + 2
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
orig_filter_len = len(warnings.filters)
|
||||||
|
support.clear_ignored_deprecations(
|
||||||
|
cls._warnings_helper_token,
|
||||||
|
cls._test_support_token,
|
||||||
|
)
|
||||||
|
assert len(warnings.filters) == orig_filter_len - 2
|
||||||
|
|
||||||
|
def test_ignored_deprecations_are_silent(self):
|
||||||
|
"""Test support.ignore_deprecations_from() silences warnings"""
|
||||||
|
with warnings.catch_warnings(record=True) as warning_objs:
|
||||||
|
warnings_helper._warn_about_deprecation()
|
||||||
|
warnings.warn("You should NOT be seeing this.", DeprecationWarning)
|
||||||
|
messages = [str(w.message) for w in warning_objs]
|
||||||
|
self.assertEqual(len(messages), 0, messages)
|
||||||
|
|
||||||
def test_import_module(self):
|
def test_import_module(self):
|
||||||
import_helper.import_module("ftplib")
|
import_helper.import_module("ftplib")
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add ability to wholesale silence DeprecationWarnings while running the
|
||||||
|
regression test suite.
|
Loading…
Add table
Add a link
Reference in a new issue