8000 bpo-44852: Support ignoring specific DeprecationWarnings wholesale in… · python/cpython@a0a6d39 · GitHub
[go: up one dir, main page]

Skip to content

Commit a0a6d39

Browse files
authored
bpo-44852: Support ignoring specific DeprecationWarnings wholesale in regrtest (GH-27634)
1 parent 4f51fa9 commit a0a6d39

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

Lib/test/support/__init__.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import time
1414
import types
1515
import unittest
16+
import warnings
1617

1718
from .testresult import get_test_runner
1819

@@ -2053,3 +2054,31 @@ def infinite_recursion(max_depth=75):
20532054
yield
20542055
finally:
20552056
sys.setrecursionlimit(original_depth)
2057+
2058+
def ignore_deprecations_from(module: str, *, like: str) -> object:
2059+
token = object()
2060+
warnings.filterwarnings(
2061+
"ignore",
2062+
category=DeprecationWarning,
2063+
module=module,
2064+
message=like + fr"(?#support{id(token)})",
2065+
)
2066+
return token
2067+
2068+
def clear_ignored_deprecations(*tokens: object) -> None:
2069+
if not tokens:
2070+
raise ValueError("Provide token or tokens returned by ignore_deprecations_from")
2071+
2072+
new_filters = []
2073+
for action, message, category, module, lineno in warnings.filters:
2074+
if action == "ignore" and category is DeprecationWarning:
2075+
if isinstance(message, re.Pattern):
2076+
message = message.pattern
2077+
if tokens:
2078+
endswith = tuple(rf"(?#support{id(token)})" for token in tokens)
2079+
if message.endswith(endswith):
2080+
continue
2081+
new_filters.append((action, message, category, module, lineno))
2082+
if warnings.filters != new_filters:
2083+
warnings.filters[:] = new_filters
2084+
warnings._filters_mutated()

Lib/test/support/warnings_helper.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,13 @@ def save_restore_warnings_filters():
187187
yield
188188
finally:
189189
warnings.filters[:] = old_filters
190+
191+
192+
def _warn_about_deprecation():
193+
warnings.warn(
194+
"This is used in test_support test to ensure"
195+
" support.ignore_deprecations_from() works as expected."
196+
" You should not be seeing this.",
197+
DeprecationWarning,
198+
stacklevel=0,
199+
)

Lib/test/test_support.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import textwrap
1212
import time
1313
import unittest
14+
import warnings
15+
1416
from test import support
1517
from test.support import import_helper
1618
from test.support import os_helper
@@ -22,6 +24,33 @@
2224

2325

2426
class TestSupport(unittest.TestCase):
27+
@classmethod
28+
def setUpClass(cls):
29+
orig_filter_len = len(warnings.filters)
30+
cls._warnings_helper_token = support.ignore_deprecations_from(
31+
"test.support.warnings_helper", like=".*used in test_support.*"
32+
)
33+
cls._test_support_token = support.ignore_deprecations_from(
34+
"test.test_support", like=".*You should NOT be seeing this.*"
35+
)
36+
assert len(warnings.filters) == orig_filter_len + 2
37+
38+
@classmethod
39+
def tearDownClass(cls):
40+
orig_filter_len = len(warnings.filters)
41+
support.clear_ignored_deprecations(
42+
cls._warnings_helper_token,
43+
cls._test_support_token,
44+
)
45+
assert len(warnings.filters) == orig_filter_len - 2
46+
47+
def test_ignored_deprecations_are_silent(self):
48+
"""Test support.ignore_deprecations_from() silences warnings"""
49+
with warnings.catch_warnings(record=True) as warning_objs:
50+
warnings_helper._warn_about_deprecation()
51+
warnings.warn("You should NOT be seeing this.", DeprecationWarning)
52+
messages = [str(w.message) for w in warning_objs]
53+
self.assertEqual(len(messages), 0, messages)
2554

2655
def test_import_module(self):
2756
import_helper.import_module("ftplib")
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line number< 4237 /th>Diff line change
@@ -0,0 +1,2 @@
1+
Add ability to wholesale silence DeprecationWarnings while running the
2+
regression test suite.

0 commit comments

Comments
 (0)
0