diff --git a/src/caoscrawler/converters/rocrate.py b/src/caoscrawler/converters/rocrate.py index fe40394490cb4d531929a9f7ecb6d092053945a4..f0140fa1fb2adc31ad9c155294a8441402fd9002 100644 --- a/src/caoscrawler/converters/rocrate.py +++ b/src/caoscrawler/converters/rocrate.py @@ -200,12 +200,16 @@ class ROCrateEntityConverter(Converter): # This is - according to the standard - only allowed, if it's flat, i.e. # it contains a single element with key == "@id" and the id as value which # is supposed to be dereferenced: - if not (len(value) == 1 and "@id" in eprops): + if not (len(value) == 1 and "@id" in value): raise RuntimeError("The JSON-LD is not flat.") - children.append( - ROCrateEntity(element.folder, element.entity.crate.dereference( - value["@id"]))) # TODO: tests missing! + dereferenced = element.entity.crate.dereference(value["@id"]) + if dereferenced is not None: + children.append( + ROCrateEntity(element.folder, dereferenced)) + else: + # This is just an external ID and will be added as simple DictElement + children.append(convert_basic_element(value, name)) else: children.append(convert_basic_element(value, name)) diff --git a/unittests/test_rocrate_converter.py b/unittests/test_rocrate_converter.py index ebf585fb1ccbf245e597ba412ab414bbfdd80b6b..02f0f6025b3e8168e26c8e6367c37240ea28af35 100644 --- a/unittests/test_rocrate_converter.py +++ b/unittests/test_rocrate_converter.py @@ -144,8 +144,8 @@ match_properties: assert isinstance(children[0], TextElement) assert children[0].name == "@id" assert children[0].value == "ro-crate-metadata.json" - assert isinstance(children[5], DictElement) - assert children[5].value == {'@id': 'https://kadi.iam.kit.edu'} + assert isinstance(children[5], ROCrateEntity) + assert children[5].name == "https://kadi.iam.kit.edu" def test_file(eln_entities): @@ -184,13 +184,20 @@ match_properties: assert match is not None children = ds_parts.create_children(GeneralStore(), ent_parts) + # Number of children = number of properties + number of parts + + # number of variables measured + number of files + assert len(children) == (len(ent_parts.entity.properties()) + + len(ent_parts.entity.properties()["hasPart"]) + + len(ent_parts.entity.properties()["variableMeasured"])) - # Number of children = number of properties + number of parts: - assert len(children) == len(ent_parts.entity.properties()) + 4 entity_children = [f for f in children if isinstance(f, ROCrateEntity)] - assert len(entity_children) == 4 + assert len(entity_children) == 13 + file_counter = 0 + for f in entity_children: - assert isinstance(f.entity, rocrate.model.file.File) + if isinstance(f.entity, rocrate.model.file.File): + file_counter += 1 + assert file_counter == 4 def test_scanner():