txaws-dev team mailing list archive
-
txaws-dev team
-
Mailing list archive
-
Message #00159
[Merge] lp:~ack/txaws/parameter-type-float into lp:txaws
Alberto Donato has proposed merging lp:~ack/txaws/parameter-type-float into lp:txaws.
Requested reviews:
txAWS Committers (txaws-dev)
For more details, see:
https://code.launchpad.net/~ack/txaws/parameter-type-float/+merge/302010
Add a Float parameter type.
--
Your team txAWS Committers is requested to review the proposed merge of lp:~ack/txaws/parameter-type-float into lp:txaws.
=== modified file 'txaws/server/schema.py'
--- txaws/server/schema.py 2013-08-14 12:10:05 +0000
+++ txaws/server/schema.py 2016-08-04 10:57:26 +0000
@@ -237,6 +237,30 @@
return int(value)
+class Float(Parameter):
+ """A parameter that must be a {float}."""
+
+ kind = "float"
+
+ lower_than_min_template = "Value must be at least %s."
+ greater_than_max_template = "Value exceeds maximum of %s."
+
+ def __init__(self, name=None, optional=False, default=None,
+ min=0, max=None, allow_none=False, validator=None,
+ doc=None):
+ super(Float, self).__init__(
+ name, optional, default, min, max, allow_none, validator, doc=doc)
+
+ def parse(self, value):
+ return float(value)
+
+ def format(self, value):
+ return str(value)
+
+ def measure(self, value):
+ return float(value)
+
+
class Bool(Parameter):
"""A parameter that must be a C{bool}."""
=== modified file 'txaws/server/tests/test_schema.py'
--- txaws/server/tests/test_schema.py 2013-08-14 12:10:05 +0000
+++ txaws/server/tests/test_schema.py 2016-08-04 10:57:26 +0000
@@ -8,8 +8,8 @@
from txaws.server.exception import APIError
from txaws.server.schema import (
- Arguments, Bool, Date, Enum, Integer, Parameter, RawStr, Schema, Unicode,
- UnicodeLine, List, Structure, InconsistentParameterError)
+ Arguments, Bool, Date, Enum, Integer, Float, Parameter, RawStr, Schema,
+ Unicode, UnicodeLine, List, Structure, InconsistentParameterError)
class ArgumentsTestCase(TestCase):
@@ -343,6 +343,45 @@
self.assertIn("Invalid integer value %s" % garbage, error.message)
+class FloatTestCase(TestCase):
+
+ def test_parse(self):
+ """L{Float.parse} converts the given raw C{value} to C{float}."""
+ parameter = Float("Test")
+ self.assertEqual(123.45, parameter.parse("123.45"))
+
+ def test_format(self):
+ """L{Float.format} converts the given float to a string."""
+ parameter = Float("Test")
+ self.assertEqual("123.45", parameter.format(123.45))
+
+ def test_min_and_max(self):
+ """The L{Float} parameter properly supports ranges."""
+ parameter = Float("Test", min=2.3, max=4.5)
+
+ error = self.assertRaises(APIError, parameter.coerce, "1.2")
+ self.assertEqual(400, error.status)
+ self.assertEqual("InvalidParameterValue", error.code)
+ self.assertIn("Value must be at least 2.3.", error.message)
+
+ error = self.assertRaises(APIError, parameter.coerce, "5")
+ self.assertIn("Value exceeds maximum of 4.5.", error.message)
+ self.assertEqual(400, error.status)
+ self.assertEqual("InvalidParameterValue", error.code)
+
+ def test_non_float_string(self):
+ """
+ The L{Float} parameter raises an L{APIError} when passed non-float
+ values (in this case, a string).
+ """
+ garbage = "blah"
+ parameter = Float("Test")
+ error = self.assertRaises(APIError, parameter.coerce, garbage)
+ self.assertEqual(400, error.status)
+ self.assertEqual("InvalidParameterValue", error.code)
+ self.assertIn("Invalid float value {}".format(garbage), error.message)
+
+
class BoolTestCase(TestCase):
def test_parse(self):