Skip to content

Commit

Permalink
Merge pull request #28 from mikaelengstrom/master
Browse files Browse the repository at this point in the history
Add Django2 support
  • Loading branch information
raiderrobert committed Mar 8, 2018
2 parents 1cb4fed + b85952d commit bd655b1
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 11 deletions.
16 changes: 13 additions & 3 deletions multiurl.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
from __future__ import unicode_literals

from django.core import urlresolvers
try:
from django import urls as urlresolvers
from django.urls.resolvers import RegexPattern
except ImportError:
# Fallbacks and mocks for Django 1.*
from django.core import urlresolvers

urlresolvers.URLResolver = urlresolvers.RegexURLResolver

def RegexPattern(pattern):
return pattern


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


class MultiRegexURLResolver(urlresolvers.RegexURLResolver):
class MultiRegexURLResolver(urlresolvers.URLResolver):
def __init__(self, urls, exceptions):
super(MultiRegexURLResolver, self).__init__('', None)
super(MultiRegexURLResolver, self).__init__(RegexPattern(''), None)
self._urls = urls
self._exceptions = exceptions

Expand Down
30 changes: 23 additions & 7 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,28 @@

from django.conf import settings
from django.conf.urls import url
from django.core.urlresolvers import RegexURLResolver, Resolver404, NoReverseMatch

from django.http import HttpResponse

from multiurl import multiurl, ContinueResolving

try:
from django import urls as urlresolvers
from django.urls.resolvers import RegexPattern
except ImportError:
# Fallbacks and mocks for Django 1.*
from django.core import urlresolvers

urlresolvers.URLResolver = urlresolvers.RegexURLResolver

def RegexPattern(pattern):
return pattern


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

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

def test_resolve_match_faillthrough(self):
m = self.patterns_no_fallthrough.resolve('/bacon/')
with self.assertRaises(Resolver404):
with self.assertRaises(urlresolvers.Resolver404):
m.func(request=None, *m.args, **m.kwargs)

def test_no_match(self):
with self.assertRaises(Resolver404):
with self.assertRaises(urlresolvers.Resolver404):
self.patterns_catchall.resolve('/eggs/and/bacon/')

def test_reverse(self):
self.assertEqual('joe/', self.patterns_catchall.reverse('person', 'joe'))
self.assertEqual('joe/', self.patterns_catchall.reverse('place', 'joe'))
self.assertEqual('joe/', self.patterns_catchall.reverse('thing', 'joe'))
with self.assertRaises(NoReverseMatch):
with self.assertRaises(urlresolvers.NoReverseMatch):
self.patterns_catchall.reverse('person')
with self.assertRaises(NoReverseMatch):
with self.assertRaises(urlresolvers.NoReverseMatch):
self.patterns_catchall.reverse('argh', 'xyz')

#
# Some "views" to test against.
#


def person(request, name):
people = {
'john': 'John Smith',
Expand All @@ -75,6 +88,7 @@ def person(request, name):
return HttpResponse("Person: " + people[name])
raise ContinueResolving


def place(request, name):
places = {
'sf': 'San Francisco',
Expand All @@ -84,9 +98,11 @@ def place(request, name):
return HttpResponse("Place: " + places[name])
raise ContinueResolving


def thing(request, name):
return HttpResponse("Thing: " + name.title())


if __name__ == '__main__':
settings.configure()
unittest.main()
3 changes: 2 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[tox]
envlist = {py27,py35,py36}-django110, {py27,py34,py35,py36}-django19, {py27,py32,py33,py34,py35,py36}-django18, {py27,py32,py33,py34}-django17
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

[testenv]
commands = python tests.py
Expand All @@ -17,3 +17,4 @@ deps=
django19: Django>=1.9,<1.10
django110: Django>=1.10,<1.11
django111: Django>=1.11,<2.0
django20: Django>=2.0

0 comments on commit bd655b1

Please sign in to comment.