← Back to team overview

txaws-dev team mailing list archive

[Merge] lp:~tribaal/txaws/integer-max-support into lp:txaws

 

Chris Glass has proposed merging lp:~tribaal/txaws/integer-max-support into lp:txaws.

Requested reviews:
  txAWS Technical List (txaws-tech)
Related bugs:
  Bug #965112 in txAWS: "Integer Schema parameter should support min and max"
  https://bugs.launchpad.net/txaws/+bug/965112

For more details, see:
https://code.launchpad.net/~tribaal/txaws/integer-max-support/+merge/99283

This fixes the bug as reported.

The Integer parameter now accepts min and max values (like Unicode), and the default behavior of being positive only uses the same mechanism.
-- 
https://code.launchpad.net/~tribaal/txaws/integer-max-support/+merge/99283
Your team txAWS Technical List is requested to review the proposed merge of lp:~tribaal/txaws/integer-max-support into lp:txaws.
=== modified file 'txaws/server/schema.py'
--- txaws/server/schema.py	2012-01-06 02:00:17 +0000
+++ txaws/server/schema.py	2012-03-26 10:11:21 +0000
@@ -179,15 +179,23 @@
 
     kind = "integer"
 
+    lower_than_min_template = "Value must be at least %s."
+    greater_than_max_template = "Value exceeds maximum of %s."
+
+    def __init__(self, name, optional=False, default=None,
+                 min=0, max=None, allow_none=False, validator=None):
+        super(Integer, self).__init__(name, optional, default, min, max,
+                                      allow_none, validator)
+
     def parse(self, value):
-        number = int(value)
-        if number < 0:
-            raise ValueError()
-        return number
+        return int(value)
 
     def format(self, value):
         return str(value)
 
+    def measure(self, value):
+        return int(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	2012-01-27 02:10:24 +0000
+++ txaws/server/tests/test_schema.py	2012-03-26 10:11:21 +0000
@@ -257,13 +257,30 @@
     def test_parse_with_negative(self):
         """L{Integer.parse} converts the given raw C{value} to C{int}."""
         parameter = Integer("Test")
-        self.assertRaises(ValueError, parameter.parse, "-1")
+        error = self.assertRaises(APIError, parameter.coerce, "-1")
+        self.assertEqual(400, error.status)
+        self.assertEqual("InvalidParameterValue", error.code)
+        self.assertIn("Value must be at least 0.", error.message)
 
     def test_format(self):
         """L{Integer.format} converts the given integer to a string."""
         parameter = Integer("Test")
         self.assertEqual("123", parameter.format(123))
 
+    def test_min_and_max(self):
+        """The L{Integer} parameter properly supports ranges."""
+        parameter = Integer("Test", min=2, max=4)
+
+        error = self.assertRaises(APIError, parameter.coerce, "1")
+        self.assertEqual(400, error.status)
+        self.assertEqual("InvalidParameterValue", error.code)
+        self.assertIn("Value must be at least 2.", error.message)
+
+        error = self.assertRaises(APIError, parameter.coerce, "5")
+        self.assertIn("Value exceeds maximum of 4.", error.message)
+        self.assertEqual(400, error.status)
+        self.assertEqual("InvalidParameterValue", error.code)
+
 
 class BoolTestCase(TestCase):