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