From c436b8ab00a7e5781af39f7afa8a9e33dfc2956d Mon Sep 17 00:00:00 2001 From: "Asif Saif Uddin (Auvi)" Date: Fri, 20 Sep 2019 14:42:19 +0600 Subject: [PATCH] used path and re_path for urls --- rest_framework/urls.py | 10 ++++-- tests/test_routers.py | 22 +++++++----- tests/test_testing.py | 12 +++---- tests/test_urlpatterns.py | 31 +++++++++------- tests/test_utils.py | 19 ++++++---- tests/test_versioning.py | 74 ++++++++++++++++++++++++++------------- tests/test_viewsets.py | 4 +-- tests/urls.py | 4 +-- 8 files changed, 110 insertions(+), 66 deletions(-) diff --git a/rest_framework/urls.py b/rest_framework/urls.py index 482a0a364..15a422a32 100644 --- a/rest_framework/urls.py +++ b/rest_framework/urls.py @@ -11,11 +11,15 @@ your API requires authentication: You should make sure your authentication settings include `SessionAuthentication`. """ -from django.conf.urls import url +from django.urls import path from django.contrib.auth import views app_name = 'rest_framework' urlpatterns = [ - url(r'^login/$', views.LoginView.as_view(template_name='rest_framework/login.html'), name='login'), - url(r'^logout/$', views.LogoutView.as_view(), name='logout'), + path( + 'login/', + views.LoginView.as_view(template_name='rest_framework/login.html'), + name='login' + ), + path('logout/', views.LogoutView.as_view(), name='logout'), ] diff --git a/tests/test_routers.py b/tests/test_routers.py index 0f428e2a5..f5a1d43bf 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -2,11 +2,10 @@ import warnings from collections import namedtuple import pytest -from django.conf.urls import include, url from django.core.exceptions import ImproperlyConfigured from django.db import models from django.test import TestCase, override_settings -from django.urls import resolve, reverse +from django.urls import resolve, reverse, include, path from rest_framework import ( RemovedInDRF311Warning, permissions, serializers, viewsets @@ -122,7 +121,7 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase): router.register('basics', BasicViewSet, basename='basic') urlpatterns = [ - url(r'^api/', include(router.urls)), + path('api/', include(router.urls)), ] def setUp(self): @@ -167,8 +166,13 @@ class TestSimpleRouter(URLPatternsTestCase, TestCase): class TestRootView(URLPatternsTestCase, TestCase): urlpatterns = [ - url(r'^non-namespaced/', include(namespaced_router.urls)), - url(r'^namespaced/', include((namespaced_router.urls, 'namespaced'), namespace='namespaced')), + path('non-namespaced/', include(namespaced_router.urls)), + path( + 'namespaced/', + include( + (namespaced_router.urls, 'namespaced'), + namespace='namespaced') + ), ] def test_retrieve_namespaced_root(self): @@ -185,8 +189,8 @@ class TestCustomLookupFields(URLPatternsTestCase, TestCase): Ensure that custom lookup fields are correctly routed. """ urlpatterns = [ - url(r'^example/', include(notes_router.urls)), - url(r'^example2/', include(kwarged_notes_router.urls)), + path('example/', include(notes_router.urls)), + path('example2/', include(kwarged_notes_router.urls)), ] def setUp(self): @@ -243,8 +247,8 @@ class TestLookupUrlKwargs(URLPatternsTestCase, TestCase): Setup a deep lookup_field, but map it to a simple URL kwarg. """ urlpatterns = [ - url(r'^example/', include(notes_router.urls)), - url(r'^example2/', include(kwarged_notes_router.urls)), + path('example/', include(notes_router.urls)), + path('example2/', include(kwarged_notes_router.urls)), ] def setUp(self): diff --git a/tests/test_testing.py b/tests/test_testing.py index 8094bfd8d..91bd3b108 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -1,6 +1,6 @@ from io import BytesIO -from django.conf.urls import url +from django.urls import path from django.contrib.auth.models import User from django.shortcuts import redirect from django.test import TestCase, override_settings @@ -47,10 +47,10 @@ def post_view(request): urlpatterns = [ - url(r'^view/$', view), - url(r'^session-view/$', session_view), - url(r'^redirect-view/$', redirect_view), - url(r'^post-view/$', post_view) + path('view/', view), + path('session-view/', session_view), + path('redirect-view/', redirect_view), + path('post-view/', post_view) ] @@ -284,7 +284,7 @@ class TestAPIRequestFactory(TestCase): class TestUrlPatternTestCase(URLPatternsTestCase): urlpatterns = [ - url(r'^$', view), + path('', view), ] @classmethod diff --git a/tests/test_urlpatterns.py b/tests/test_urlpatterns.py index 25cc0032e..9f29bfe5b 100644 --- a/tests/test_urlpatterns.py +++ b/tests/test_urlpatterns.py @@ -1,11 +1,10 @@ import unittest from collections import namedtuple -from django.conf.urls import include, url +from django.urls import include, path, re_path, include, Resolver404 from django.test import TestCase -from django.urls import Resolver404 -from rest_framework.compat import make_url_resolver, path, re_path +from rest_framework.compat import make_url_resolver, from rest_framework.test import APIRequestFactory from rest_framework.urlpatterns import format_suffix_patterns @@ -62,7 +61,7 @@ class FormatSuffixTests(TestCase): def test_trailing_slash(self): urlpatterns = [ - url(r'^test/$', dummy_view), + path('test/', dummy_view), ] self._test_trailing_slash(urlpatterns) @@ -83,7 +82,7 @@ class FormatSuffixTests(TestCase): def test_format_suffix(self): urlpatterns = [ - url(r'^test$', dummy_view), + path('test/', dummy_view), ] self._test_format_suffix(urlpatterns) @@ -120,7 +119,7 @@ class FormatSuffixTests(TestCase): def test_default_args(self): urlpatterns = [ - url(r'^test$', dummy_view, {'foo': 'bar'}), + path('test/', dummy_view, {'foo': 'bar'}), ] self._test_default_args(urlpatterns) @@ -141,10 +140,10 @@ class FormatSuffixTests(TestCase): def test_included_urls(self): nested_patterns = [ - url(r'^path$', dummy_view) + path('path/', dummy_view) ] urlpatterns = [ - url(r'^test/', include(nested_patterns), {'foo': 'bar'}), + path('test/', include(nested_patterns), {'foo': 'bar'}), ] self._test_included_urls(urlpatterns) @@ -164,7 +163,7 @@ class FormatSuffixTests(TestCase): path('path', dummy_view) ] urlpatterns = [ - url('^test/', include(nested_patterns), {'foo': 'bar'}), + path('test/', include(nested_patterns), {'foo': 'bar'}), ] self._test_included_urls(urlpatterns) @@ -172,11 +171,17 @@ class FormatSuffixTests(TestCase): def test_included_urls_django2_mixed_args(self): nested_patterns = [ path('path/', dummy_view), - url('^url/(?P[0-9]+)$', dummy_view) + re_path('^url/(?P[0-9]+)$', dummy_view) ] urlpatterns = [ - url('^purl/(?P[0-9]+)/', include(nested_patterns), {'foo': 'bar'}), - path('ppath//', include(nested_patterns), {'foo': 'bar'}), + re_path( + '^purl/(?P[0-9]+)/', + include(nested_patterns), + {'foo': 'bar'}), + path( + 'ppath//', + include(nested_patterns), + {'foo': 'bar'}), ] test_paths = [ # parent url() nesting child path() @@ -212,7 +217,7 @@ class FormatSuffixTests(TestCase): def test_allowed_formats(self): urlpatterns = [ - url('^test$', dummy_view), + path('test/', dummy_view), ] self._test_allowed_formats(urlpatterns) diff --git a/tests/test_utils.py b/tests/test_utils.py index 500c6a3fa..a5a369b1e 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,6 @@ from unittest import mock -from django.conf.urls import url +from django.urls import path, re_path from django.test import TestCase, override_settings from rest_framework.decorators import action @@ -64,12 +64,17 @@ class ResourceViewSet(ModelViewSet): router = SimpleRouter() router.register(r'resources', ResourceViewSet) urlpatterns = [ - url(r'^$', Root.as_view()), - url(r'^resource/$', ResourceRoot.as_view()), - url(r'^resource/customname$', CustomNameResourceInstance.as_view()), - url(r'^resource/(?P[0-9]+)$', ResourceInstance.as_view()), - url(r'^resource/(?P[0-9]+)/$', NestedResourceRoot.as_view()), - url(r'^resource/(?P[0-9]+)/(?P[A-Za-z]+)$', NestedResourceInstance.as_view()), + path('', Root.as_view()), + path('resource/', ResourceRoot.as_view()), + path('resource/customname/', CustomNameResourceInstance.as_view()), + re_path( + r'^resource/(?P[0-9]+)$', + ResourceInstance.as_view()), + re_path(r'^resource/(?P[0-9]+)/$', NestedResourceRoot.as_view()), + re_path( + r'^resource/(?P[0-9]+)/(?P[A-Za-z]+)$', + NestedResourceInstance.as_view() + ), ] urlpatterns += router.urls diff --git a/tests/test_versioning.py b/tests/test_versioning.py index d4e269df3..f0f9564db 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -1,5 +1,5 @@ import pytest -from django.conf.urls import include, url +from django.urls import include, path, re_path from django.test import override_settings from rest_framework import serializers, status, versioning @@ -101,7 +101,8 @@ class TestRequestVersion: scheme = versioning.AcceptHeaderVersioning view = RequestVersionView.as_view(versioning_class=scheme) - request = factory.get('/endpoint/', HTTP_ACCEPT='application/json; version=1.2.3') + request = factory.get( + '/endpoint/', HTTP_ACCEPT='application/json; version=1.2.3') response = view(request) assert response.data == {'version': '1.2.3'} @@ -144,14 +145,20 @@ class TestRequestVersion: class TestURLReversing(URLPatternsTestCase, APITestCase): included = [ - url(r'^namespaced/$', dummy_view, name='another'), - url(r'^example/(?P\d+)/$', dummy_pk_view, name='example-detail') + path('namespaced/', dummy_view, name='another'), + re_path( + r'^example/(?P\d+)/$', + dummy_pk_view, + name='example-detail') ] urlpatterns = [ - url(r'^v1/', include((included, 'v1'), namespace='v1')), - url(r'^another/$', dummy_view, name='another'), - url(r'^(?P[v1|v2]+)/another/$', dummy_view, name='another'), + path('v1/', include((included, 'v1'), namespace='v1')), + path('another/', dummy_view, name='another'), + re_path( + r'^(?P[v1|v2]+)/another/$', + dummy_view, + name='another'), ] def test_reverse_unversioned(self): @@ -167,7 +174,8 @@ class TestURLReversing(URLPatternsTestCase, APITestCase): request = factory.get('/endpoint/?version=v1') response = view(request) - assert response.data == {'url': 'http://testserver/another/?version=v1'} + assert response.data == { + 'url': 'http://testserver/another/?version=v1'} request = factory.get('/endpoint/') response = view(request) @@ -237,7 +245,8 @@ class TestInvalidVersion: scheme = versioning.AcceptHeaderVersioning view = AllowedVersionsView.as_view(versioning_class=scheme) - request = factory.get('/endpoint/', HTTP_ACCEPT='application/json; version=v3') + request = factory.get( + '/endpoint/', HTTP_ACCEPT='application/json; version=v3') response = view(request) assert response.status_code == status.HTTP_406_NOT_ACCEPTABLE @@ -300,7 +309,8 @@ class TestAllowedAndDefaultVersion: def test_missing_with_default_and_none_allowed(self): scheme = versioning.AcceptHeaderVersioning - view = AllowedWithNoneAndDefaultVersionsView.as_view(versioning_class=scheme) + view = AllowedWithNoneAndDefaultVersionsView.as_view( + versioning_class=scheme) request = factory.get('/endpoint/', HTTP_ACCEPT='application/json') response = view(request) @@ -310,12 +320,15 @@ class TestAllowedAndDefaultVersion: class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase): included = [ - url(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='namespaced'), + re_path( + r'^namespaced/(?P\d+)/$', + dummy_pk_view, + name='namespaced'), ] urlpatterns = [ - url(r'^v1/', include((included, 'v1'), namespace='v1')), - url(r'^v2/', include((included, 'v2'), namespace='v2')) + path('v1/', include((included, 'v1'), namespace='v1')), + path('v2/', include((included, 'v2'), namespace='v2')) ] def setUp(self): @@ -342,17 +355,25 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase, APITestCase): class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase, APITestCase): nested = [ - url(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='nested'), + re_path(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='nested'), ] included = [ - url(r'^namespaced/(?P\d+)/$', dummy_pk_view, name='namespaced'), - url(r'^nested/', include((nested, 'nested-namespace'), namespace='nested-namespace')) + re_path( + r'^namespaced/(?P\d+)/$', + dummy_pk_view, + name='namespaced'), + path( + 'nested/', + include( + (nested, 'nested-namespace'), + namespace='nested-namespace') + ) ] urlpatterns = [ - url(r'^v1/', include((included, 'restframeworkv1'), namespace='v1')), - url(r'^v2/', include((included, 'restframeworkv2'), namespace='v2')), - url(r'^non-api/(?P\d+)/$', dummy_pk_view, name='non-api-view') + path('v1/', include((included, 'restframeworkv1'), namespace='v1')), + path('v2/', include((included, 'restframeworkv2'), namespace='v2')), + re_path(r'^non-api/(?P\d+)/$', dummy_pk_view, name='non-api-view') ] def _create_field(self, view_name, version): @@ -368,22 +389,27 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase, def test_api_url_is_properly_reversed_with_v1(self): field = self._create_field('namespaced', 'v1') - assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/namespaced/3/' + assert field.to_representation(PKOnlyObject( + 3)) == 'http://testserver/v1/namespaced/3/' def test_api_url_is_properly_reversed_with_v2(self): field = self._create_field('namespaced', 'v2') - assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/' + assert field.to_representation(PKOnlyObject( + 5)) == 'http://testserver/v2/namespaced/5/' def test_api_url_is_properly_reversed_with_nested(self): field = self._create_field('nested', 'v1:nested-namespace') - assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/nested/namespaced/3/' + assert field.to_representation(PKOnlyObject( + 3)) == 'http://testserver/v1/nested/namespaced/3/' def test_non_api_url_is_properly_reversed_regardless_of_the_version(self): """ Regression test for #2711 """ field = self._create_field('non-api-view', 'v1') - assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' + assert field.to_representation(PKOnlyObject( + 10)) == 'http://testserver/non-api/10/' field = self._create_field('non-api-view', 'v2') - assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' + assert field.to_representation(PKOnlyObject( + 10)) == 'http://testserver/non-api/10/' diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py index eac36f095..ca191b47c 100644 --- a/tests/test_viewsets.py +++ b/tests/test_viewsets.py @@ -1,7 +1,7 @@ from collections import OrderedDict import pytest -from django.conf.urls import include, url +from django.urls import include, path, re_path from django.db import models from django.test import TestCase, override_settings @@ -88,7 +88,7 @@ router.register(r'names', ActionNamesViewSet, basename='names') urlpatterns = [ - url(r'^api/', include(router.urls)), + path('api/', include(router.urls)), ] diff --git a/tests/urls.py b/tests/urls.py index 76ada5e3d..d9147683f 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -3,14 +3,14 @@ URLConf for test suite. We need only the docs urls for DocumentationRenderer tests. """ -from django.conf.urls import url +from django.urls import path from rest_framework.compat import coreapi from rest_framework.documentation import include_docs_urls if coreapi: urlpatterns = [ - url(r'^docs/', include_docs_urls(title='Test Suite API')), + path('docs/', include_docs_urls(title='Test Suite API')), ] else: urlpatterns = []