diff --git a/swh/model/collections.py b/swh/model/collections.py --- a/swh/model/collections.py +++ b/swh/model/collections.py @@ -13,9 +13,16 @@ class ImmutableDict(Mapping, Generic[KT, VT]): data: Tuple[Tuple[KT, VT], ...] - def __init__(self, data: Union[Iterable[Tuple[KT, VT]], Dict[KT, VT]] = {}): + def __init__( + self, + data: Union[ + Iterable[Tuple[KT, VT]], "ImmutableDict[KT, VT]", Dict[KT, VT] + ] = {}, + ): if isinstance(data, dict): self.data = tuple(item for item in data.items()) + elif isinstance(data, ImmutableDict): + self.data = data.data else: self.data = tuple(data) diff --git a/swh/model/tests/test_collections.py b/swh/model/tests/test_collections.py --- a/swh/model/tests/test_collections.py +++ b/swh/model/tests/test_collections.py @@ -32,6 +32,22 @@ assert list(d.items()) == [("foo", "bar")] +def test_immutabledict_from_iterable(): + d1 = ImmutableDict() + d2 = ImmutableDict({"foo": "bar"}) + + assert ImmutableDict([]) == d1 + assert ImmutableDict([("foo", "bar")]) == d2 + + +def test_immutabledict_from_immutabledict(): + d1 = ImmutableDict() + d2 = ImmutableDict({"foo": "bar"}) + + assert ImmutableDict(d1) == d1 + assert ImmutableDict(d2) == d2 + + def test_immutabledict_immutable(): d = ImmutableDict({"foo": "bar"})