|
1
|
|
|
from benedict.core.traverse import traverse |
|
2
|
|
|
from benedict.utils import type_util |
|
3
|
|
|
|
|
4
|
|
|
|
|
5
|
|
|
def _get_term(value, case_sensitive): |
|
6
|
|
|
v_is_str = type_util.is_string(value) |
|
7
|
|
|
v = value.lower() if (v_is_str and not case_sensitive) else value |
|
8
|
|
|
return (v, v_is_str) |
|
9
|
|
|
|
|
10
|
|
|
|
|
11
|
|
|
def _get_match(query, value, exact, case_sensitive): |
|
12
|
|
|
q, q_is_str = _get_term(query, case_sensitive) |
|
13
|
|
|
v, v_is_str = _get_term(value, case_sensitive) |
|
14
|
|
|
# TODO: add regex support |
|
15
|
|
|
if q_is_str and v_is_str and not exact: |
|
16
|
|
|
return q in v |
|
17
|
|
|
return q == v |
|
18
|
|
|
|
|
19
|
|
|
|
|
20
|
|
|
def search(d, query, in_keys=True, in_values=True, exact=False, case_sensitive=True): |
|
21
|
|
|
items = [] |
|
22
|
|
|
|
|
23
|
|
|
def _search_item(item_dict, item_key, item_value): |
|
24
|
|
|
match_key = in_keys and _get_match(query, item_key, exact, case_sensitive) |
|
25
|
|
|
match_val = in_values and _get_match(query, item_value, exact, case_sensitive) |
|
26
|
|
|
if any([match_key, match_val]): |
|
27
|
|
|
items.append((item_dict, item_key, item_value)) |
|
28
|
|
|
|
|
29
|
|
|
traverse(d, _search_item) |
|
30
|
|
|
return items |
|
31
|
|
|
|