Skip to content

Commit bb79567

Browse files
authored
Drop all compat support to Django < 2 urls (#7337)
1 parent 65add66 commit bb79567

File tree

7 files changed

+18
-84
lines changed

7 files changed

+18
-84
lines changed

rest_framework/compat.py

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,6 @@
55
from django.conf import settings
66
from django.views.generic import View
77

8-
try:
9-
from django.urls import ( # noqa
10-
URLPattern,
11-
URLResolver,
12-
)
13-
except ImportError:
14-
# Will be removed in Django 2.0
15-
from django.urls import ( # noqa
16-
RegexURLPattern as URLPattern,
17-
RegexURLResolver as URLResolver,
18-
)
19-
20-
21-
def get_original_route(urlpattern):
22-
"""
23-
Get the original route/regex that was typed in by the user into the path(), re_path() or url() directive. This
24-
is in contrast with get_regex_pattern below, which for RoutePattern returns the raw regex generated from the path().
25-
"""
26-
if hasattr(urlpattern, 'pattern'):
27-
# Django 2.0
28-
return str(urlpattern.pattern)
29-
else:
30-
# Django < 2.0
31-
return urlpattern.regex.pattern
32-
33-
34-
def get_regex_pattern(urlpattern):
35-
"""
36-
Get the raw regex out of the urlpattern's RegexPattern or RoutePattern. This is always a regular expression,
37-
unlike get_original_route above.
38-
"""
39-
if hasattr(urlpattern, 'pattern'):
40-
# Django 2.0
41-
return urlpattern.pattern.regex.pattern
42-
else:
43-
# Django < 2.0
44-
return urlpattern.regex.pattern
45-
46-
47-
def is_route_pattern(urlpattern):
48-
if hasattr(urlpattern, 'pattern'):
49-
# Django 2.0
50-
from django.urls.resolvers import RoutePattern
51-
return isinstance(urlpattern.pattern, RoutePattern)
52-
else:
53-
# Django < 2.0
54-
return False
55-
56-
57-
def make_url_resolver(regex, urlpatterns):
58-
try:
59-
# Django 2.0
60-
from django.urls.resolvers import RegexPattern
61-
return URLResolver(RegexPattern(regex), urlpatterns)
62-
63-
except ImportError:
64-
# Django < 2.0
65-
return URLResolver(regex, urlpatterns)
66-
678

689
def unicode_http_header(value):
6910
# Coerce HTTP header value to unicode.

rest_framework/schemas/generators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
from django.contrib.admindocs.views import simplify_regex
1111
from django.core.exceptions import PermissionDenied
1212
from django.http import Http404
13+
from django.urls import URLPattern, URLResolver
1314

1415
from rest_framework import exceptions
15-
from rest_framework.compat import URLPattern, URLResolver, get_original_route
1616
from rest_framework.request import clone_request
1717
from rest_framework.settings import api_settings
1818
from rest_framework.utils.model_meta import _get_pk
@@ -79,7 +79,7 @@ def get_api_endpoints(self, patterns=None, prefix=''):
7979
api_endpoints = []
8080

8181
for pattern in patterns:
82-
path_regex = prefix + get_original_route(pattern)
82+
path_regex = prefix + str(pattern.pattern)
8383
if isinstance(pattern, URLPattern):
8484
path = self.get_path_from_regex(path_regex)
8585
callback = pattern.callback

rest_framework/urlpatterns.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from django.conf.urls import include, url
2-
from django.urls import path, register_converter
2+
from django.urls import URLResolver, path, register_converter
3+
from django.urls.resolvers import RoutePattern
34

4-
from rest_framework.compat import (
5-
URLResolver, get_regex_pattern, is_route_pattern
6-
)
75
from rest_framework.settings import api_settings
86

97

@@ -38,7 +36,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_r
3836
for urlpattern in urlpatterns:
3937
if isinstance(urlpattern, URLResolver):
4038
# Set of included URL patterns
41-
regex = get_regex_pattern(urlpattern)
39+
regex = urlpattern.pattern.regex.pattern
4240
namespace = urlpattern.namespace
4341
app_name = urlpattern.app_name
4442
kwargs = urlpattern.default_kwargs
@@ -49,7 +47,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_r
4947
suffix_route)
5048

5149
# if the original pattern was a RoutePattern we need to preserve it
52-
if is_route_pattern(urlpattern):
50+
if isinstance(urlpattern.pattern, RoutePattern):
5351
assert path is not None
5452
route = str(urlpattern.pattern)
5553
new_pattern = path(route, include((patterns, app_name), namespace), kwargs)
@@ -59,7 +57,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_r
5957
ret.append(new_pattern)
6058
else:
6159
# Regular URL pattern
62-
regex = get_regex_pattern(urlpattern).rstrip('$').rstrip('/') + suffix_pattern
60+
regex = urlpattern.pattern.regex.pattern.rstrip('$').rstrip('/') + suffix_pattern
6361
view = urlpattern.callback
6462
kwargs = urlpattern.default_args
6563
name = urlpattern.name
@@ -68,7 +66,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_r
6866
ret.append(urlpattern)
6967

7068
# if the original pattern was a RoutePattern we need to preserve it
71-
if is_route_pattern(urlpattern):
69+
if isinstance(urlpattern.pattern, RoutePattern):
7270
assert path is not None
7371
assert suffix_route is not None
7472
route = str(urlpattern.pattern).rstrip('$').rstrip('/') + suffix_route

tests/schemas/test_coreapi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from rest_framework import (
1111
filters, generics, pagination, permissions, serializers
1212
)
13-
from rest_framework.compat import coreapi, coreschema, get_regex_pattern
13+
from rest_framework.compat import coreapi, coreschema
1414
from rest_framework.decorators import action, api_view, schema
1515
from rest_framework.request import Request
1616
from rest_framework.routers import DefaultRouter, SimpleRouter
@@ -1079,7 +1079,7 @@ def test_should_include_endpoint_excludes_correctly(self):
10791079
inspector = EndpointEnumerator(self.patterns)
10801080

10811081
# Not pretty. Mimics internals of EndpointEnumerator to put should_include_endpoint under test
1082-
pairs = [(inspector.get_path_from_regex(get_regex_pattern(pattern)), pattern.callback)
1082+
pairs = [(inspector.get_path_from_regex(pattern.pattern.regex.pattern), pattern.callback)
10831083
for pattern in self.patterns]
10841084

10851085
should_include = [

tests/test_filters.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import datetime
22
from importlib import reload as reload_module
33

4-
import django
54
import pytest
65
from django.core.exceptions import ImproperlyConfigured
76
from django.db import models
@@ -191,7 +190,6 @@ def test_search_field_with_null_characters(self):
191190

192191
assert terms == ['asdf']
193192

194-
@pytest.mark.skipif(django.VERSION[:2] < (2, 2), reason="requires django 2.2 or higher")
195193
def test_search_field_with_additional_transforms(self):
196194
from django.test.utils import register_lookup
197195

tests/test_routers.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from django.urls import resolve, reverse
99

1010
from rest_framework import permissions, serializers, viewsets
11-
from rest_framework.compat import get_regex_pattern
1211
from rest_framework.decorators import action
1312
from rest_framework.response import Response
1413
from rest_framework.routers import DefaultRouter, SimpleRouter
@@ -192,8 +191,7 @@ def setUp(self):
192191

193192
def test_custom_lookup_field_route(self):
194193
detail_route = notes_router.urls[-1]
195-
detail_url_pattern = get_regex_pattern(detail_route)
196-
assert '<uuid>' in detail_url_pattern
194+
assert '<uuid>' in detail_route.pattern.regex.pattern
197195

198196
def test_retrieve_lookup_field_list_view(self):
199197
response = self.client.get('/example/notes/')
@@ -229,7 +227,7 @@ class NoteViewSet(viewsets.ModelViewSet):
229227
def test_urls_limited_by_lookup_value_regex(self):
230228
expected = ['^notes/$', '^notes/(?P<uuid>[0-9a-f]{32})/$']
231229
for idx in range(len(expected)):
232-
assert expected[idx] == get_regex_pattern(self.urls[idx])
230+
assert expected[idx] == self.urls[idx].pattern.regex.pattern
233231

234232

235233
@override_settings(ROOT_URLCONF='tests.test_routers')
@@ -249,8 +247,7 @@ def setUp(self):
249247

250248
def test_custom_lookup_url_kwarg_route(self):
251249
detail_route = kwarged_notes_router.urls[-1]
252-
detail_url_pattern = get_regex_pattern(detail_route)
253-
assert '^notes/(?P<text>' in detail_url_pattern
250+
assert '^notes/(?P<text>' in detail_route.pattern.regex.pattern
254251

255252
def test_retrieve_lookup_url_kwarg_detail_view(self):
256253
response = self.client.get('/example2/notes/fo/')
@@ -273,7 +270,7 @@ class NoteViewSet(viewsets.ModelViewSet):
273270
def test_urls_have_trailing_slash_by_default(self):
274271
expected = ['^notes/$', '^notes/(?P<pk>[^/.]+)/$']
275272
for idx in range(len(expected)):
276-
assert expected[idx] == get_regex_pattern(self.urls[idx])
273+
assert expected[idx] == self.urls[idx].pattern.regex.pattern
277274

278275

279276
class TestTrailingSlashRemoved(TestCase):
@@ -288,7 +285,7 @@ class NoteViewSet(viewsets.ModelViewSet):
288285
def test_urls_can_have_trailing_slash_removed(self):
289286
expected = ['^notes$', '^notes/(?P<pk>[^/.]+)$']
290287
for idx in range(len(expected)):
291-
assert expected[idx] == get_regex_pattern(self.urls[idx])
288+
assert expected[idx] == self.urls[idx].pattern.regex.pattern
292289

293290

294291
class TestNameableRoot(TestCase):

tests/test_urlpatterns.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
from django.conf.urls import include, url
55
from django.test import TestCase
6-
from django.urls import Resolver404, path, re_path
6+
from django.urls import Resolver404, URLResolver, path, re_path
7+
from django.urls.resolvers import RegexPattern
78

8-
from rest_framework.compat import make_url_resolver
99
from rest_framework.test import APIRequestFactory
1010
from rest_framework.urlpatterns import format_suffix_patterns
1111

@@ -28,7 +28,7 @@ def _resolve_urlpatterns(self, urlpatterns, test_paths, allowed=None):
2828
urlpatterns = format_suffix_patterns(urlpatterns, allowed=allowed)
2929
except Exception:
3030
self.fail("Failed to apply `format_suffix_patterns` on the supplied urlpatterns")
31-
resolver = make_url_resolver(r'^/', urlpatterns)
31+
resolver = URLResolver(RegexPattern(r'^/'), urlpatterns)
3232
for test_path in test_paths:
3333
try:
3434
test_path, expected_resolved = test_path

0 commit comments

Comments
 (0)