]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-126209: Fix inconsistency of `skip_file_prefixes` in `warnings.warn`'s C and...
authorDaehee Kim <zsaladinz@gmail.com>
Tue, 12 Nov 2024 12:01:56 +0000 (21:01 +0900)
committerGitHub <noreply@github.com>
Tue, 12 Nov 2024 12:01:56 +0000 (13:01 +0100)
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
Lib/test/test_warnings/__init__.py
Lib/test/test_warnings/data/stacklevel.py
Misc/NEWS.d/next/Core_and_Builtins/2024-11-02-18-01-31.gh-issue-126209.2ZIhrS.rst [new file with mode: 0644]
Python/_warnings.c

index 8b59630717e790d14cc8d095532531a24cd3b19b..4e3c877896f295ef900e4be16adb40a3f02a8f5f 100644 (file)
@@ -533,6 +533,18 @@ class WarnTests(BaseTest):
                 warning_tests.package("prefix02", stacklevel=3)
                 self.assertIn("unittest", w[-1].filename)
 
+    def test_skip_file_prefixes_file_path(self):
+        # see: gh-126209
+        with warnings_state(self.module):
+            skipped = warning_tests.__file__
+            with original_warnings.catch_warnings(
+                record=True, module=self.module,
+            ) as w:
+                warning_tests.outer("msg", skip_file_prefixes=(skipped,))
+
+            self.assertEqual(len(w), 1)
+            self.assertNotEqual(w[-1].filename, skipped)
+
     def test_skip_file_prefixes_type_errors(self):
         with warnings_state(self.module):
             warn = warning_tests.warnings.warn
index c6dd24733b3b7473763432dcdc2ebcb744f40d46..fe36242d3d20c22ad9b121ab4d70bff656a0e583 100644 (file)
@@ -4,11 +4,13 @@
 import warnings
 from test.test_warnings.data import package_helper
 
-def outer(message, stacklevel=1):
-    inner(message, stacklevel)
 
-def inner(message, stacklevel=1):
-    warnings.warn(message, stacklevel=stacklevel)
+def outer(message, stacklevel=1, skip_file_prefixes=()):
+    inner(message, stacklevel, skip_file_prefixes)
+
+def inner(message, stacklevel=1, skip_file_prefixes=()):
+    warnings.warn(message, stacklevel=stacklevel,
+                  skip_file_prefixes=skip_file_prefixes)
 
 def package(message, *, stacklevel):
     package_helper.inner_api(message, stacklevel=stacklevel,
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-02-18-01-31.gh-issue-126209.2ZIhrS.rst b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-02-18-01-31.gh-issue-126209.2ZIhrS.rst
new file mode 100644 (file)
index 0000000..727f7f8
--- /dev/null
@@ -0,0 +1,3 @@
+Fix an issue with ``skip_file_prefixes`` parameter which resulted in an inconsistent
+behaviour between the C and Python implementations of :func:`warnings.warn`.
+Patch by Daehee Kim.
index 3f9e73b5376223bfe59f65f6ee83ca7f69fb43cb..e05ba99e8eaec4b7716b2d9da3f7b022d508940a 100644 (file)
@@ -803,7 +803,8 @@ is_filename_to_skip(PyObject *filename, PyTupleObject *skip_file_prefixes)
         for (Py_ssize_t idx = 0; idx < prefixes; ++idx)
         {
             PyObject *prefix = PyTuple_GET_ITEM(skip_file_prefixes, idx);
-            Py_ssize_t found = PyUnicode_Tailmatch(filename, prefix, 0, -1, -1);
+            Py_ssize_t found = PyUnicode_Tailmatch(filename, prefix,
+                                                   0, PY_SSIZE_T_MAX, -1);
             if (found == 1) {
                 return true;
             }