summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXtreak <tir.karthi@gmail.com>2019-03-01 17:17:55 (GMT)
committerVictor Stinner <vstinner@redhat.com>2019-03-01 17:17:55 (GMT)
commitbe7c460fb50efe3b88a00281025d76acc62ad2fd (patch)
tree3646fb5a8f89312c018a5bcc3629558f476964bc
parent91b9ecf82c3287b45f39158c5134a87414ff26bc (diff)
downloadcpython-be7c460fb50efe3b88a00281025d76acc62ad2fd.zip
cpython-be7c460fb50efe3b88a00281025d76acc62ad2fd.tar.gz
cpython-be7c460fb50efe3b88a00281025d76acc62ad2fd.tar.bz2
bpo-35178: Fix warnings._formatwarnmsg() (GH-12033)
Ensure custom formatwarning function can receive line as positional argument. Co-Authored-By: Tashrif Billah <tashrifbillah@gmail.com>
-rw-r--r--Lib/test/test_warnings/__init__.py19
-rw-r--r--Lib/warnings.py2
-rw-r--r--Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst2
3 files changed, 22 insertions, 1 deletions
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index 2c54e61..86c2f22 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -877,6 +877,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
diff --git a/Lib/warnings.py b/Lib/warnings.py
index cf88131..00f740c 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -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
index 0000000..2593199
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-02-25-23-04-00.bpo-35178.NA_rXa.rst
@@ -0,0 +1,2 @@
+Ensure custom :func:`warnings.formatwarning` function can receive `line` as
+positional argument. Based on patch by Tashrif Billah.