summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bangert <ben@groovie.org>2011-01-15 11:37:10 -0800
committerBen Bangert <ben@groovie.org>2011-01-15 11:37:10 -0800
commit49315b643983789e668626474c22beec3117457e (patch)
tree768a8d2b0222570fe476620f8b948574a6567995
parent07299bff4bf643456502fa39b9418882316815d7 (diff)
downloadpyramid-49315b643983789e668626474c22beec3117457e.tar.gz
pyramid-49315b643983789e668626474c22beec3117457e.tar.bz2
pyramid-49315b643983789e668626474c22beec3117457e.zip
- URL Dispatch properly handles a '.*' or '*' appearing in a regex match
when used inside brackets. Resolve Issue #90.
-rw-r--r--CHANGES.txt6
-rw-r--r--pyramid/tests/test_urldispatch.py11
-rw-r--r--pyramid/urldispatch.py3
3 files changed, 19 insertions, 1 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index d8853593b..fc1a53dd7 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,12 @@
Next release
============
+Bug Fixes
+---------
+
+- URL Dispatch properly handles a '.*' or '*' appearing in a regex match
+ when used inside brackets. Resolve Issue #90.
+
Features
--------
diff --git a/pyramid/tests/test_urldispatch.py b/pyramid/tests/test_urldispatch.py
index 12c5cf220..a452fdb97 100644
--- a/pyramid/tests/test_urldispatch.py
+++ b/pyramid/tests/test_urldispatch.py
@@ -239,6 +239,17 @@ class TestCompileRoute(unittest.TestCase):
self.assertEqual(matcher('foo/baz/biz/buz/bar'), None)
self.assertEqual(generator(
{'baz':1, 'buz':2, 'traverse':u'/a/b'}), '/foo/1/biz/2/bar/a/b')
+
+ def test_with_bracket_star(self):
+ matcher, generator = self._callFUT('/foo/{baz}/biz/{buz}/bar{remainder:.*}')
+ self.assertEqual(matcher('/foo/baz/biz/buz/bar'),
+ {'baz':'baz', 'buz':'buz', 'remainder':''})
+ self.assertEqual(matcher('/foo/baz/biz/buz/bar/everything/else/here'),
+ {'baz':'baz', 'buz':'buz',
+ 'remainder':'/everything/else/here'})
+ self.assertEqual(matcher('foo/baz/biz/buz/bar'), None)
+ self.assertEqual(generator(
+ {'baz':1, 'buz':2, 'remainder':'/a/b'}), '/foo/1/biz/2/bar%2Fa%2Fb')
def test_no_beginning_slash(self):
matcher, generator = self._callFUT('foo/:baz/biz/:buz/bar')
diff --git a/pyramid/urldispatch.py b/pyramid/urldispatch.py
index 0f8691a07..5d1e53947 100644
--- a/pyramid/urldispatch.py
+++ b/pyramid/urldispatch.py
@@ -75,6 +75,7 @@ class RoutesMapper(object):
# stolen from bobo and modified
old_route_re = re.compile(r'(\:[a-zA-Z]\w*)')
+star_in_brackets = re.compile(r'\{[^\}]*\*\w*[^\}]*\}')
route_re = re.compile(r'(\{[a-zA-Z][^\}]*\})')
def update_pattern(matchobj):
name = matchobj.group(0)
@@ -87,7 +88,7 @@ def _compile_route(route):
if not route.startswith('/'):
route = '/' + route
star = None
- if '*' in route:
+ if '*' in route and not star_in_brackets.search(route):
route, star = route.rsplit('*', 1)
pat = route_re.split(route)
pat.reverse()