From c4dad17f223d2300c7db187807ed74603a0e2002 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz <vlorentz@softwareheritage.org> Date: Tue, 7 Jul 2020 15:04:54 +0200 Subject: [PATCH] Allow passing an ImmutableDict as argument to ImmutableDict's constructor. It allows easy conversion of Union[ImmutableDict, Dict] to ImmutableDict. --- swh/model/collections.py | 9 ++++++++- swh/model/tests/test_collections.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/swh/model/collections.py b/swh/model/collections.py index 2724f85c..495b43c5 100644 --- a/swh/model/collections.py +++ b/swh/model/collections.py @@ -13,9 +13,16 @@ VT = TypeVar("VT") 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 index c7b44cb1..b042c592 100644 --- a/swh/model/tests/test_collections.py +++ b/swh/model/tests/test_collections.py @@ -32,6 +32,22 @@ def test_immutabledict_one_item(): 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"}) -- GitLab