diff --git a/box/box.py b/box/box.py index 8be6738..20d80ab 100644 --- a/box/box.py +++ b/box/box.py @@ -839,7 +839,10 @@ def convert_and_set(k, v): # in the `converted` box_config set v = self._box_config["box_class"](v, **self.__box_config(extra_namespace=k)) if k in self and isinstance(self[k], dict): + frozen = self[k]._box_config['frozen_box'] + self[k]._box_config['frozen_box'] = False self[k].merge_update(v, box_merge_lists=merge_type) + self[k]._box_config['frozen_box'] = frozen return if isinstance(v, list) and not intact_type: v = box.BoxList(v, **self.__box_config(extra_namespace=k)) diff --git a/test/test_box.py b/test/test_box.py index 1232f3c..c16243f 100644 --- a/test/test_box.py +++ b/test/test_box.py @@ -984,6 +984,25 @@ def test_add_boxes(self): with pytest.raises(BoxError): Box() + BoxList() + def test_add_frozen_boxes(self): + b = Box(c=1, d={"sub": 1}, e=1, frozen_box=True) + c = dict(d={"val": 2}, e=4) + assert b + c == Box(c=1, d={"sub": 1, "val": 2}, e=4) + + def test_adding_frozen_boxes_result_in_frozen_box(self): + a = Box({'one': 1 }, frozen_box=True) + b = Box({'two': 2 }, frozen_box=True) + c = a + b + with pytest.raises(BoxError): + c.three = 3 + + def test_adding_nested_frozen_boxes_result_in_frozen_box(self): + a = Box({'one': {"two": '1.2'} }, frozen_box=True) + b = Box({'one': {"three": '1.3'} }, frozen_box=True) + c = a + b + with pytest.raises(BoxError): + c.one.four = '1.4' + def test_iadd_boxes(self): b = Box(c=1, d={"sub": 1}, e=1) c = dict(d={"val": 2}, e=4)