From 06d3ddb457c028f7d2f0ea5bf58e1f4cab3a243e Mon Sep 17 00:00:00 2001 From: Shahadat Islam Koyel <179203101+ShahadatTest@users.noreply.github.com> Date: Tue, 27 Oct 2026 11:53:39 +0600 Subject: [PATCH] Enforce freezing before standalone keylist assignments --- benedict/dicts/keylist/keylist_dict.py | 1 + tests/dicts/keylist/test_frozen_assignment.py | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/dicts/keylist/test_frozen_assignment.py diff --git a/benedict/dicts/keylist/keylist_dict.py b/benedict/dicts/keylist/keylist_dict.py index 84c2fcc9..6251e3e6 100644 --- a/benedict/dicts/keylist/keylist_dict.py +++ b/benedict/dicts/keylist/keylist_dict.py @@ -61,6 +61,7 @@ def _getitem_bystreys(self, keys: Any) -> Any: def __setitem__( self, key: list[str | int] | tuple[str | int, ...] | _K, value: _V ) -> None: + self._check_frozen() if type_util.is_list(key): self._setitem_bystreys(key, value) return diff --git a/tests/dicts/keylist/test_frozen_assignment.py b/tests/dicts/keylist/test_frozen_assignment.py new file mode 100644 index 00000000..91a696b9 --- /dev/null +++ b/tests/dicts/keylist/test_frozen_assignment.py @@ -0,0 +1,29 @@ +import unittest + +from benedict.dicts import KeylistDict, KeypathDict + + +class frozen_assignment_test_case(unittest.TestCase): + def test_frozen_nested_assignment(self) -> None: + for cls, key in [ + (KeylistDict, ["nested", "value"]), + (KeypathDict, "nested.value"), + ]: + for data in [{"nested": {"value": 1}}, {"nested": {}}, {}]: + with self.subTest(cls=cls, data=data): + obj = cls(data).freeze() + before = repr(obj) + with self.assertRaises(TypeError): + obj[key] = 2 + self.assertEqual(repr(obj), before) + + def test_frozen_list_assignment(self) -> None: + obj = KeylistDict({"items": [1]}).freeze() + with self.assertRaises(TypeError): + obj[["items", 0]] = 2 + self.assertEqual(obj["items"], [1]) + + def test_assignment_after_unfreeze(self) -> None: + obj = KeypathDict({"nested": {"value": 1}}).freeze().unfreeze() + obj["nested.value"] = 2 + self.assertEqual(obj["nested.value"], 2)