This commit is contained in:
Carlton Gibson 2015-09-25 08:28:13 +00:00
commit 589a218413
12 changed files with 52 additions and 31 deletions

View File

@ -24,6 +24,12 @@ The timeline for deprecation of a feature present in version 1.0 would work as f
* Version 1.3 would remove the deprecated bits of API entirely. * Version 1.3 would remove the deprecated bits of API entirely.
Deprecations are marked using `rest_framework.compat.deprecated`, which accepts a version tuple for the version when code is first deprecated and message to pass to the `warnings` module:
from rest_framework.compat import deprecated
...
deprecated((3,1,0), "Using X for Y is deprecated. Prefer Z")
Note that in line with Django's policy, any parts of the framework not mentioned in the documentation should generally be considered private API, and may be subject to change. Note that in line with Django's policy, any parts of the framework not mentioned in the documentation should generally be considered private API, and may be subject to change.
## Upgrading ## Upgrading

View File

@ -6,12 +6,32 @@ versions of Django/Python, and compatibility wrappers around optional packages.
# flake8: noqa # flake8: noqa
from __future__ import unicode_literals from __future__ import unicode_literals
import warnings
import django import django
from django.conf import settings from django.conf import settings
from django.db import connection, transaction from django.db import connection, transaction
from django.utils import six from django.utils import six
from django.views.generic import View from django.views.generic import View
from rest_framework import VERSION
def deprecated(since, message):
current_version = [int(i) for i in VERSION.split('.')]
assert current_version[0] == since[0], "Deprecated code must be removed before major version change. Current: {0} vs Deprecated Since: {1}".format(current_version[0], since[0])
minor_version_difference = current_version[1] - since[1]
assert minor_version_difference in [1,2], "Deprecated code must be removed within two minor versions"
warning_type = PendingDeprecationWarning if minor_version_difference == 1 else DeprecationWarning
warnings.warn(message, warning_type)
try: try:
import importlib # Available in Python 3.1+ import importlib # Available in Python 3.1+
except ImportError: except ImportError:

View File

@ -5,7 +5,6 @@ be used for paginated responses.
""" """
from __future__ import unicode_literals from __future__ import unicode_literals
import warnings
from base64 import b64decode, b64encode from base64 import b64decode, b64encode
from collections import namedtuple from collections import namedtuple
@ -16,7 +15,7 @@ from django.utils import six
from django.utils.six.moves.urllib import parse as urlparse from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import OrderedDict from rest_framework.compat import OrderedDict, deprecated
from rest_framework.exceptions import NotFound from rest_framework.exceptions import NotFound
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
@ -216,13 +215,11 @@ class PageNumberPagination(BasePagination):
value = getattr(api_settings, settings_key, None) value = getattr(api_settings, settings_key, None)
if value is not None: if value is not None:
setattr(self, attr_name, value) setattr(self, attr_name, value)
warnings.warn( deprecated((3, 0, 0),
"The `%s` settings key is deprecated. " "The `%s` settings key is deprecated. "
"Use the `%s` attribute on the pagination class instead." % ( "Use the `%s` attribute on the pagination class instead." % (
settings_key, attr_name settings_key, attr_name)
), )
DeprecationWarning,
)
for (view_attr, attr_name) in ( for (view_attr, attr_name) in (
('paginate_by', 'page_size'), ('paginate_by', 'page_size'),
@ -233,13 +230,11 @@ class PageNumberPagination(BasePagination):
value = getattr(view, view_attr, None) value = getattr(view, view_attr, None)
if value is not None: if value is not None:
setattr(self, attr_name, value) setattr(self, attr_name, value)
warnings.warn( deprecated((3, 0, 0),
"The `%s` view attribute is deprecated. " "The `%s` view attribute is deprecated. "
"Use the `%s` attribute on the pagination class instead." % ( "Use the `%s` attribute on the pagination class instead." % (
view_attr, attr_name view_attr, attr_name)
), )
DeprecationWarning,
)
def paginate_queryset(self, queryset, request, view=None): def paginate_queryset(self, queryset, request, view=None):
""" """

View File

@ -6,13 +6,13 @@ from django.http import Http404
from django.test import TestCase, TransactionTestCase from django.test import TestCase, TransactionTestCase
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.unittest import skipUnless from django.utils.unittest import skipUnless
from tests.models import BasicModel
from rest_framework import status from rest_framework import status
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from rest_framework.views import APIView from rest_framework.views import APIView
from tests.models import BasicModel
factory = APIRequestFactory() factory = APIRequestFactory()

View File

@ -6,13 +6,13 @@ from django.db import models
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.test import TestCase from django.test import TestCase
from django.utils import six from django.utils import six
from tests.models import (
BasicModel, ForeignKeySource, ForeignKeyTarget, RESTFrameworkModel
)
from rest_framework import generics, renderers, serializers, status from rest_framework import generics, renderers, serializers, status
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from tests.models import (
BasicModel, ForeignKeySource, ForeignKeyTarget, RESTFrameworkModel
)
factory = APIRequestFactory() factory = APIRequestFactory()

View File

@ -2,9 +2,9 @@ from __future__ import unicode_literals
from django.db import models from django.db import models
from django.test import TestCase from django.test import TestCase
from tests.models import RESTFrameworkModel
from rest_framework import serializers from rest_framework import serializers
from tests.models import RESTFrameworkModel
# Models # Models

View File

@ -7,6 +7,7 @@ from django.core.urlresolvers import ResolverMatch
from django.db import models from django.db import models
from django.test import TestCase from django.test import TestCase
from django.utils import unittest from django.utils import unittest
from tests.models import BasicModel
from rest_framework import ( from rest_framework import (
HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers, HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers,
@ -16,7 +17,6 @@ from rest_framework.compat import get_model_name, guardian
from rest_framework.filters import DjangoObjectPermissionsFilter from rest_framework.filters import DjangoObjectPermissionsFilter
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from tests.models import BasicModel
factory = APIRequestFactory() factory = APIRequestFactory()

View File

@ -2,14 +2,14 @@ from __future__ import unicode_literals
from django.conf.urls import url from django.conf.urls import url
from django.test import TestCase from django.test import TestCase
from rest_framework import serializers
from rest_framework.test import APIRequestFactory
from tests.models import ( from tests.models import (
ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget, ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget,
NullableForeignKeySource, NullableOneToOneSource, OneToOneTarget NullableForeignKeySource, NullableOneToOneSource, OneToOneTarget
) )
from rest_framework import serializers
from rest_framework.test import APIRequestFactory
factory = APIRequestFactory() factory = APIRequestFactory()
request = factory.get('/') # Just to ensure we have a request in the serializer context request = factory.get('/') # Just to ensure we have a request in the serializer context

View File

@ -2,13 +2,13 @@ from __future__ import unicode_literals
from django.test import TestCase from django.test import TestCase
from django.utils import six from django.utils import six
from rest_framework import serializers
from tests.models import ( from tests.models import (
ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget, ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget,
NullableForeignKeySource, NullableOneToOneSource, OneToOneTarget NullableForeignKeySource, NullableOneToOneSource, OneToOneTarget
) )
from rest_framework import serializers
# ManyToMany # ManyToMany
class ManyToManyTargetSerializer(serializers.ModelSerializer): class ManyToManyTargetSerializer(serializers.ModelSerializer):

View File

@ -1,10 +1,10 @@
from django.test import TestCase from django.test import TestCase
from rest_framework import serializers
from tests.models import ( from tests.models import (
ForeignKeySource, ForeignKeyTarget, NullableForeignKeySource ForeignKeySource, ForeignKeyTarget, NullableForeignKeySource
) )
from rest_framework import serializers
class ForeignKeyTargetSerializer(serializers.ModelSerializer): class ForeignKeyTargetSerializer(serializers.ModelSerializer):
sources = serializers.SlugRelatedField( sources = serializers.SlugRelatedField(

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.conf.urls import include, url from django.conf.urls import include, url
from django.test import TestCase from django.test import TestCase
from django.utils import six from django.utils import six
from tests.models import BasicModel
from rest_framework import generics, routers, serializers, status, viewsets from rest_framework import generics, routers, serializers, status, viewsets
from rest_framework.renderers import ( from rest_framework.renderers import (
@ -11,7 +12,6 @@ from rest_framework.renderers import (
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings
from rest_framework.views import APIView from rest_framework.views import APIView
from tests.models import BasicModel
# Serializer used to test BasicModel # Serializer used to test BasicModel

View File

@ -4,12 +4,12 @@ from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.test import TestCase from django.test import TestCase
from django.utils import six from django.utils import six
from tests.models import BasicModel
import rest_framework.utils.model_meta import rest_framework.utils.model_meta
from rest_framework.utils.breadcrumbs import get_breadcrumbs from rest_framework.utils.breadcrumbs import get_breadcrumbs
from rest_framework.utils.model_meta import _resolve_model from rest_framework.utils.model_meta import _resolve_model
from rest_framework.views import APIView from rest_framework.views import APIView
from tests.models import BasicModel
class Root(APIView): class Root(APIView):