Skip to content

Commit 5229759

Browse files
jmphillidanielhochman
authored andcommitted
parse legacy and native bool in legacy bool (#158)
1 parent 07f464e commit 5229759

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

pynamodb/attributes.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,17 @@ def serialize(self, value):
253253
def deserialize(self, value):
254254
return bool(json.loads(value))
255255

256+
def get_value(self, value):
257+
# we need this for the period in which you are upgrading
258+
# you can switch all BooleanAttributes to LegacyBooleanAttributes
259+
# this can read both but serializes as Numbers
260+
# once you've transitioned, you can then switch back to
261+
# BooleanAttribute and it will serialize the new fancy way
262+
value_to_deserialize = super(LegacyBooleanAttribute, self).get_value(value)
263+
if value_to_deserialize is None:
264+
value_to_deserialize = json.dumps(value.get(BOOLEAN, 0))
265+
return value_to_deserialize
266+
256267

257268
class BooleanAttribute(Attribute):
258269
"""

pynamodb/tests/test_attributes.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from pynamodb.models import Model
1313
from pynamodb.attributes import (
1414
BinarySetAttribute, BinaryAttribute, NumberSetAttribute, NumberAttribute,
15-
UnicodeAttribute, UnicodeSetAttribute, UTCDateTimeAttribute, BooleanAttribute,
15+
UnicodeAttribute, UnicodeSetAttribute, UTCDateTimeAttribute, BooleanAttribute, LegacyBooleanAttribute,
1616
JSONAttribute, DEFAULT_ENCODING, NUMBER, STRING, STRING_SET, NUMBER_SET, BINARY_SET,
1717
BINARY, BOOLEAN)
1818

@@ -383,6 +383,46 @@ def test_unicode_set_attribute(self):
383383
self.assertEqual(attr.default, set([six.u('foo'), six.u('bar')]))
384384

385385

386+
class LegacyBooleanAttributeTestCase(TestCase):
387+
def test_legacy_boolean_attribute_can_read_future_boolean_attributes(self):
388+
"""
389+
LegacyBooleanAttribute.deserialize
390+
:return:
391+
"""
392+
attr = LegacyBooleanAttribute()
393+
self.assertEqual(attr.deserialize('1'), True)
394+
self.assertEqual(attr.deserialize('0'), False)
395+
self.assertEqual(attr.deserialize(json.dumps(True)), True)
396+
self.assertEqual(attr.deserialize(json.dumps(False)), False)
397+
398+
def test_legacy_boolean_attribute_get_value_can_read_both(self):
399+
"""
400+
LegacyBooleanAttribute.get_value
401+
:return:
402+
"""
403+
attr = LegacyBooleanAttribute()
404+
self.assertEqual(attr.get_value({'N': '1'}), '1')
405+
self.assertEqual(attr.get_value({'N': '0'}), '0')
406+
self.assertEqual(attr.get_value({'BOOL': True}), json.dumps(True))
407+
self.assertEqual(attr.get_value({'BOOL': False}), json.dumps(False))
408+
409+
def test_legacy_boolean_attribute_get_value_and_deserialize_work_together(self):
410+
attr = LegacyBooleanAttribute()
411+
self.assertEqual(attr.deserialize(attr.get_value({'N': '1'})), True)
412+
self.assertEqual(attr.deserialize(attr.get_value({'N': '0'})), False)
413+
self.assertEqual(attr.deserialize(attr.get_value({'BOOL': True})), True)
414+
self.assertEqual(attr.deserialize(attr.get_value({'BOOL': False})), False)
415+
416+
def test_legacy_boolean_attribute_serialize(self):
417+
"""
418+
LegacyBooleanAttribute.serialize
419+
"""
420+
attr = LegacyBooleanAttribute()
421+
self.assertEqual(attr.serialize(True), '1')
422+
self.assertEqual(attr.serialize(False), '0')
423+
self.assertEqual(attr.serialize(None), None)
424+
425+
386426
class BooleanAttributeTestCase(TestCase):
387427
"""
388428
Tests boolean attributes

0 commit comments

Comments
 (0)