Fixed #21024 -- Documented how to deprecate a feature.
This commit is contained in:
parent
a772ea8117
commit
5be56d0e0d
|
@ -158,6 +158,70 @@ been discussed on `django-developers`_.
|
||||||
If you're not sure whether your patch should be considered non-trivial, just
|
If you're not sure whether your patch should be considered non-trivial, just
|
||||||
ask.
|
ask.
|
||||||
|
|
||||||
|
Deprecating a feature
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
There are a couple reasons that code in Django might be deprecated:
|
||||||
|
|
||||||
|
* If a feature has been improved or modified in a backwards-incompatible way,
|
||||||
|
the old feature or behavior will be deprecated.
|
||||||
|
|
||||||
|
* Sometimes Django will include a backport of a Python library that's not
|
||||||
|
included in a version of Python that Django currently supports. When Django
|
||||||
|
no longer needs to support the older version of Python that doesn't include
|
||||||
|
the library, the library will be deprecated in Django.
|
||||||
|
|
||||||
|
As the :ref:`deprecation policy<internal-release-deprecation-policy>` describes,
|
||||||
|
the first release of Django that deprecates a feature (``A.B``) should raise a
|
||||||
|
``PendingDeprecationWarning`` when the deprecated feature is invoked. Assuming
|
||||||
|
we have a good test coverage, these warnings will be shown by the test suite
|
||||||
|
when :ref:`running it <running-unit-tests>` with warnings enabled:
|
||||||
|
``python -Wall runtests.py``. This is annoying and the output of the test suite
|
||||||
|
should remain clean. Thus, when adding a ``PendingDeprecationWarning`` you need
|
||||||
|
to eliminate or silence any warnings generated when running the tests.
|
||||||
|
|
||||||
|
The first step is to remove any use of the deprecated behavior by Django itself.
|
||||||
|
Next you can silence warnings in tests that actually test the deprecated
|
||||||
|
behavior in one of two ways:
|
||||||
|
|
||||||
|
#) In a particular test::
|
||||||
|
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
def test_foo(self):
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
warnings.simplefilter("always")
|
||||||
|
# invoke deprecated behavior
|
||||||
|
# go ahead with the rest of the test
|
||||||
|
|
||||||
|
#) For an entire test case, ``django.test.utils`` contains three helpful
|
||||||
|
mixins to silence warnings: ``IgnorePendingDeprecationWarningsMixin``,
|
||||||
|
``IgnoreDeprecationWarningsMixin``, and
|
||||||
|
``IgnoreAllDeprecationWarningsMixin``. For example::
|
||||||
|
|
||||||
|
from django.test.utils import IgnorePendingDeprecationWarningsMixin
|
||||||
|
|
||||||
|
class MyDeprecatedTests(IgnorePendingDeprecationWarningsMixin, unittest.TestCase):
|
||||||
|
...
|
||||||
|
|
||||||
|
Finally, there are a couple of updates to Django's documentation to make:
|
||||||
|
|
||||||
|
#) If the existing feature is documented, mark it deprecated in documentation
|
||||||
|
using the ``.. deprecated:: A.B`` annotation. Include a short description
|
||||||
|
and a note about the upgrade path if applicable.
|
||||||
|
|
||||||
|
#) Add a description of the deprecated behavior, and the upgrade path if
|
||||||
|
applicable, to the current release notes (``docs/releases/A.B.txt``) under
|
||||||
|
the "Features deprecated in A.B" heading.
|
||||||
|
|
||||||
|
#) Add an entry in the deprecation timeline (``docs/internals/deprecation.txt``)
|
||||||
|
under the ``A.B+2`` version describing what code will be removed.
|
||||||
|
|
||||||
|
Once you have completed these steps, you are finished with the deprecation.
|
||||||
|
In each minor release, all ``PendingDeprecationWarning``\s are promoted to
|
||||||
|
``DeprecationWarning``\s and any features marked with ``DeprecationWarning``
|
||||||
|
are removed.
|
||||||
|
|
||||||
Javascript patches
|
Javascript patches
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue