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

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