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
=== modified file 'txaws/server/schema.py'
--- txaws/server/schema.py 2011-05-14 05:22:41 +0000
+++ txaws/server/schema.py 2011-07-22 12:07:27 +0000
@@ -65,16 +65,18 @@
65 @param min: Minimum value for a parameter.65 @param min: Minimum value for a parameter.
66 @param max: Maximum value for a parameter.66 @param max: Maximum value for a parameter.
67 @param allow_none: Whether the parameter may be C{None}.67 @param allow_none: Whether the parameter may be C{None}.
68 @param validator: A callable to validate the parameter, returning a bool.
68 """69 """
6970
70 def __init__(self, name, optional=False, default=None,71 def __init__(self, name, optional=False, default=None,
71 min=None, max=None, allow_none=False):72 min=None, max=None, allow_none=False, validator=None):
72 self.name = name73 self.name = name
73 self.optional = optional74 self.optional = optional
74 self.default = default75 self.default = default
75 self.min = min76 self.min = min
76 self.max = max77 self.max = max
77 self.allow_none = allow_none78 self.allow_none = allow_none
79 self.validator = validator
7880
79 def coerce(self, value):81 def coerce(self, value):
80 """Coerce a single value according to this parameter's settings.82 """Coerce a single value according to this parameter's settings.
@@ -94,7 +96,10 @@
94 return self.default96 return self.default
95 self._check_range(value)97 self._check_range(value)
96 try:98 try:
97 return self.parse(value)99 parsed = self.parse(value)
100 if self.validator and not self.validator(parsed):
101 raise ValueError(value)
102 return parsed
98 except ValueError:103 except ValueError:
99 raise InvalidParameterValueError("Invalid %s value %s" %104 raise InvalidParameterValueError("Invalid %s value %s" %
100 (self.kind, value))105 (self.kind, value))
101106
=== modified file 'txaws/server/tests/test_schema.py'
--- txaws/server/tests/test_schema.py 2011-05-17 07:42:21 +0000
+++ txaws/server/tests/test_schema.py 2011-07-22 12:07:27 +0000
@@ -150,6 +150,28 @@
150 self.assertEqual("Value (longish) for parameter Test is invalid. "150 self.assertEqual("Value (longish) for parameter Test is invalid. "
151 "3 should be enough for anybody", error.message)151 "3 should be enough for anybody", error.message)
152152
153 def test_validator_invalid(self):
154 """
155 L{Parameter.coerce} raises an error if the validator returns False.
156 """
157 parameter = Parameter("Test", validator=lambda _: False)
158 parameter.parse = lambda value: value
159 parameter.kind = "test_parameter"
160 error = self.assertRaises(APIError, parameter.coerce, "foo")
161 self.assertEqual(400, error.status)
162 self.assertEqual("InvalidParameterValue", error.code)
163 self.assertEqual("Invalid test_parameter value foo", error.message)
164
165 def test_validator_valid(self):
166 """
167 L{Parameter.coerce} returns the correct value if validator returns
168 True.
169 """
170 parameter = Parameter("Test", validator=lambda _: True)
171 parameter.parse = lambda value: value
172 parameter.kind = "test_parameter"
173 self.assertEqual("foo", parameter.coerce("foo"))
174
153175
154class UnicodeTest(TestCase):176class UnicodeTest(TestCase):
155177

Subscribers

People subscribed via source and target branches