diff --git a/django/utils/regex_helper.py b/django/utils/regex_helper.py index 3e3d349433..181285da4f 100644 --- a/django/utils/regex_helper.py +++ b/django/utils/regex_helper.py @@ -74,7 +74,11 @@ def normalize(pattern): # A "while" loop is used here because later on we need to be able to peek # at the next character and possibly go around without consuming another # one at the top of the loop. - ch, escaped = pattern_iter.next() + try: + ch, escaped = pattern_iter.next() + except StopIteration: + return zip([''], [[]]) + try: while True: if escaped: diff --git a/tests/regressiontests/urlpatterns_reverse/extra_urls.py b/tests/regressiontests/urlpatterns_reverse/extra_urls.py new file mode 100644 index 0000000000..ccf2365878 --- /dev/null +++ b/tests/regressiontests/urlpatterns_reverse/extra_urls.py @@ -0,0 +1,11 @@ +""" +Some extra URL patterns that are included at the top level. +""" + +from django.conf.urls.defaults import * +from views import empty_view + +urlpatterns = patterns('', + url(r'^e-places/(\d+)/$', empty_view, name='extra-places'), + url(r'^e-people/(?P\w+)/$', empty_view, name="extra-people"), +) diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py index fbea3cb570..ff94196a92 100644 --- a/tests/regressiontests/urlpatterns_reverse/tests.py +++ b/tests/regressiontests/urlpatterns_reverse/tests.py @@ -61,6 +61,9 @@ test_data = ( ('inner-extra', NoReverseMatch, ['fred', 'inner'], {}), ('disjunction', NoReverseMatch, ['foo'], {}), ('inner-disjunction', NoReverseMatch, ['10', '11'], {}), + ('extra-places', '/e-places/10/', ['10'], {}), + ('extra-people', '/e-people/fred/', ['fred'], {}), + ('extra-people', '/e-people/fred/', [], {'name': 'fred'}), ) class URLPatternReverse(TestCase): diff --git a/tests/regressiontests/urlpatterns_reverse/urls.py b/tests/regressiontests/urlpatterns_reverse/urls.py index 21f2ddafb7..1adefbe0a3 100644 --- a/tests/regressiontests/urlpatterns_reverse/urls.py +++ b/tests/regressiontests/urlpatterns_reverse/urls.py @@ -40,6 +40,7 @@ urlpatterns = patterns('', url(r'^(?i)test/2/?$', empty_view, name="test2"), url(r'^outer/(?P\d+)/', include('regressiontests.urlpatterns_reverse.included_urls')), + url('', include('regressiontests.urlpatterns_reverse.extra_urls')), # This is non-reversible, but we shouldn't blow up when parsing it. url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),