Mercurial > p > roundup > code
comparison roundup/web/router.py @ 4925:997fa47c92d5 routing
routing: Strip leading slash from both path and pattern, add test
for pattern parameter matching
| author | anatoly techtonik <techtonik@gmail.com> |
|---|---|
| date | Wed, 20 Aug 2014 13:37:34 +0300 |
| parents | 6ee1844019d5 |
| children | 7920d700e580 |
comparison
equal
deleted
inserted
replaced
| 4924:6ee1844019d5 | 4925:997fa47c92d5 |
|---|---|
| 13 import re | 13 import re |
| 14 | 14 |
| 15 # --- Example URL mapping | 15 # --- Example URL mapping |
| 16 | 16 |
| 17 class NamedObject(object): | 17 class NamedObject(object): |
| 18 """Object that outputs given name when printed""" | 18 """Object that outputs its name when printed""" |
| 19 def __init__(self, name): | 19 def __init__(self, name): |
| 20 self.name = name | 20 self.name = name |
| 21 def __repr__(self): | 21 def __repr__(self): |
| 22 return self.name | 22 return self.name |
| 23 | 23 |
| 36 class Router(object): | 36 class Router(object): |
| 37 | 37 |
| 38 def __init__(self, urlmap=[]): | 38 def __init__(self, urlmap=[]): |
| 39 """ | 39 """ |
| 40 `urlmap` is a list (pattern, handler, pattern, ...) | 40 `urlmap` is a list (pattern, handler, pattern, ...) |
| 41 pattern should have no leading slash | 41 leading slash in pattern is stripped |
| 42 """ | 42 """ |
| 43 self.urlmap = urlmap | 43 self.urlmap = urlmap |
| 44 | 44 |
| 45 def get_handler(self, urlpath): | 45 def get_handler(self, urlpath): |
| 46 """ | 46 """ |
| 47 `urlpath` is a part of url /that/looks?like=this | 47 `urlpath` is a part of url /that/looks?like=this |
| 48 (leading slash is optional) | 48 (leading slash is optional, will be stripped anyway) |
| 49 | 49 |
| 50 returns tuple (handler, arguments) or (None, ()) | 50 returns tuple (handler, arguments) or (None, ()) |
| 51 """ | 51 """ |
| 52 # strip leading slashes before matching | 52 # strip leading slashes before matching |
| 53 path = urlpath.lstrip('/') | 53 path = urlpath.lstrip('/') |
| 54 for i in range(0, len(self.urlmap), 2): | 54 for i in range(0, len(self.urlmap), 2): |
| 55 pattern, handler = self.urlmap[i], self.urlmap[i+1] | 55 pattern, handler = self.urlmap[i], self.urlmap[i+1] |
| 56 pattern = pattern.lstrip('/') | |
| 56 if DEBUG: | 57 if DEBUG: |
| 57 print('router: matching %s' % pattern) | 58 print('router: matching %s' % pattern) |
| 58 match = re.match(pattern, path) | 59 match = re.match(pattern, path) |
| 59 if match: | 60 if match: |
| 60 return handler, match.groups() | 61 return handler, match.groups() |
| 74 self.assertEquals(router.get_handler(''), (None, ())) | 75 self.assertEquals(router.get_handler(''), (None, ())) |
| 75 handler, params = router.get_handler('/index') | 76 handler, params = router.get_handler('/index') |
| 76 self.assertEquals(handler, ExampleHandler) | 77 self.assertEquals(handler, ExampleHandler) |
| 77 self.assertEquals(params, tuple()) | 78 self.assertEquals(params, tuple()) |
| 78 | 79 |
| 80 def test_route_param(self): | |
| 81 def echo_handler(args): | |
| 82 return args | |
| 83 router = Router(('/files/(.*)', echo_handler)) | |
| 84 self.assertEquals(router.get_handler(''), (None, ())) | |
| 85 self.assertEquals(router.get_handler('/files'), (None, ())) | |
| 86 handler, params = router.get_handler('/files/filename') | |
| 87 self.assertEquals(handler, echo_handler) | |
| 88 self.assertEquals(params, ('filename',)) | |
| 89 | |
| 79 unittest.main() | 90 unittest.main() |
