diff options
| author | Ben Bangert <ben@groovie.org> | 2011-01-15 11:37:10 -0800 |
|---|---|---|
| committer | Ben Bangert <ben@groovie.org> | 2011-01-15 11:37:10 -0800 |
| commit | 49315b643983789e668626474c22beec3117457e (patch) | |
| tree | 768a8d2b0222570fe476620f8b948574a6567995 | |
| parent | 07299bff4bf643456502fa39b9418882316815d7 (diff) | |
| download | pyramid-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.txt | 6 | ||||
| -rw-r--r-- | pyramid/tests/test_urldispatch.py | 11 | ||||
| -rw-r--r-- | pyramid/urldispatch.py | 3 |
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() |
