]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.10] bpo-44852: Support ignoring specific DeprecationWarnings wholesale in regrtest...
authorŁukasz Langa <lukasz@langa.pl>
Tue, 17 Aug 2021 10:01:00 +0000 (12:01 +0200)
committerGitHub <noreply@github.com>
Tue, 17 Aug 2021 10:01:00 +0000 (12:01 +0200)
(cherry picked from commit a0a6d39295a30434b088f4b66439bf5ea21a3e4e)

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
Lib/test/support/__init__.py
Lib/test/support/warnings_helper.py
Lib/test/test_support.py
Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst [new file with mode: 0644]

index cb3acecbbd11977a4dbeebfdcde6c0d855bac808..227ce47655f98f1faabb104cfcccb86c0d961e35 100644 (file)
@@ -13,6 +13,7 @@ import sysconfig
 import time
 import types
 import unittest
+import warnings
 
 from .testresult import get_test_runner
 
@@ -2040,3 +2041,33 @@ def check_disallow_instantiation(testcase, tp, *args, **kwds):
         qualname = f"{name}"
     msg = f"cannot create '{re.escape(qualname)}' instances"
     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()
index de23e6b452b28d52a0917d6bb32cbac2418d2f56..a024fbe5beaa024b5c786f47c80953a2f2c982f5 100644 (file)
@@ -187,3 +187,13 @@ def save_restore_warnings_filters():
         yield
     finally:
         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,
+    )
index b1d3411a865bb26854eb7b9b6862e057ad3b83f3..11ca0c2fb2d2f347ad8528eeb8a9ec1072f2d493 100644 (file)
@@ -11,6 +11,8 @@ import tempfile
 import textwrap
 import time
 import unittest
+import warnings
+
 from test import support
 from test.support import import_helper
 from test.support import os_helper
@@ -22,6 +24,33 @@ TESTFN = os_helper.TESTFN
 
 
 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):
         import_helper.import_module("ftplib")
diff --git a/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst b/Misc/NEWS.d/next/Tests/2021-08-06-18-36-04.bpo-44852.sUL8YX.rst
new file mode 100644 (file)
index 0000000..41b5c2f
--- /dev/null
@@ -0,0 +1,2 @@
+Add ability to wholesale silence DeprecationWarnings while running the
+regression test suite.