summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Bicking <ian@ianbicking.org>2005-08-22 21:25:25 +0000
committerIan Bicking <ian@ianbicking.org>2005-08-22 21:25:25 +0000
commit5430301738f4acd92e77a0f5a49ec9e7cdd97744 (patch)
tree67b5204b9a03e2997c810fe3a7a096e0fd09a804
parent9eda7b8dd739a698e7db1448315d32436b8e5041 (diff)
downloadpaste-git-5430301738f4acd92e77a0f5a49ec9e7cdd97744.tar.gz
paste.deployified cascade
-rw-r--r--paste/cascade.py27
-rw-r--r--setup.py1
2 files changed, 28 insertions, 0 deletions
diff --git a/paste/cascade.py b/paste/cascade.py
index 300d787..ad3a36b 100644
--- a/paste/cascade.py
+++ b/paste/cascade.py
@@ -3,9 +3,36 @@ Cascades through several applications, so long as applications
return ``404 Not Found``.
"""
import httpexceptions
+from paste.deploy import converters
__all__ = ['Cascade']
+def make_cascade(loader, global_conf, catch='404', **local_conf):
+ """
+ Expects configuration like:
+
+ [composit:cascade]
+ use = egg:Paste#cascade
+ # all start with 'app' and are sorted alphabetically
+ app1 = foo
+ app2 = bar
+ ...
+ catch = 404 500 ...
+ """
+ catch = map(int, converters.aslist(catch))
+ apps = []
+ for name, value in local_conf.items():
+ if not name.startswith('app'):
+ raise ValueError(
+ "Bad configuration key %r (=%r); all configuration keys "
+ "must start with 'app'"
+ % (name, value))
+ app = loader.get_app(value, global_conf=global_conf)
+ apps.append((name, app))
+ apps.sort()
+ apps = [app for name, app in apps]
+ return Cascade(apps, catch=catch)
+
class Cascade(object):
"""
diff --git a/setup.py b/setup.py
index e31e9f2..5467cbd 100644
--- a/setup.py
+++ b/setup.py
@@ -50,6 +50,7 @@ functionality.
""",
'paste.composit_factory1': """
urlmap=paste.urlmap:urlmap_factory
+ cascade=paste.cascade:make_cascade
""",
'paste.filter_app_factory1': """
error_catcher=paste.exceptions.errormiddleware:ErrorMiddleware