annotate wsgintegrate/match.py @ 0:ec815b7cb142

initial commit of wsgintegrate
author Jeff Hammel <jhammel@mozilla.com>
date Tue, 07 Jun 2011 08:03:09 -0700
parents
children 89047fd9ea8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2 utilities for matching requests
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 these are just a sample; you can add arbitrary match objects if desired
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 from webob import exc
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 class RequestMatch(object):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9 """abstract base class for matching requests"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 def __init__(self, app):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 self.app = app
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 def __call__(self, environ, start_response):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 """WSGI app"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
16 if not self.condition(environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 raise exc.HTTPNotFound
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 return self.app(environ, start_response)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 """match condition"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 return True
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
23
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 class ConditionMatch(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
25 """generic environment-based condition-checker"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
26 # XXX unused
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
27 def __init__(self, app, condition):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
28 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
29 self.condition = condition
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
30
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31 ### aspect-based checkers
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
32
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33 class MatchPath(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 """match based on PATH INFO"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
35
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
36 def __init__(self, app, path):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
37 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38 self.path = path
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40 def match(self, path):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 if path.startswith(self.path):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 # currently only matches with str.startswith;
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 # different types of matches could be considered
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 return self.path, path[len(self.path):]
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 def condition(self, environ): # XXX unused
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
47 return self.match(environ['PATH_INFO']) is not None
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 def __call__(self, environ, start_response):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 match = self.match(environ['PATH_INFO'])
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51 if match is None:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 raise exc.HTTPNotFound
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 script_name, path_info = match
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
54
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
55 # fix up the environment for downstream applications
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 environ['SCRIPT_NAME'] = script_name
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 environ['PATH_INFO'] = path_info
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 return self.app(environ, start_response)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 class MatchMethod(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 """match based on request method"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 def __init__(self, app, methods):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 if isinstance(methods, basestring):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 methods = methods.split()
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 self.methods = set(methods)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
70 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 return environ['REQUEST_METHOD'] in self.methods
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
73 class MatchHost(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 """match based on the host and port"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 def __init__(self, app, host, port=None):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
77 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
78 self.host = host
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79 self.port = port
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 host = environ['HTTP_HOST']
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 port = None
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
83 if ':' in host:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 host, port = host.rsplit(':', 1)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
85 if self.port and port != self.port:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
86 return False
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
87 return host == self.host
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
88
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
89 class MatchAuthorized(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
90 """match if a user is authorized or not"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
91 def __init__(self, app, users=None):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
92 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
93 self.authorized_users = users
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
94 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
95 raise NotImplementedError # TODO
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
96
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
97 class MatchProtocol(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98 """match a given protocol, i.e. http vs https://"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
99 def __init__(self, app, protocol):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100 self.protocol = protocol
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
102 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
103 raise NotImplementedError # TODO
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
104
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
105 class MatchQueryString(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
106 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
107 match a request based on if the right query string parameters are given
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
108 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
109 def __init__(self, app, *tags, **kw):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
110 self.app = app
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
111 self.tags = tags
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
112 self.kw = kw
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
113 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
114 raise NotImplementedError # TODO
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
115
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
116 ### logical checkers (currently unused)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
117
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
118 class AND(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
119 def __init__(self, app, condition1, condition2, *conditions):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
120 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
121 self.conditions = [condition1, condition2]
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
122 self.conditions.extend(conditions)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
123 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
124 for condition in self.conditions:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
125 if isinstance(condition, RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
126 if not condition.condition(environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
127 return False
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
128 else:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
129 if not condition():
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
130 return False
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
131 return True
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
132
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
133 class OR(RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
134 def __init__(self, app, condition1, condition2, *conditions):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
135 RequestMatch.__init__(self, app)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
136 self.conditions = [condition1, condition2]
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
137 self.conditions.extend(conditions)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
138 def condition(self, environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
139 for condition in self.conditions:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
140 if isinstance(condition, RequestMatch):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
141 if condition.condition(environ):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
142 return True
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
143 else:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
144 if condition():
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
145 return
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
146 return False
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
147
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
148 # string accessible list of conditions
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
149 conditions = {'host': MatchHost,
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
150 'method': MatchMethod,
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
151 'path': MatchPath }
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
152
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
153 class WrapApp(object):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
154 """match string-based conditions"""
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
155
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
156 def __init__(self, conditions=None):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
157 self.conditions = conditions or globals()['conditions']
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
158
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
159 def __call__(self, app, *conditions, **kwargs):
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
160 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
161 wrap an app in conditions
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
162 conditions should be a key, value 2-tuple of string, args;
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
163 kwargs should be a dictionary of unordered conditions,
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
164 likewise of the form string, args.
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
165 use *conditions if order is important, otherwise kwargs
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
166 """
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
167
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
168 # determine the condition
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
169 conditions = list(conditions)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
170 if kwargs:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
171 conditions.extend(kwargs.items())
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
172
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
173 # wrap the application
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
174 for condition, args in conditions:
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
175 assert condition in self.conditions, 'Condition "%s" unknown' % condition
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
176 app = self.conditions[condition](app, args)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
177 return app
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
178
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
179 # convenience invocation
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
180 wrap = WrapApp(conditions)
ec815b7cb142 initial commit of wsgintegrate
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
181