summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorNick Coghlan <ncoghlan@gmail.com>2018-01-08 02:45:02 (GMT)
committerGitHub <noreply@github.com>2018-01-08 02:45:02 (GMT)
commit9b99747386b690007027c3be2a5d7cfe3d3634f5 (patch)
treeba319d02ddc0e437bd0f90d520a4409efa7af6e2 /Lib
parentd13889214a4c81b78fa8683d35bdbd17ff22f4fe (diff)
downloadcpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.zip
cpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.tar.gz
cpython-9b99747386b690007027c3be2a5d7cfe3d3634f5.tar.bz2
bpo-31975 (PEP 565): Show DeprecationWarning in __main__ (GH-4458)
- primary change is to add a new default filter entry for 'default::DeprecationWarning:__main__' - secondary change is an internal one to cope with plain strings in the warning module's internal filter list (this avoids the need to create a compiled regex object early on during interpreter startup) - assorted documentation updates, including many more examples of configuring the warnings settings - additional tests to ensure that both the pure Python and the C accelerated warnings modules have the expected default configuration
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_cmd_line.py2
-rw-r--r--Lib/test/test_warnings/__init__.py36
-rw-r--r--Lib/warnings.py4
3 files changed, 40 insertions, 2 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index 54ea377..a6b6634 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -558,6 +558,7 @@ class CmdLineTest(unittest.TestCase):
expected_filters = "default::Warning"
else:
expected_filters = ("default::Warning "
+ "default::DeprecationWarning "
"ignore::DeprecationWarning "
"ignore::PendingDeprecationWarning "
"ignore::ImportWarning "
@@ -626,6 +627,7 @@ class CmdLineTest(unittest.TestCase):
"always::UserWarning")
if not Py_DEBUG:
expected_filters += (" "
+ "default::DeprecationWarning "
"ignore::DeprecationWarning "
"ignore::PendingDeprecationWarning "
"ignore::ImportWarning "
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index 039c96e..31ab94b 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -16,6 +16,8 @@ import warnings as original_warnings
py_warnings = support.import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = support.import_fresh_module('warnings', fresh=['_warnings'])
+Py_DEBUG = hasattr(sys, 'gettotalrefcount')
+
@contextmanager
def warnings_state(module):
"""Use a specific warnings implementation in warning_tests."""
@@ -320,6 +322,7 @@ class FilterTests(BaseTest):
self.module.filters[0][0], "error",
"simplefilter did not promote filter to the beginning of list"
)
+
def test_append_duplicate(self):
with original_warnings.catch_warnings(module=self.module,
record=True) as w:
@@ -1143,6 +1146,37 @@ class EnvironmentVariableTests(BaseTest):
b" File \"<string>\", line 1, in <module>",
b"DeprecationWarning: Message"])
+ def test_default_filter_configuration(self):
+ pure_python_api = self.module is py_warnings
+ if Py_DEBUG:
+ expected_default_filters = []
+ else:
+ if pure_python_api:
+ main_module_filter = re.compile("__main__")
+ else:
+ main_module_filter = "__main__"
+ expected_default_filters = [
+ ('default', None, DeprecationWarning, main_module_filter, 0),
+ ('ignore', None, DeprecationWarning, None, 0),
+ ('ignore', None, PendingDeprecationWarning, None, 0),
+ ('ignore', None, ImportWarning, None, 0),
+ ('ignore', None, ResourceWarning, None, 0),
+ ]
+ expected_output = [str(f).encode() for f in expected_default_filters]
+
+ if pure_python_api:
+ # Disable the warnings acceleration module in the subprocess
+ code = "import sys; sys.modules.pop('warnings', None); sys.modules['_warnings'] = None; "
+ else:
+ code = ""
+ code += "import warnings; [print(f) for f in warnings.filters]"
+
+ rc, stdout, stderr = assert_python_ok("-c", code, __isolated=True)
+ stdout_lines = [line.strip() for line in stdout.splitlines()]
+ self.maxDiff = None
+ self.assertEqual(stdout_lines, expected_output)
+
+
@unittest.skipUnless(sys.getfilesystemencoding() != 'ascii',
'requires non-ascii filesystemencoding')
def test_nonascii(self):
@@ -1192,7 +1226,7 @@ a=A()
rc, out, err = assert_python_ok("-c", code)
# note: "__main__" filename is not correct, it should be the name
# of the script
- self.assertEqual(err, b'__main__:7: UserWarning: test')
+ self.assertEqual(err.decode(), '__main__:7: UserWarning: test')
def test_late_resource_warning(self):
# Issue #21925: Emitting a ResourceWarning late during the Python
diff --git a/Lib/warnings.py b/Lib/warnings.py
index f4331c8..76ad4da 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -519,8 +519,10 @@ except ImportError:
# Module initialization
_processoptions(sys.warnoptions)
if not _warnings_defaults:
- # Several warning categories are ignored by default in Py_DEBUG builds
+ # Several warning categories are ignored by default in regular builds
if not hasattr(sys, 'gettotalrefcount'):
+ filterwarnings("default", category=DeprecationWarning,
+ module="__main__", append=1)
simplefilter("ignore", category=DeprecationWarning, append=1)
simplefilter("ignore", category=PendingDeprecationWarning, append=1)
simplefilter("ignore", category=ImportWarning, append=1)