Merge branch 'master' into python3
[wrw.git] / wrw / util.py
index bf78f8e..eb27683 100644 (file)
@@ -1,5 +1,5 @@
 import inspect
-from . import req, dispatch, session, form
+from . import req, dispatch, session, form, resp
 
 def wsgiwrap(callable):
     def wrapper(env, startreq):
@@ -25,9 +25,33 @@ def formparams(callable):
             for arg in list(args):
                 if arg not in spec.args:
                     del args[arg]
+        for i in range(len(spec.args) - len(spec.defaults)):
+            if spec.args[i] not in args:
+                raise resp.httperror(400, "Missing parameter", ("The query parameter `", resp.h.code(spec.args[i]), "' is required but not supplied."))
         return callable(**args)
     return wrapper
 
+def funplex(*funs, **nfuns):
+    dir = {}
+    dir.update(((fun.__name__, fun) for fun in funs))
+    dir.update(nfuns)
+    def handler(req):
+        if req.pathinfo == "":
+            raise resp.redirect(req.uriname + "/")
+        if req.pathinfo[:1] != "/":
+            raise resp.notfound()
+        p = req.pathinfo[1:]
+        if p == "":
+            p = "__index__"
+            bi = 1
+        else:
+            p = p.partition("/")[0]
+            bi = len(p) + 1
+        if p in dir:
+            return dir[p](req.shift(bi))
+        raise resp.notfound()
+    return handler
+
 def persession(data = None):
     def dec(callable):
         def wrapper(req):