summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2012-10-13 16:51:35 -0500
committerMichael Merickel <michael@merickel.org>2012-10-13 16:51:35 -0500
commit3fb934e8d600018800932fb66d001f5bacdac2c8 (patch)
treeb7d169e3ced14faaa6adc8f7904ea45536803a61
parent4a81d6dba6f9e29c4c204a916f080443e45e2f0a (diff)
downloadpyramid-3fb934e8d600018800932fb66d001f5bacdac2c8.tar.gz
pyramid-3fb934e8d600018800932fb66d001f5bacdac2c8.tar.bz2
pyramid-3fb934e8d600018800932fb66d001f5bacdac2c8.zip
allow request_param predicate to accept a tuple of constraints
-rw-r--r--pyramid/config/predicates.py39
-rw-r--r--pyramid/tests/test_config/test_predicates.py18
2 files changed, 41 insertions, 16 deletions
diff --git a/pyramid/config/predicates.py b/pyramid/config/predicates.py
index 77b55d9b3..7b77f4766 100644
--- a/pyramid/config/predicates.py
+++ b/pyramid/config/predicates.py
@@ -64,28 +64,35 @@ class PathInfoPredicate(object):
class RequestParamPredicate(object):
def __init__(self, val, config):
- name = val
- v = None
- if '=' in name:
- name, v = name.split('=', 1)
- name, v = name.strip(), v.strip()
- if v is None:
- self._text = 'request_param %s' % (name,)
- else:
- self._text = 'request_param %s = %s' % (name, v)
- self.name = name
- self.val = v
+ if not is_nonstr_iter(val):
+ val = (val,)
+ val = sorted(val)
+ self.val = val
+ reqs = []
+ for p in val:
+ k = p
+ v = None
+ if '=' in p:
+ k, v = p.split('=', 1)
+ k, v = k.strip(), v.strip()
+ reqs.append((k, v))
+ self.reqs = reqs
def text(self):
- return self._text
+ return 'request_param %s' % ','.join(
+ ['%s = %s' % (x,y) if y else x for x, y in self.reqs]
+ )
phash = text
def __call__(self, context, request):
- if self.val is None:
- return self.name in request.params
- return request.params.get(self.name) == self.val
-
+ for k, v in self.reqs:
+ actual = request.params.get(k)
+ if actual is None:
+ return False
+ if v is not None and actual != v:
+ return False
+ return True
class HeaderPredicate(object):
def __init__(self, val, config):
diff --git a/pyramid/tests/test_config/test_predicates.py b/pyramid/tests/test_config/test_predicates.py
index 005b1b27a..de7c8241d 100644
--- a/pyramid/tests/test_config/test_predicates.py
+++ b/pyramid/tests/test_config/test_predicates.py
@@ -117,6 +117,20 @@ class TestRequestParamPredicate(unittest.TestCase):
result = inst(None, request)
self.assertTrue(result)
+ def test___call___true_multi(self):
+ inst = self._makeOne(('abc', 'def =2 '))
+ request = Dummy()
+ request.params = {'abc':'1', 'def': '2'}
+ result = inst(None, request)
+ self.assertTrue(result)
+
+ def test___call___false_multi(self):
+ inst = self._makeOne(('abc=3', 'def =2 '))
+ request = Dummy()
+ request.params = {'abc':'3', 'def': '1'}
+ result = inst(None, request)
+ self.assertFalse(result)
+
def test___call___false(self):
inst = self._makeOne('abc')
request = Dummy()
@@ -132,6 +146,10 @@ class TestRequestParamPredicate(unittest.TestCase):
inst = self._makeOne('abc= 1')
self.assertEqual(inst.text(), 'request_param abc = 1')
+ def test_text_multi(self):
+ inst = self._makeOne(('abc= 1', 'def'))
+ self.assertEqual(inst.text(), 'request_param abc = 1,def')
+
def test_phash_exists(self):
inst = self._makeOne('abc')
self.assertEqual(inst.phash(), 'request_param abc')