]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35178: Fix warnings._formatwarnmsg() (GH-12033)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 1 Mar 2019 17:40:10 +0000 (09:40 -0800)
committerGitHub <noreply@github.com>
Fri, 1 Mar 2019 17:40:10 +0000 (09:40 -0800)
Ensure custom formatwarning function can receive line as positional argument.

Co-Authored-By: Tashrif Billah <tashrifbillah@gmail.com>
(cherry picked from commit be7c460fb50efe3b88a00281025d76acc62ad2fd)

Co-authored-by: Xtreak <tir.karthi@gmail.com>
Lib/test/test_warnings/__init__.py
Lib/warnings.py
Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst [new file with mode: 0644]

index a40a9a297c82eed87b38d9e0ed5cdb83a93aad5c..87cc3a7e36ae698bef42e74803c3997d96a6ccff 100644 (file)
@@ -940,6 +940,25 @@ class WarningsDisplayTests(BaseTest):
                                 file_object, expected_file_line)
         self.assertEqual(expect, file_object.getvalue())
 
+    def test_formatwarning_override(self):
+        # bpo-35178: Test that a custom formatwarning function gets the 'line'
+        # argument as a positional argument, and not only as a keyword argument
+        def myformatwarning(message, category, filename, lineno, text):
+            return f'm={message}:c={category}:f={filename}:l={lineno}:t={text}'
+
+        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
+        line_num = 3
+        file_line = linecache.getline(file_name, line_num).strip()
+        message = 'msg'
+        category = Warning
+        file_object = StringIO()
+        expected = f'm={message}:c={category}:f={file_name}:l={line_num}' + \
+                   f':t={file_line}'
+        with support.swap_attr(self.module, 'formatwarning', myformatwarning):
+            self.module.showwarning(message, category, file_name, line_num,
+                                    file_object, file_line)
+            self.assertEqual(file_object.getvalue(), expected)
+
 
 class CWarningsDisplayTests(WarningsDisplayTests, unittest.TestCase):
     module = c_warnings
index ae4295e120f69fea805b4de8aac33e950d649ee5..9064f56827df3d22787fa583a0a3daf762ddc724 100644 (file)
@@ -124,7 +124,7 @@ def _formatwarnmsg(msg):
         if fw is not _formatwarning_orig:
             # warnings.formatwarning() was replaced
             return fw(msg.message, msg.category,
-                      msg.filename, msg.lineno, line=msg.line)
+                      msg.filename, msg.lineno, msg.line)
     return _formatwarnmsg_impl(msg)
 
 def filterwarnings(action, message="", category=Warning, module="", lineno=0,
diff --git a/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst
new file mode 100644 (file)
index 0000000..2593199
--- /dev/null
@@ -0,0 +1,2 @@
+Ensure custom :func:`warnings.formatwarning` function can receive `line` as
+positional argument. Based on patch by Tashrif Billah.