diff --git a/src/caoscrawler/identifiable_adapters.py b/src/caoscrawler/identifiable_adapters.py index 81396c66b9e3b08b2f375ffa26525ed1fa81baf0..d8c3ecf1cd21cb1efb2a6cb38c5222ba284f0087 100644 --- a/src/caoscrawler/identifiable_adapters.py +++ b/src/caoscrawler/identifiable_adapters.py @@ -288,72 +288,68 @@ startswith: bool, optional Identifiable, the identifiable for record. """ - registered_identifiable = se.registered_identifiable - property_name_list_A = [] property_name_list_B = [] identifiable_props = {} name = None - # TODO - # if registered_identifiable is None: - # raise ValueError("no register_identifiable") + if se.registered_identifiable is None: + raise ValueError("no register_identifiable") - if registered_identifiable is not None: - # fill the values: - for prop in registered_identifiable.properties: - if prop.name == "name": - name = se.name - continue - # problem: what happens with multi properties? - # case A: in the registered identifiable - # case B: in the identifiable - - # treated elsewhere - if prop.name.lower() == "is_referenced_by": - for el in identifiable_backrefs: - assert isinstance(el, SyncNode) - if len(identifiable_backrefs) == 0: - raise MissingReferencingEntityError( - f"Could not find referencing entities of type(s): {prop.value}\n" - f"for registered identifiable:\n{registered_identifiable}\n" - f"There were {len(identifiable_backrefs)} referencing entities to choose from.\n" - f"This error can also occur in case of merge conflicts in the referencing entities." - ) - elif len([e.id for e in identifiable_backrefs if el.id is None]) > 0: - raise RuntimeError( - f"Referencing entity has no id" - ) - continue + # fill the values: + for prop in se.registered_identifiable.properties: + if prop.name == "name": + name = se.name + continue + # problem: what happens with multi properties? + # case A: in the registered identifiable + # case B: in the identifiable - options = [p.value for p in se.properties if p.name == prop.name] - if len(options) == 0: - raise MissingIdentifyingProperty( - f"The following record is missing an identifying property:\n" - f"RECORD\n{se}\nIdentifying PROPERTY\n{prop.name}" + # treated elsewhere + if prop.name.lower() == "is_referenced_by": + for el in identifiable_backrefs: + assert isinstance(el, SyncNode) + if len(identifiable_backrefs) == 0: + raise MissingReferencingEntityError( + f"Could not find referencing entities of type(s): {prop.value}\n" + f"for registered identifiable:\n{se.registered_identifiable}\n" + f"There were {len(identifiable_backrefs)} referencing entities to choose from.\n" + f"This error can also occur in case of merge conflicts in the referencing entities." ) - for ii, el in enumerate(options): - if isinstance(el, SyncNode): - options[ii] = el.id - if el.id is None: - raise RuntimeError("Reference to unchecked in identifiable:\n" - f"{prop.name}:\n{el}") - else: - options[ii] = el - if not all([f == options[0] for f in options]): - raise RuntimeError("differing prop values ") - - identifiable_props[prop.name] = options[0] - property_name_list_A.append(prop.name) - - # check for multi properties in the record: - for prop in property_name_list_A: - property_name_list_B.append(prop) - if (len(set(property_name_list_B)) != len(property_name_list_B) or len( - set(property_name_list_A)) != len(property_name_list_A)): - raise RuntimeError( - "Multi properties used in identifiables could cause unpredictable results and " - "are not allowed. You might want to consider a Property with a list as value.") + elif len([e.id for e in identifiable_backrefs if el.id is None]) > 0: + raise RuntimeError( + f"Referencing entity has no id" + ) + continue + + options = [p.value for p in se.properties if p.name == prop.name] + if len(options) == 0: + raise MissingIdentifyingProperty( + f"The following record is missing an identifying property:\n" + f"RECORD\n{se}\nIdentifying PROPERTY\n{prop.name}" + ) + for ii, el in enumerate(options): + if isinstance(el, SyncNode): + options[ii] = el.id + if el.id is None: + raise RuntimeError("Reference to unchecked in identifiable:\n" + f"{prop.name}:\n{el}") + else: + options[ii] = el + if not all([f == options[0] for f in options]): + raise RuntimeError("differing prop values ") + + identifiable_props[prop.name] = options[0] + property_name_list_A.append(prop.name) + + # check for multi properties in the record: + for prop in property_name_list_A: + property_name_list_B.append(prop) + if (len(set(property_name_list_B)) != len(property_name_list_B) or len( + set(property_name_list_A)) != len(property_name_list_A)): + raise RuntimeError( + "Multi properties used in identifiables could cause unpredictable results and " + "are not allowed. You might want to consider a Property with a list as value.") # use the RecordType of the registered Identifiable if it exists # We do not use parents of Record because it might have multiple @@ -361,8 +357,7 @@ startswith: bool, optional return Identifiable( record_id=se.id, path=se.path, - record_type=(registered_identifiable.parents[0].name - if registered_identifiable else None), + record_type=se.registered_identifiable.parents[0].name, name=name, properties=identifiable_props, backrefs=[e.id for e in identifiable_backrefs]