[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
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):
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
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
------

View File

@ -135,6 +135,36 @@ class CheckUrlConfigTests(SimpleTestCase):
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):
@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),
]