Skip to content

Commit 937e2d1

Browse files
committed
Added Deprecation Warnings for CoreAPI
1 parent 35c0abf commit 937e2d1

File tree

5 files changed

+81
-3
lines changed

5 files changed

+81
-3
lines changed

rest_framework/filters.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
returned by list views.
44
"""
55
import operator
6+
import warnings
67
from functools import reduce
78

89
from django.core.exceptions import ImproperlyConfigured
@@ -12,6 +13,7 @@
1213
from django.utils.encoding import force_str
1314
from django.utils.translation import gettext_lazy as _
1415

16+
from rest_framework import RemovedInDRF314Warning
1517
from rest_framework.compat import coreapi, coreschema, distinct
1618
from rest_framework.settings import api_settings
1719

@@ -29,6 +31,8 @@ def filter_queryset(self, request, queryset, view):
2931

3032
def get_schema_fields(self, view):
3133
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
34+
if coreapi is not None:
35+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
3236
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
3337
return []
3438

@@ -146,6 +150,8 @@ def to_html(self, request, queryset, view):
146150

147151
def get_schema_fields(self, view):
148152
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
153+
if coreapi is not None:
154+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
149155
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
150156
return [
151157
coreapi.Field(
@@ -296,6 +302,8 @@ def to_html(self, request, queryset, view):
296302

297303
def get_schema_fields(self, view):
298304
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
305+
if coreapi is not None:
306+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
299307
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
300308
return [
301309
coreapi.Field(

rest_framework/pagination.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Pagination serializers determine the structure of the output that should
33
be used for paginated responses.
44
"""
5+
import warnings
56
from base64 import b64decode, b64encode
67
from collections import OrderedDict, namedtuple
78
from urllib import parse
@@ -12,6 +13,7 @@
1213
from django.utils.encoding import force_str
1314
from django.utils.translation import gettext_lazy as _
1415

16+
from rest_framework import RemovedInDRF314Warning
1517
from rest_framework.compat import coreapi, coreschema
1618
from rest_framework.exceptions import NotFound
1719
from rest_framework.response import Response
@@ -149,6 +151,8 @@ def get_results(self, data):
149151

150152
def get_schema_fields(self, view):
151153
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
154+
if coreapi is not None:
155+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
152156
return []
153157

154158
def get_schema_operation_parameters(self, view):
@@ -307,6 +311,8 @@ def to_html(self):
307311

308312
def get_schema_fields(self, view):
309313
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
314+
if coreapi is not None:
315+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
310316
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
311317
fields = [
312318
coreapi.Field(
@@ -525,6 +531,8 @@ def get_count(self, queryset):
525531

526532
def get_schema_fields(self, view):
527533
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
534+
if coreapi is not None:
535+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
528536
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
529537
return [
530538
coreapi.Field(
@@ -924,6 +932,8 @@ def to_html(self):
924932

925933
def get_schema_fields(self, view):
926934
assert coreapi is not None, 'coreapi must be installed to use `get_schema_fields()`'
935+
if coreapi is not None:
936+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
927937
assert coreschema is not None, 'coreschema must be installed to use `get_schema_fields()`'
928938
fields = [
929939
coreapi.Field(

rest_framework/schemas/coreapi.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.db import models
66
from django.utils.encoding import force_str
77

8-
from rest_framework import exceptions, serializers
8+
from rest_framework import RemovedInDRF314Warning, exceptions, serializers
99
from rest_framework.compat import coreapi, coreschema, uritemplate
1010
from rest_framework.settings import api_settings
1111

@@ -118,6 +118,8 @@ class SchemaGenerator(BaseSchemaGenerator):
118118

119119
def __init__(self, title=None, url=None, description=None, patterns=None, urlconf=None, version=None):
120120
assert coreapi, '`coreapi` must be installed for schema support.'
121+
if coreapi is not None:
122+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
121123
assert coreschema, '`coreschema` must be installed for schema support.'
122124

123125
super(SchemaGenerator, self).__init__(title, url, description, patterns, urlconf)
@@ -347,6 +349,8 @@ def __init__(self, manual_fields=None):
347349
will be added to auto-generated fields, overwriting on `Field.name`
348350
"""
349351
super(AutoSchema, self).__init__()
352+
if coreapi is not None:
353+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
350354
if manual_fields is None:
351355
manual_fields = []
352356
self._manual_fields = manual_fields
@@ -588,6 +592,8 @@ def __init__(self, fields, description='', encoding=None):
588592
* `description`: String description for view. Optional.
589593
"""
590594
super(ManualSchema, self).__init__()
595+
if coreapi is not None:
596+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
591597
assert all(isinstance(f, coreapi.Field) for f in fields), "`fields` must be a list of coreapi.Field instances"
592598
self._fields = fields
593599
self._description = description
@@ -609,4 +615,6 @@ def get_link(self, path, method, base_url):
609615

610616
def is_enabled():
611617
"""Is CoreAPI Mode enabled?"""
618+
if coreapi is not None:
619+
warnings.warn('CoreAPI compatibility is deprecated and will be removed in DRF 3.14', RemovedInDRF314Warning)
612620
return issubclass(api_settings.DEFAULT_SCHEMA_CLASS, AutoSchema)

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ license_file = LICENSE.md
44
[tool:pytest]
55
addopts=--tb=short --strict -ra
66
testspath = tests
7+
filterwarnings = ignore:CoreAPI compatibility is deprecated*:rest_framework.RemovedInDRF314Warning
78

89
[flake8]
910
ignore = E501,W504

tests/schemas/test_coreapi.py

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,24 @@
88
from django.urls import path
99

1010
from rest_framework import (
11-
filters, generics, pagination, permissions, serializers
11+
RemovedInDRF314Warning, filters, generics, pagination, permissions,
12+
serializers
1213
)
1314
from rest_framework.compat import coreapi, coreschema
1415
from rest_framework.decorators import action, api_view, schema
16+
from rest_framework.filters import (
17+
BaseFilterBackend, OrderingFilter, SearchFilter
18+
)
19+
from rest_framework.pagination import (
20+
BasePagination, CursorPagination, LimitOffsetPagination,
21+
PageNumberPagination
22+
)
1523
from rest_framework.request import Request
1624
from rest_framework.routers import DefaultRouter, SimpleRouter
1725
from rest_framework.schemas import (
1826
AutoSchema, ManualSchema, SchemaGenerator, get_schema_view
1927
)
20-
from rest_framework.schemas.coreapi import field_to_schema
28+
from rest_framework.schemas.coreapi import field_to_schema, is_enabled
2129
from rest_framework.schemas.generators import EndpointEnumerator
2230
from rest_framework.schemas.utils import is_list_view
2331
from rest_framework.test import APIClient, APIRequestFactory
@@ -1374,3 +1382,46 @@ def test_schema_handles_exception():
13741382
response.render()
13751383
assert response.status_code == 403
13761384
assert b"You do not have permission to perform this action." in response.content
1385+
1386+
1387+
@pytest.mark.skipif(not coreapi, reason='coreapi is not installed')
1388+
def test_coreapi_deprecation():
1389+
with pytest.warns(RemovedInDRF314Warning):
1390+
SchemaGenerator()
1391+
1392+
with pytest.warns(RemovedInDRF314Warning):
1393+
AutoSchema()
1394+
1395+
with pytest.warns(RemovedInDRF314Warning):
1396+
ManualSchema({})
1397+
1398+
with pytest.warns(RemovedInDRF314Warning):
1399+
deprecated_filter = OrderingFilter()
1400+
deprecated_filter.get_schema_fields({})
1401+
1402+
with pytest.warns(RemovedInDRF314Warning):
1403+
deprecated_filter = BaseFilterBackend()
1404+
deprecated_filter.get_schema_fields({})
1405+
1406+
with pytest.warns(RemovedInDRF314Warning):
1407+
deprecated_filter = SearchFilter()
1408+
deprecated_filter.get_schema_fields({})
1409+
1410+
with pytest.warns(RemovedInDRF314Warning):
1411+
paginator = BasePagination()
1412+
paginator.get_schema_fields({})
1413+
1414+
with pytest.warns(RemovedInDRF314Warning):
1415+
paginator = PageNumberPagination()
1416+
paginator.get_schema_fields({})
1417+
1418+
with pytest.warns(RemovedInDRF314Warning):
1419+
paginator = LimitOffsetPagination()
1420+
paginator.get_schema_fields({})
1421+
1422+
with pytest.warns(RemovedInDRF314Warning):
1423+
paginator = CursorPagination()
1424+
paginator.get_schema_fields({})
1425+
1426+
with pytest.warns(RemovedInDRF314Warning):
1427+
is_enabled()

0 commit comments

Comments
 (0)