From f375bc923cb91200c89161805755edcdca20ffaf Mon Sep 17 00:00:00 2001 From: Owllex Date: Fri, 11 Feb 2022 12:55:23 -0800 Subject: [PATCH] Add deserialize() shortcut on _SaverMutable. Fix a bug in deserialize for _SavedOrderedDict as it uses non-standard initialization. --- evennia/utils/dbserialize.py | 6 ++++++ evennia/utils/tests/test_dbserialize.py | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/evennia/utils/dbserialize.py b/evennia/utils/dbserialize.py index 438dd5eee2..420f124197 100644 --- a/evennia/utils/dbserialize.py +++ b/evennia/utils/dbserialize.py @@ -243,6 +243,10 @@ class _SaverMutable(object): def __delitem__(self, key): self._data.__delitem__(key) + def deserialize(self): + """Deserializes this mutable into its corresponding non-Saver type.""" + return deserialize(self) + class _SaverList(_SaverMutable, MutableSequence): """ @@ -418,6 +422,8 @@ def deserialize(obj): tname = typ.__name__ if tname in ("_SaverDict", "dict"): 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: return _DESERIALIZE_MAPPING[tname](_iter(val) for val in obj) elif is_iter(obj): diff --git a/evennia/utils/tests/test_dbserialize.py b/evennia/utils/tests/test_dbserialize.py index 31b059d753..c0e23b928a 100644 --- a/evennia/utils/tests/test_dbserialize.py +++ b/evennia/utils/tests/test_dbserialize.py @@ -2,9 +2,11 @@ Tests for dbserialize module """ +from collections import deque from django.test import TestCase from evennia.utils import dbserialize from evennia.objects.objects import DefaultObject +from parameterized import parameterized class TestDbSerialize(TestCase): @@ -64,3 +66,25 @@ class TestDbSerialize(TestCase): self.obj.db.test = {"a": True} self.obj.db.test.update({"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)