diff --git a/src/caoscrawler/converters.py b/src/caoscrawler/converters.py index bc30c7d4b0fc19b86283a21d3c5348de8c62baf6..7d994377fc582c20384e38db3c887c972354fa93 100644 --- a/src/caoscrawler/converters.py +++ b/src/caoscrawler/converters.py @@ -810,7 +810,29 @@ class DictElementConverter(Converter): raise RuntimeError("Element must be a DictElement.") return match_name_and_value(self.definition, element.name, element.value) - def create_records(self, values: GeneralStore, records: RecordStore, element: StructureElement): + +class HeuristicDictConverter(DictElementConverter): + """Extend the :py:class:`DictElementConverter` by a heuristic to set + property values from the dictionary keys. + + """ + def _validate_definition(definition: dict, name: str): + + if "record_from_dict" not in definition or definition["record_from_dict"] is None: + + raise ValueError( + "You need to specify the (root) record, the properties of " + f"which will be set from the dict in converter {name}." + ) + + def __init__(self, definition: dict, name: str, converter_registry: dict): + + _validate_definition(definition) + super().__init__(definition, name, converter_registry) + + def create_records(self, values: GeneralStore, records: RecordStore, + element: StructureElement, referenced_record_callback: + Optional[callable] = None): keys_modified = [] if "record_from_dict" in self.definition and self.definition["record_from_dict"] is not None: @@ -826,7 +848,7 @@ class DictElementConverter(Converter): class DictConverter(DictElementConverter): def __init__(self, *args, **kwargs): warnings.warn(DeprecationWarning( - "This class is depricated. Please use DictConverter.")) + "This class is depricated. Please use DictElementConverter.")) super().__init__(*args, **kwargs) diff --git a/src/caoscrawler/default_converters.yml b/src/caoscrawler/default_converters.yml index e192ab1b3bae70a6772cf6defba4a4592a92e584..98c7345db2c5d7f4996f5ad66b497a9e56429fad 100644 --- a/src/caoscrawler/default_converters.yml +++ b/src/caoscrawler/default_converters.yml @@ -11,6 +11,9 @@ Date: Dict: converter: DictElementConverter package: caoscrawler.converters +DictHeuristic: + converter: HeuristicDictConverter + package: caoscrawler.converters FloatElement: converter: FloatElementConverter package: caoscrawler.converters