diff --git a/masque/library.py b/masque/library.py index 9d1f1b7..df637af 100644 --- a/masque/library.py +++ b/masque/library.py @@ -926,8 +926,13 @@ class ILibrary(ILibraryView, MutableMapping[str, 'Pattern'], metaclass=ABCMeta): duplicates = set(self.keys()) & set(other.keys()) if not duplicates: - for key in other: - self._merge(key, other, key) + if mutate_other: + temp = other + else: + temp = Library(copy.deepcopy(dict(other))) + + for key in temp: + self._merge(key, temp, key) return {} if mutate_other: diff --git a/masque/test/test_library.py b/masque/test/test_library.py index 6ac8536..d035db6 100644 --- a/masque/test/test_library.py +++ b/masque/test/test_library.py @@ -221,6 +221,17 @@ def test_library_rename() -> None: assert "old" not in lib["parent"].refs +def test_library_add_no_duplicates_respects_mutate_other_false() -> None: + src_pat = Pattern(ports={"A": Port((0, 0), 0)}) + lib = Library({"a": Pattern()}) + + lib.add({"b": src_pat}, mutate_other=False) + + assert lib["b"] is not src_pat + lib["b"].ports["A"].offset[0] = 123 + assert tuple(src_pat.ports["A"].offset) == (0.0, 0.0) + + def test_library_subtree() -> None: lib = Library() lib["a"] = Pattern()