From d89954bb14d716510839da2c4ed7e3a63a7a3b96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 19 Mar 2025 16:02:15 +0100
Subject: [PATCH 1/4] FIX: Multiple registered identifiables error when
 multiple parents exist

---
 src/caoscrawler/identifiable_adapters.py | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/caoscrawler/identifiable_adapters.py b/src/caoscrawler/identifiable_adapters.py
index 6169a99..444b73f 100644
--- a/src/caoscrawler/identifiable_adapters.py
+++ b/src/caoscrawler/identifiable_adapters.py
@@ -672,11 +672,15 @@ class CaosDBIdentifiableAdapter(IdentifiableAdapter):
         registered = []
         for parent in rt.parents:
             prt = _retrieve_RecordType(id=parent.id, name=parent.name)
-            registered.append(self._get_registered_for_rt(prt))
+            reg = self._get_registered_for_rt(prt)
+            if reg is not None:
+                registered.append(reg)
         # TODO we might in future want to check whether the registered identifiables are the same
         if len(registered) > 1:
-            raise RuntimeError("Multiple registered identifiables found for the RecordType "
-                               f" {rt.name} with the following parents: {rt.parents}")
+            ri_names = [i.name for i in registered]
+            raise RuntimeError(f"Multiple registered identifiables found for the RecordType "
+                               f" {rt.name} with the following parents: {rt.parents}\n"
+                               f"Registered identifiables: {', '.join(ri_names)}")
         elif len(registered) == 1:
             return registered[0]
         else:
-- 
GitLab


From 58b17c0c41f8c029748d01efc05524be47966c87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 19 Mar 2025 16:13:26 +0100
Subject: [PATCH 2/4] TST: add test for multiple parents

---
 unittests/test_identifiable_adapters.py | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/unittests/test_identifiable_adapters.py b/unittests/test_identifiable_adapters.py
index 5108e83..5b6b880 100644
--- a/unittests/test_identifiable_adapters.py
+++ b/unittests/test_identifiable_adapters.py
@@ -54,7 +54,7 @@ def mock_retrieve_RecordType(id, name):
         "Lab": db.RecordType(name="Lab"),
         "Analysis": db.RecordType(name="Analysis"),
         "MetaAnalysis": db.RecordType(name="MetaAnalysis").add_parent("Analysis"),
-        "Measurement": db.RecordType(name="Measurement").add_parent("Experiment")
+        "Measurement": db.RecordType(name="Measurement").add_parent("Experiment").add_parent("A")
     }[name]
 
 
@@ -338,3 +338,11 @@ def test_get_registered_identifiable():
     registered = ident.get_registered_identifiable(rec)
     assert registered is not None
     assert registered.parents[0].name == "Experiment"
+
+    # Same again, but with two grand parents
+    ident = CaosDBIdentifiableAdapter()
+    ident.load_from_yaml_definition(UNITTESTDIR / "example_identifiables.yml")
+    rec = db.Record().add_parent(name="Measurement")
+    registered = ident.get_registered_identifiable(rec)
+    assert registered is not None
+    assert registered.parents[0].name == "Experiment"
-- 
GitLab


From 63a01e6b8c4f082de53f57e0808806f62b949d44 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Wed, 19 Mar 2025 16:26:39 +0100
Subject: [PATCH 3/4] DOC: update cl

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e88f71..33fdff7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed ###
 
 ### Fixed ###
+- A RecordType with multiple Parents no longer causes an error during
+  collection of identifiables
 
 ### Security ###
 
-- 
GitLab


From 3a5b3cf7399915ef30f0eaa1642b8eb9fe28a1c8 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 19 Mar 2025 17:53:01 +0100
Subject: [PATCH 4/4] TEST(identifiable): Remove unused test case

---
 unittests/test_identifiable_adapters.py | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/unittests/test_identifiable_adapters.py b/unittests/test_identifiable_adapters.py
index 5b6b880..1c7733a 100644
--- a/unittests/test_identifiable_adapters.py
+++ b/unittests/test_identifiable_adapters.py
@@ -54,6 +54,8 @@ def mock_retrieve_RecordType(id, name):
         "Lab": db.RecordType(name="Lab"),
         "Analysis": db.RecordType(name="Analysis"),
         "MetaAnalysis": db.RecordType(name="MetaAnalysis").add_parent("Analysis"),
+        # Test that two parents are possible; only one of them
+        # (Experiment) has an identifiable.
         "Measurement": db.RecordType(name="Measurement").add_parent("Experiment").add_parent("A")
     }[name]
 
@@ -330,16 +332,10 @@ def test_get_registered_identifiable():
     with pytest.raises(RuntimeError):
         registered = ident.get_registered_identifiable(rec)
 
-    # Test the case that the record has a parent for which no identifiable is registered
-    # and there is a registered identifiable for a grand parent
-    ident = CaosDBIdentifiableAdapter()
-    ident.load_from_yaml_definition(UNITTESTDIR / "example_identifiables.yml")
-    rec = db.Record().add_parent(name="Measurement")
-    registered = ident.get_registered_identifiable(rec)
-    assert registered is not None
-    assert registered.parents[0].name == "Experiment"
-
-    # Same again, but with two grand parents
+    # Test the case that the record has a parent for which no
+    # identifiable is registered and there is a registered
+    # identifiable for a grand parent. Note that this also tests the
+    # case of two grandparents, only one of which has an identifiable.
     ident = CaosDBIdentifiableAdapter()
     ident.load_from_yaml_definition(UNITTESTDIR / "example_identifiables.yml")
     rec = db.Record().add_parent(name="Measurement")
-- 
GitLab