← Back to team overview

txaws-dev team mailing list archive

[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):