benedict.core.search   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 31
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 8
eloc 22
dl 0
loc 31
rs 10
c 0
b 0
f 0

3 Functions

Rating   Name   Duplication   Size   Complexity  
A _get_term() 0 4 2
A search() 0 11 2
A _get_match() 0 7 4
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