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