From 7947c9e3a6bd8c1dfe7fc209fb2256a528149bb6 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Thu, 31 Jan 2013 14:56:26 -0300 Subject: [PATCH] Deprecated undocumented warnings manipulation testing tools. --- django/test/testcases.py | 21 ++++++++++----- django/test/utils.py | 7 +++++ docs/internals/deprecation.txt | 8 +++++- docs/topics/testing/overview.txt | 2 ++ tests/regressiontests/test_utils/tests.py | 31 +++++++++++++---------- 5 files changed, 47 insertions(+), 22 deletions(-) diff --git a/django/test/testcases.py b/django/test/testcases.py index c311540fc3..3aa0afa35e 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -1,12 +1,13 @@ from __future__ import unicode_literals +from copy import copy import difflib +import errno +from functools import wraps import json import os import re import sys -from copy import copy -from functools import wraps try: from urllib.parse import urlsplit, urlunsplit except ImportError: # Python 2 @@ -14,7 +15,7 @@ except ImportError: # Python 2 import select import socket import threading -import errno +import warnings from django.conf import settings from django.contrib.staticfiles.handlers import StaticFilesHandler @@ -36,8 +37,7 @@ from django.test import _doctest as doctest from django.test.client import Client from django.test.html import HTMLParseError, parse_html from django.test.signals import template_rendered -from django.test.utils import (get_warnings_state, restore_warnings_state, - override_settings, compare_xml, strip_quotes) +from django.test.utils import (override_settings, compare_xml, strip_quotes) from django.test.utils import ContextList from django.utils import unittest as ut2 from django.utils.encoding import force_text @@ -241,6 +241,11 @@ class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): class SimpleTestCase(ut2.TestCase): + + _warn_txt = ("save_warnings_state/restore_warnings_state " + "django.test.*TestCase methods are deprecated. Use Python's " + "warnings.catch_warnings context manager instead.") + def __call__(self, result=None): """ Wrapper around default __call__ method to perform common Django test @@ -279,14 +284,16 @@ class SimpleTestCase(ut2.TestCase): """ Saves the state of the warnings module """ - self._warnings_state = get_warnings_state() + warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) + self._warnings_state = warnings.filters[:] def restore_warnings_state(self): """ Restores the state of the warnings module to the state saved by save_warnings_state() """ - restore_warnings_state(self._warnings_state) + warnings.warn(self._warn_txt, DeprecationWarning, stacklevel=2) + warnings.filters = self._warnings_state[:] def settings(self, **kwargs): """ diff --git a/django/test/utils.py b/django/test/utils.py index 8114ae0e6a..9413ea8dc4 100644 --- a/django/test/utils.py +++ b/django/test/utils.py @@ -98,6 +98,11 @@ def teardown_test_environment(): del mail.outbox +warn_txt = ("get_warnings_state/restore_warnings_state functions from " + "django.test.utils are deprecated. Use Python's warnings.catch_warnings() " + "context manager instead.") + + def get_warnings_state(): """ Returns an object containing the state of the warnings module @@ -105,6 +110,7 @@ def get_warnings_state(): # There is no public interface for doing this, but this implementation of # get_warnings_state and restore_warnings_state appears to work on Python # 2.4 to 2.7. + warnings.warn(warn_txt, DeprecationWarning, stacklevel=2) return warnings.filters[:] @@ -113,6 +119,7 @@ def restore_warnings_state(state): Restores the state of the warnings module when passed an object that was returned by get_warnings_state() """ + warnings.warn(warn_txt, DeprecationWarning, stacklevel=2) warnings.filters = state[:] diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index da0d1e212c..df3d84fdae 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -267,7 +267,6 @@ these changes. in 1.4. The backward compatibility will be removed -- ``HttpRequest.raw_post_data`` will no longer work. - * The value for the ``post_url_continue`` parameter in ``ModelAdmin.response_add()`` will have to be either ``None`` (to redirect to the newly created object's edit page) or a pre-formatted url. String @@ -314,6 +313,13 @@ these changes. * The ``depth`` keyword argument will be removed from :meth:`~django.db.models.query.QuerySet.select_related`. +* The undocumented ``get_warnings_state()``/``restore_warnings_state()`` + functions from :mod:`django.test.utils` and the ``save_warnings_state()``/ + ``restore_warnings_state()`` + :ref:`django.test.*TestCase ` methods are + deprecated. Use the :class:`warnings.catch_warnings` context manager + available starting with Python 2.6 instead. + 1.8 --- diff --git a/docs/topics/testing/overview.txt b/docs/topics/testing/overview.txt index 534569efeb..5739061dd1 100644 --- a/docs/topics/testing/overview.txt +++ b/docs/topics/testing/overview.txt @@ -835,6 +835,8 @@ The following is a simple unit test using the test client:: :class:`django.test.client.RequestFactory` +.. _django-testcase-subclasses: + Provided test case classes -------------------------- diff --git a/tests/regressiontests/test_utils/tests.py b/tests/regressiontests/test_utils/tests.py index d5d49b2104..2a74b95ffa 100644 --- a/tests/regressiontests/test_utils/tests.py +++ b/tests/regressiontests/test_utils/tests.py @@ -220,24 +220,27 @@ class SaveRestoreWarningState(TestCase): # of save_warnings_state/restore_warnings_state (e.g. just # warnings.resetwarnings()) , but it is difficult to test more. import warnings - self.save_warnings_state() + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) - class MyWarning(Warning): - pass + self.save_warnings_state() - # Add a filter that causes an exception to be thrown, so we can catch it - warnings.simplefilter("error", MyWarning) - self.assertRaises(Warning, lambda: warnings.warn("warn", MyWarning)) + class MyWarning(Warning): + pass - # Now restore. - self.restore_warnings_state() - # After restoring, we shouldn't get an exception. But we don't want a - # warning printed either, so we have to silence the warning. - warnings.simplefilter("ignore", MyWarning) - warnings.warn("warn", MyWarning) + # Add a filter that causes an exception to be thrown, so we can catch it + warnings.simplefilter("error", MyWarning) + self.assertRaises(Warning, lambda: warnings.warn("warn", MyWarning)) - # Remove the filter we just added. - self.restore_warnings_state() + # Now restore. + self.restore_warnings_state() + # After restoring, we shouldn't get an exception. But we don't want a + # warning printed either, so we have to silence the warning. + warnings.simplefilter("ignore", MyWarning) + warnings.warn("warn", MyWarning) + + # Remove the filter we just added. + self.restore_warnings_state() class HTMLEqualTests(TestCase):