From 49315b643983789e668626474c22beec3117457e Mon Sep 17 00:00:00 2001 From: Ben Bangert Date: Sat, 15 Jan 2011 11:37:10 -0800 Subject: - URL Dispatch properly handles a '.*' or '*' appearing in a regex match when used inside brackets. Resolve Issue #90. --- CHANGES.txt | 6 ++++++ pyramid/tests/test_urldispatch.py | 11 +++++++++++ pyramid/urldispatch.py | 3 ++- 3 files changed, 19 insertions(+), 1 deletion(-) 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() -- cgit v1.2.3