diff --git a/openstack/format.py b/openstack/format.py index c2cb0f775..9b3ef3d52 100644 --- a/openstack/format.py +++ b/openstack/format.py @@ -111,23 +111,26 @@ class UNIXEpoch(Formatter): class BoolStr(Formatter): - # The behavior here primarily exists for the deserialize method - # to be producing Python booleans. - @classmethod def deserialize(cls, value): - return cls.convert(value) - - @classmethod - def serialize(cls, value): - return cls.convert(value) - - @classmethod - def convert(cls, value): + """Convert a boolean string to a boolean""" expr = str(value).lower() if "true" == expr: return True elif "false" == expr: return False else: - raise ValueError("Unable to convert as boolean: %s" % value) + raise ValueError("Unable to deserialize boolean string: %s" + % value) + + @classmethod + def serialize(cls, value): + """Convert a boolean to a boolean string""" + if isinstance(value, bool): + if value: + return "true" + else: + return "false" + else: + raise ValueError("Unable to serialize boolean string: %s" + % value) diff --git a/openstack/tests/unit/test_format.py b/openstack/tests/unit/test_format.py index b10707ec6..c3d8f2ed4 100644 --- a/openstack/tests/unit/test_format.py +++ b/openstack/tests/unit/test_format.py @@ -19,24 +19,25 @@ from openstack import format class TestBoolStrFormatter(testtools.TestCase): - # NOTE: serialize/deserialize go through the same code path + def test_deserialize(self): + self.assertTrue(format.BoolStr.deserialize(True)) + self.assertTrue(format.BoolStr.deserialize('True')) + self.assertTrue(format.BoolStr.deserialize('TRUE')) + self.assertTrue(format.BoolStr.deserialize('true')) + self.assertFalse(format.BoolStr.deserialize(False)) + self.assertFalse(format.BoolStr.deserialize('False')) + self.assertFalse(format.BoolStr.deserialize('FALSE')) + self.assertFalse(format.BoolStr.deserialize('false')) + self.assertRaises(ValueError, format.BoolStr.deserialize, None) + self.assertRaises(ValueError, format.BoolStr.deserialize, '') + self.assertRaises(ValueError, format.BoolStr.deserialize, 'INVALID') - def test_format_true(self): - self.assertTrue(format.BoolStr.serialize(True)) - self.assertTrue(format.BoolStr.serialize('True')) - self.assertTrue(format.BoolStr.serialize('TRUE')) - self.assertTrue(format.BoolStr.serialize('true')) - - def test_format_false(self): - self.assertFalse(format.BoolStr.serialize(False)) - self.assertFalse(format.BoolStr.serialize('False')) - self.assertFalse(format.BoolStr.serialize('FALSE')) - self.assertFalse(format.BoolStr.serialize('false')) - - def test_format_fails(self): + def test_serialize(self): + self.assertEqual('true', format.BoolStr.serialize(True)) + self.assertEqual('false', format.BoolStr.serialize(False)) self.assertRaises(ValueError, format.BoolStr.serialize, None) self.assertRaises(ValueError, format.BoolStr.serialize, '') - self.assertRaises(ValueError, format.BoolStr.serialize, 'INVALID') + self.assertRaises(ValueError, format.BoolStr.serialize, 'True') class TestISO8601Formatter(testtools.TestCase):