Merge lp:~ack/txaws/parameter-validator into lp:txaws

Proposed by Alberto Donato
Status: Merged
Approved by: Jamu Kakar
Approved revision: 90
Merged at revision: 90
Proposed branch: lp:~ack/txaws/parameter-validator
Merge into: lp:txaws
Diff against target: 67 lines (+29/-2)
2 files modified
txaws/server/schema.py (+7/-2)
txaws/server/tests/test_schema.py (+22/-0)
To merge this branch: bzr merge lp:~ack/txaws/parameter-validator
Reviewer Review Type Date Requested Status
Jamu Kakar Approve
Review via email: mp+68823@code.launchpad.net

Description of the change

This adds an optional validator argument to Parameter, to provide custom validation.

To post a comment you must log in.
Revision history for this message
Jamu Kakar (jkakar) wrote :

[1]

+ def test_validator_valid(self):
+ """
+ L{Parameter.coerce} raises an error if the validator returns False.
+ """

This docstring is incorrect, please fix it.

Nice work, +1!

review: Approve
lp:~ack/txaws/parameter-validator updated
91. By Alberto Donato

Fixed test comment.

Revision history for this message
Free Ekanayaka (free.ekanayaka) wrote :

Thanks Jamu, that was quick :)

Revision history for this message
Alberto Donato (ack) wrote :

> [1]
>
> + def test_validator_valid(self):
> + """
> + L{Parameter.coerce} raises an error if the validator returns False.
> + """
>
> This docstring is incorrect, please fix it.
>
>
> Nice work, +1!

Thanks, fixed!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'txaws/server/schema.py'
2--- txaws/server/schema.py 2011-05-14 05:22:41 +0000
3+++ txaws/server/schema.py 2011-07-22 12:07:27 +0000
4@@ -65,16 +65,18 @@
5 @param min: Minimum value for a parameter.
6 @param max: Maximum value for a parameter.
7 @param allow_none: Whether the parameter may be C{None}.
8+ @param validator: A callable to validate the parameter, returning a bool.
9 """
10
11 def __init__(self, name, optional=False, default=None,
12- min=None, max=None, allow_none=False):
13+ min=None, max=None, allow_none=False, validator=None):
14 self.name = name
15 self.optional = optional
16 self.default = default
17 self.min = min
18 self.max = max
19 self.allow_none = allow_none
20+ self.validator = validator
21
22 def coerce(self, value):
23 """Coerce a single value according to this parameter's settings.
24@@ -94,7 +96,10 @@
25 return self.default
26 self._check_range(value)
27 try:
28- return self.parse(value)
29+ parsed = self.parse(value)
30+ if self.validator and not self.validator(parsed):
31+ raise ValueError(value)
32+ return parsed
33 except ValueError:
34 raise InvalidParameterValueError("Invalid %s value %s" %
35 (self.kind, value))
36
37=== modified file 'txaws/server/tests/test_schema.py'
38--- txaws/server/tests/test_schema.py 2011-05-17 07:42:21 +0000
39+++ txaws/server/tests/test_schema.py 2011-07-22 12:07:27 +0000
40@@ -150,6 +150,28 @@
41 self.assertEqual("Value (longish) for parameter Test is invalid. "
42 "3 should be enough for anybody", error.message)
43
44+ def test_validator_invalid(self):
45+ """
46+ L{Parameter.coerce} raises an error if the validator returns False.
47+ """
48+ parameter = Parameter("Test", validator=lambda _: False)
49+ parameter.parse = lambda value: value
50+ parameter.kind = "test_parameter"
51+ error = self.assertRaises(APIError, parameter.coerce, "foo")
52+ self.assertEqual(400, error.status)
53+ self.assertEqual("InvalidParameterValue", error.code)
54+ self.assertEqual("Invalid test_parameter value foo", error.message)
55+
56+ def test_validator_valid(self):
57+ """
58+ L{Parameter.coerce} returns the correct value if validator returns
59+ True.
60+ """
61+ parameter = Parameter("Test", validator=lambda _: True)
62+ parameter.parse = lambda value: value
63+ parameter.kind = "test_parameter"
64+ self.assertEqual("foo", parameter.coerce("foo"))
65+
66
67 class UnicodeTest(TestCase):
68

Subscribers

People subscribed via source and target branches