diff --git a/homeassistant/util/read_only_dict.py b/homeassistant/util/read_only_dict.py index 59d10b015a5..02befa78f60 100644 --- a/homeassistant/util/read_only_dict.py +++ b/homeassistant/util/read_only_dict.py @@ -1,5 +1,6 @@ """Read only dictionary.""" +from copy import deepcopy from typing import Any @@ -18,3 +19,13 @@ class ReadOnlyDict[_KT, _VT](dict[_KT, _VT]): clear = _readonly update = _readonly setdefault = _readonly + + def __copy__(self) -> dict[_KT, _VT]: + """Create a shallow copy.""" + return ReadOnlyDict(self) + + def __deepcopy__(self, memo: Any) -> dict[_KT, _VT]: + """Create a deep copy.""" + return ReadOnlyDict( + {deepcopy(key, memo): deepcopy(value, memo) for key, value in self.items()} + ) diff --git a/tests/util/test_read_only_dict.py b/tests/util/test_read_only_dict.py index 888ea59fb11..68e22a66f5e 100644 --- a/tests/util/test_read_only_dict.py +++ b/tests/util/test_read_only_dict.py @@ -1,5 +1,6 @@ """Test read only dictionary.""" +import copy import json import pytest @@ -35,3 +36,5 @@ def test_read_only_dict() -> None: assert isinstance(data, dict) assert dict(data) == {"hello": "world"} assert json.dumps(data) == json.dumps({"hello": "world"}) + + assert copy.deepcopy(data) == {"hello": "world"}