diff --git a/src/corelibs/iterator_handling/data_search.py b/src/corelibs/iterator_handling/data_search.py index f08667e..195da27 100644 --- a/src/corelibs/iterator_handling/data_search.py +++ b/src/corelibs/iterator_handling/data_search.py @@ -2,23 +2,40 @@ wrapper around search path """ -from typing import Any +from typing import Any, TypedDict, NotRequired +from warnings import deprecated +class ArraySearchList(TypedDict): + """find in array from list search dict""" + key: str + value: str | bool | int | float | list[str | None] + case_sensitive: NotRequired[bool] + + +@deprecated("Use find_in_array_from_list()") def array_search( - search_params: list[dict[str, str | bool | list[str | None]]], + search_params: list[ArraySearchList], data: list[dict[str, Any]], return_index: bool = False +) -> list[dict[str, Any]]: + """depreacted, old call order""" + return find_in_array_from_list(data, search_params, return_index) + +def find_in_array_from_list( + data: list[dict[str, Any]], + search_params: list[ArraySearchList], + return_index: bool = False ) -> list[dict[str, Any]]: """ - search in an array of dicts with an array of Key/Value set + search in an list of dicts with an list of Key/Value set all Key/Value sets must match Value set can be list for OR match option: case_senstive: default True Args: - search_params (list): List of search params in "Key"/"Value" lists with options data (list): data to search in, must be a list + search_params (list): List of search params in "key"/"value" lists with options return_index (bool): return index of list [default False] Raises: @@ -32,17 +49,19 @@ def array_search( """ if not isinstance(search_params, list): # type: ignore raise ValueError("search_params must be a list") - keys = [] + keys: list[str] = [] + # check that key and value exist and are set for search in search_params: - if not search.get('Key') or not search.get('Value'): + if not search.get('key') or not search.get('value'): raise KeyError( - f"Either Key '{search.get('Key', '')}' or " - f"Value '{search.get('Value', '')}' is missing or empty" + f"Either Key '{search.get('key', '')}' or " + f"Value '{search.get('value', '')}' is missing or empty" ) + keys.append(str(search['key'])) # if double key -> abort - if search.get("Key") in keys: + if search.get("key") in keys: raise KeyError( - f"Key {search.get('Key', '')} already exists in search_params" + f"Key {search.get('key', '')} already exists in search_params" ) return_items: list[dict[str, Any]] = [] @@ -55,20 +74,20 @@ def array_search( # lower case left side # TODO: allow nested Keys. eg "Key: ["Key a", "key b"]" to be ["Key a"]["key b"] if search.get("case_sensitive", True) is False: - search_value = search_item.get(str(search['Key']), "").lower() + search_value = search_item.get(str(search['key']), "").lower() else: - search_value = search_item.get(str(search['Key']), "") + search_value = search_item.get(str(search['key']), "") # lower case right side - if isinstance(search['Value'], list): + if isinstance(search['value'], list): search_in = [ - str(k).lower() - if search.get("case_sensitive", True) is False else k - for k in search['Value'] - ] + str(k).lower() + if search.get("case_sensitive", True) is False else k + for k in search['value'] + ] elif search.get("case_sensitive", True) is False: - search_in = str(search['Value']).lower() + search_in = str(search['value']).lower() else: - search_in = search['Value'] + search_in = search['value'] # compare check if ( ( diff --git a/test-run/iterator_handling/data_search.py b/test-run/iterator_handling/data_search.py new file mode 100644 index 0000000..ff4e410 --- /dev/null +++ b/test-run/iterator_handling/data_search.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +""" +Search data tests +iterator_handling.data_search +""" + +from corelibs.debug_handling.dump_data import dump_data +from corelibs.iterator_handling.data_search import find_in_array_from_list, ArraySearchList + + +def main() -> None: + """ + Comment + """ + data = [ + { + "lookup_value_p": "A01", + "lookup_value_c": "B01", + "replace_value": "R01", + }, + { + "lookup_value_p": "A02", + "lookup_value_c": "B02", + "replace_value": "R02", + }, + ] + test_foo = ArraySearchList( + key = "lookup_value_p", + value = "A01" + ) + print(test_foo) + search: list[ArraySearchList] = [ + { + "key": "lookup_value_p", + "value": "A01" + }, + { + "key": "lookup_value_c", + "value": "B01" + } + ] + + result = find_in_array_from_list(data, search) + + print(f"Search {dump_data(search)} -> {dump_data(result)}") + + +if __name__ == "__main__": + main() + +# __END__ diff --git a/uv.lock b/uv.lock index 9c6c261..2d80c13 100644 --- a/uv.lock +++ b/uv.lock @@ -44,7 +44,7 @@ wheels = [ [[package]] name = "corelibs" -version = "0.15.0" +version = "0.16.0" source = { editable = "." } dependencies = [ { name = "jmespath" },