From 3fb934e8d600018800932fb66d001f5bacdac2c8 Mon Sep 17 00:00:00 2001 From: Michael Merickel Date: Sat, 13 Oct 2012 16:51:35 -0500 Subject: allow request_param predicate to accept a tuple of constraints --- pyramid/config/predicates.py | 39 ++++++++++++++++------------ pyramid/tests/test_config/test_predicates.py | 18 +++++++++++++ 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') -- cgit v1.2.3