[2.0.x] Fixed #28663 -- Add a check for likely incorrectly migrated django.urls.path() routes.

Backport of 998c9dd599 from master
This commit is contained in:
Chris Lamb 2017-11-07 16:39:59 +00:00 committed by Tim Graham
parent 72f875541a
commit 518c11352c
7 changed files with 58 additions and 2 deletions

View File

@ -256,7 +256,16 @@ class RoutePattern(CheckURLMixin):
return None return None
def check(self): def check(self):
return self._check_pattern_startswith_slash() warnings = self._check_pattern_startswith_slash()
route = self._route
if '(?P<' in route or route.startswith('^') or route.endswith('$'):
warnings.append(Warning(
"Your URL pattern {} has a route that contains '(?P<', begins "
"with a '^', or ends with a '$'. This was likely an oversight "
"when migrating to django.urls.path().".format(self.describe()),
id='2_0.W001',
))
return warnings
def _compile(self, route): def _compile(self, route):
return re.compile(_route_to_regex(route, self._is_endpoint)[0]) return re.compile(_route_to_regex(route, self._is_endpoint)[0])

View File

@ -98,7 +98,9 @@ Backwards compatibility
Compatibility checks warn of potential problems that might occur after Compatibility checks warn of potential problems that might occur after
upgrading Django. upgrading Django.
Currently, there aren't any of these checks. * **2_0.W001**: Your URL pattern ``<pattern>`` has a ``route`` that contains
``(?P<``, begins with a ``^``, or ends with a ``$``. This was likely an
oversight when migrating from ``url()`` to :func:`~django.urls.path`.
Caches Caches
------ ------

View File

@ -135,6 +135,36 @@ class CheckUrlConfigTests(SimpleTestCase):
self.assertEqual(result, []) self.assertEqual(result, [])
class UpdatedToPathTests(SimpleTestCase):
@override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.contains_re_named_group')
def test_contains_re_named_group(self):
result = check_url_config(None)
self.assertEqual(len(result), 1)
warning = result[0]
self.assertEqual(warning.id, '2_0.W001')
expected_msg = "Your URL pattern '(?P<named-group>\\d+)' has a route"
self.assertIn(expected_msg, warning.msg)
@override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.beginning_with_caret')
def test_beginning_with_caret(self):
result = check_url_config(None)
self.assertEqual(len(result), 1)
warning = result[0]
self.assertEqual(warning.id, '2_0.W001')
expected_msg = "Your URL pattern '^beginning-with-caret' has a route"
self.assertIn(expected_msg, warning.msg)
@override_settings(ROOT_URLCONF='check_framework.urls.path_compatibility.ending_with_dollar')
def test_ending_with_dollar(self):
result = check_url_config(None)
self.assertEqual(len(result), 1)
warning = result[0]
self.assertEqual(warning.id, '2_0.W001')
expected_msg = "Your URL pattern 'ending-with-dollar$' has a route"
self.assertIn(expected_msg, warning.msg)
class CheckURLSettingsTests(SimpleTestCase): class CheckURLSettingsTests(SimpleTestCase):
@override_settings(STATIC_URL='a/', MEDIA_URL='b/') @override_settings(STATIC_URL='a/', MEDIA_URL='b/')

View File

@ -0,0 +1,5 @@
from django.urls import path
urlpatterns = [
path('^beginning-with-caret', lambda x: x),
]

View File

@ -0,0 +1,5 @@
from django.urls import path
urlpatterns = [
path('(?P<named-group>\d+)', lambda x: x),
]

View File

@ -0,0 +1,5 @@
from django.urls import path
urlpatterns = [
path('ending-with-dollar$', lambda x: x),
]