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()

Roundup Issue Tracker: http://roundup-tracker.org/