Skip to content

Commit bd655b1

Browse files
authored
Merge pull request #28 from mikaelengstrom/master
Add Django2 support
2 parents 1cb4fed + b85952d commit bd655b1

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

multiurl.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
from __future__ import unicode_literals
22

3-
from django.core import urlresolvers
3+
try:
4+
from django import urls as urlresolvers
5+
from django.urls.resolvers import RegexPattern
6+
except ImportError:
7+
# Fallbacks and mocks for Django 1.*
8+
from django.core import urlresolvers
9+
10+
urlresolvers.URLResolver = urlresolvers.RegexURLResolver
11+
12+
def RegexPattern(pattern):
13+
return pattern
414

515

616
class ContinueResolving(Exception):
@@ -12,9 +22,9 @@ def multiurl(*urls, **kwargs):
1222
return MultiRegexURLResolver(urls, exceptions)
1323

1424

15-
class MultiRegexURLResolver(urlresolvers.RegexURLResolver):
25+
class MultiRegexURLResolver(urlresolvers.URLResolver):
1626
def __init__(self, urls, exceptions):
17-
super(MultiRegexURLResolver, self).__init__('', None)
27+
super(MultiRegexURLResolver, self).__init__(RegexPattern(''), None)
1828
self._urls = urls
1929
self._exceptions = exceptions
2030

tests.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,28 @@
44

55
from django.conf import settings
66
from django.conf.urls import url
7-
from django.core.urlresolvers import RegexURLResolver, Resolver404, NoReverseMatch
7+
88
from django.http import HttpResponse
99

1010
from multiurl import multiurl, ContinueResolving
1111

12+
try:
13+
from django import urls as urlresolvers
14+
from django.urls.resolvers import RegexPattern
15+
except ImportError:
16+
# Fallbacks and mocks for Django 1.*
17+
from django.core import urlresolvers
18+
19+
urlresolvers.URLResolver = urlresolvers.RegexURLResolver
20+
21+
def RegexPattern(pattern):
22+
return pattern
23+
1224

1325
class MultiviewTests(unittest.TestCase):
1426
def setUp(self):
1527
# Patterns with a "catch all" view (thing) at the end.
16-
self.patterns_catchall = RegexURLResolver('^/', [
28+
self.patterns_catchall = urlresolvers.URLResolver(RegexPattern(r'^/'), [
1729
multiurl(
1830
url(r'^(\w+)/$', person, name='person'),
1931
url(r'^(\w+)/$', place, name='place'),
@@ -22,7 +34,7 @@ def setUp(self):
2234
])
2335

2436
# Patterns with no "catch all" - last view could still raise ContinueResolving.
25-
self.patterns_no_fallthrough = RegexURLResolver('^/', [
37+
self.patterns_no_fallthrough = urlresolvers.URLResolver(RegexPattern(r'^/'), [
2638
multiurl(
2739
url(r'^(\w+)/$', person, name='person'),
2840
url(r'^(\w+)/$', place, name='place'),
@@ -46,26 +58,27 @@ def test_resolve_match_last(self):
4658

4759
def test_resolve_match_faillthrough(self):
4860
m = self.patterns_no_fallthrough.resolve('/bacon/')
49-
with self.assertRaises(Resolver404):
61+
with self.assertRaises(urlresolvers.Resolver404):
5062
m.func(request=None, *m.args, **m.kwargs)
5163

5264
def test_no_match(self):
53-
with self.assertRaises(Resolver404):
65+
with self.assertRaises(urlresolvers.Resolver404):
5466
self.patterns_catchall.resolve('/eggs/and/bacon/')
5567

5668
def test_reverse(self):
5769
self.assertEqual('joe/', self.patterns_catchall.reverse('person', 'joe'))
5870
self.assertEqual('joe/', self.patterns_catchall.reverse('place', 'joe'))
5971
self.assertEqual('joe/', self.patterns_catchall.reverse('thing', 'joe'))
60-
with self.assertRaises(NoReverseMatch):
72+
with self.assertRaises(urlresolvers.NoReverseMatch):
6173
self.patterns_catchall.reverse('person')
62-
with self.assertRaises(NoReverseMatch):
74+
with self.assertRaises(urlresolvers.NoReverseMatch):
6375
self.patterns_catchall.reverse('argh', 'xyz')
6476

6577
#
6678
# Some "views" to test against.
6779
#
6880

81+
6982
def person(request, name):
7083
people = {
7184
'john': 'John Smith',
@@ -75,6 +88,7 @@ def person(request, name):
7588
return HttpResponse("Person: " + people[name])
7689
raise ContinueResolving
7790

91+
7892
def place(request, name):
7993
places = {
8094
'sf': 'San Francisco',
@@ -84,9 +98,11 @@ def place(request, name):
8498
return HttpResponse("Place: " + places[name])
8599
raise ContinueResolving
86100

101+
87102
def thing(request, name):
88103
return HttpResponse("Thing: " + name.title())
89104

105+
90106
if __name__ == '__main__':
91107
settings.configure()
92108
unittest.main()

tox.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[tox]
2-
envlist = {py27,py35,py36}-django110, {py27,py34,py35,py36}-django19, {py27,py32,py33,py34,py35,py36}-django18, {py27,py32,py33,py34}-django17
2+
envlist = {py34,py35,py36}-django20, {py27,py35,py36}-django110, {py27,py34,py35,py36}-django19, {py27,py32,py33,py34,py35,py36}-django18, {py27,py32,py33,py34}-django17
33

44
[testenv]
55
commands = python tests.py
@@ -17,3 +17,4 @@ deps=
1717
django19: Django>=1.9,<1.10
1818
django110: Django>=1.10,<1.11
1919
django111: Django>=1.11,<2.0
20+
django20: Django>=2.0

0 commit comments

Comments
 (0)