Mercurial > p > roundup > code
diff roundup/web/router.py @ 4999:e9077def7678 routing
router: Add interactive mode and iterator over urlmap
| author | anatoly techtonik <techtonik@gmail.com> |
|---|---|
| date | Thu, 10 Sep 2015 12:33:12 +0300 |
| parents | d8e0af01543b |
| children | ce06c665932a |
line wrap: on
line diff
--- a/roundup/web/router.py Thu Sep 10 11:43:50 2015 +0300 +++ b/roundup/web/router.py Thu Sep 10 12:33:12 2015 +0300 @@ -30,11 +30,22 @@ 'index', ExampleHandler ) +# --- Helper functions + +def entry(prompt='> '): + """Just get text for interactive mode""" + import sys + if sys.version_info[0] < 3: + return raw_input(prompt) + else: + return input(prompt) # --- Regexp based router class Router(object): + urlmap = [] + def __init__(self, urlmap=[]): """ `urlmap` is a list (pattern, handler, pattern, ...) @@ -51,8 +62,7 @@ """ # strip leading slashes before matching path = urlpath.lstrip('/') - for i in range(0, len(self.urlmap), 2): - pattern, handler = self.urlmap[i], self.urlmap[i+1] + for pattern, handler in self.iter_urlmap(): pattern = pattern.lstrip('/') if DEBUG: print('router: matching %s' % pattern) @@ -61,6 +71,23 @@ return handler, match.groups() return (None, ()) + def iter_urlmap(self): + """ + iterate over self.urlmap returning (pattern, handler) pairs + """ + for i in range(0, len(self.urlmap), 2): + yield self.urlmap[i], self.urlmap[i+1] + + def interactive(self): + print('enter url to test, [l] to list rules, empty line exits') + url = entry('url: ') + while url != '': + if url == 'l': + for i in range(0, len(self.urlmap), 2): + pattern, handler = self.urlmap[i], self.urlmap[i+1] + print(self.urlmap[i:i+2]) + print('matched ' + str(self.get_handler(url))) + url = entry('url: ') # [ ] len(urlmap) should be even to avoid errors @@ -68,6 +95,12 @@ if __name__ == '__main__': + import sys + if '-i' in sys.argv: + router = Router(EXAMPLE_URL_MAP) + router.interactive() + sys.exit() + import unittest class test_Router(unittest.TestCase): def test_example_routes(self):
