diff --git a/jsonstore.py b/jsonstore.py index c46dabf..a325a82 100644 --- a/jsonstore.py +++ b/jsonstore.py @@ -148,6 +148,7 @@ def __setattr__(self, attr, value): def __delattr__(self, attr): del self._data[attr] + self._do_auto_commit() def __get_obj(self, steps): """Returns the object which is under the given path.""" @@ -190,6 +191,7 @@ def __delitem__(self, key): del obj[step] except (KeyError, IndexError, TypeError) as e: raise type(e)("unable to delete %s from %s: %s" % (step, path, e)) + self._do_auto_commit() def __contains__(self, key): steps = self._canonical_key(key) diff --git a/test_jsonstore.py b/test_jsonstore.py index 1f5b207..5ab7e6f 100644 --- a/test_jsonstore.py +++ b/test_jsonstore.py @@ -219,6 +219,38 @@ def test_del(self): with self.assertRaises((TypeError, KeyError)): del self.store["dict", slice("a")] + def test_deletions_are_auto_committed(self): + cases = ( + (lambda store: delattr(store, "value"), {}), + (lambda store: store.__delitem__("value"), {}), + (lambda store: store.__delitem__("value.key"), + {"value": {"items": [1, 2, 3]}}), + (lambda store: store.__delitem__(("value", "items", 1)), + {"value": {"key": 1, "items": [1, 3]}}), + (lambda store: store.__delitem__(("value", "items", slice(0, 2))), + {"value": {"key": 1, "items": [3]}}), + ) + for index, (delete, expected) in enumerate(cases): + with self.subTest(case=index): + self.store.value = {"key": 1, "items": [1, 2, 3]} + delete(self.store) + with open(self._store_file) as handle: + self.assertEqual(json.load(handle), expected) + self.assertEqual(JsonStore(self._store_file)._data, expected) + + def test_deletion_respects_deferred_commits(self): + self.store.key = 1 + with self.store: + del self.store.key + self.assertEqual(JsonStore(self._store_file).key, 1) + self.assertNotIn("key", JsonStore(self._store_file)) + + self.store.key = 1 + store = JsonStore(self._store_file, auto_commit=False) + del store["key"] + self.assertNotIn("key", store) + self.assertEqual(JsonStore(self._store_file).key, 1) + def test_context_and_deserialisation(self): store_file = os.path.join(self._directory.name, "roundtrip.json") for name, value in self.TEST_DATA: