Add deserialize() shortcut on _SaverMutable.

Fix a bug in deserialize for _SavedOrderedDict as it uses non-standard
initialization.
This commit is contained in:
Owllex 2022-02-11 12:55:23 -08:00
parent 2c3b82ac4a
commit f375bc923c
2 changed files with 30 additions and 0 deletions

View file

@ -243,6 +243,10 @@ class _SaverMutable(object):
def __delitem__(self, key): def __delitem__(self, key):
self._data.__delitem__(key) self._data.__delitem__(key)
def deserialize(self):
"""Deserializes this mutable into its corresponding non-Saver type."""
return deserialize(self)
class _SaverList(_SaverMutable, MutableSequence): class _SaverList(_SaverMutable, MutableSequence):
""" """
@ -418,6 +422,8 @@ def deserialize(obj):
tname = typ.__name__ tname = typ.__name__
if tname in ("_SaverDict", "dict"): if tname in ("_SaverDict", "dict"):
return {_iter(key): _iter(val) for key, val in obj.items()} return {_iter(key): _iter(val) for key, val in obj.items()}
elif tname in ("_SaverOrderedDict", "OrderedDict"):
return OrderedDict([(_iter(key), _iter(val)) for key, val in obj.items()])
elif tname in _DESERIALIZE_MAPPING: elif tname in _DESERIALIZE_MAPPING:
return _DESERIALIZE_MAPPING[tname](_iter(val) for val in obj) return _DESERIALIZE_MAPPING[tname](_iter(val) for val in obj)
elif is_iter(obj): elif is_iter(obj):

View file

@ -2,9 +2,11 @@
Tests for dbserialize module Tests for dbserialize module
""" """
from collections import deque
from django.test import TestCase from django.test import TestCase
from evennia.utils import dbserialize from evennia.utils import dbserialize
from evennia.objects.objects import DefaultObject from evennia.objects.objects import DefaultObject
from parameterized import parameterized
class TestDbSerialize(TestCase): class TestDbSerialize(TestCase):
@ -64,3 +66,25 @@ class TestDbSerialize(TestCase):
self.obj.db.test = {"a": True} self.obj.db.test = {"a": True}
self.obj.db.test.update({"b": False}) self.obj.db.test.update({"b": False})
self.assertEqual(self.obj.db.test, {"a": True, "b": False}) self.assertEqual(self.obj.db.test, {"a": True, "b": False})
@parameterized.expand(
[
("list", list, dbserialize._SaverList, [1, 2, 3]),
("dict", dict, dbserialize._SaverDict, {"key": "value"}),
("set", set, dbserialize._SaverSet, {1, 2, 3}),
("deque", deque, dbserialize._SaverDeque, deque(("a", "b", "c"))),
(
"OrderedDict",
dbserialize.OrderedDict,
dbserialize._SaverOrderedDict,
dbserialize.OrderedDict([("a", 1), ("b", 2), ("c", 3)]),
),
]
)
def test_deserialize(self, _, base_type, saver_type, default_value):
self.assertIsInstance(default_value, base_type)
self.obj.db.test = default_value
for value in (dbserialize.deserialize(self.obj.db.test), self.obj.db.test.deserialize()):
self.assertIsInstance(value, base_type)
self.assertNotIsInstance(value, saver_type)
self.assertEqual(value, default_value)