1def get_filter(**kwargs):
2    import sys
3    from collections import namedtuple
4    from .exceptions import FilterKeywordError
5    from .filter_api import recognized_kw, incompatible_pairs
6
7    _filter = namedtuple('_filter',
8                         ['from_is_re',
9                          'from_string',
10                          'skip_above',
11                          'skip_below',
12                          'ignore_sign',
13                          'ignore_order',
14                          'mask',
15                          'num_lines',
16                          'to_is_re',
17                          'to_string',
18                          'tolerance',
19                          'tolerance_is_relative',
20                          'tolerance_is_set'])
21
22    unrecoginzed_kw = [kw for kw in kwargs.keys() if kw not in recognized_kw]
23    if unrecoginzed_kw != []:
24        error = '''ERROR: keyword(s) ({unrecognized}) not recognized
25       available keywords: ({available})\n'''.format(unrecognized=(', ').join(sorted(unrecoginzed_kw)),
26                                                     available=(', ').join(recognized_kw))
27        raise FilterKeywordError(error)
28
29    incompatible_kw = [(kw1, kw2) for (kw1, kw2) in incompatible_pairs if kw1 in kwargs.keys() and kw2 in kwargs.keys()]
30    if incompatible_kw != []:
31        error = 'ERROR: incompatible keyword pairs: {0}\n'.format(incompatible_kw)
32        raise FilterKeywordError(error)
33
34    # now continue with keywords
35    _filter.from_string = kwargs.get('from_string', None)
36    _filter.to_string = kwargs.get('to_string', None)
37    _filter.ignore_sign = kwargs.get('ignore_sign', False)
38    _filter.ignore_order = kwargs.get('ignore_order', False)
39    _filter.skip_below = kwargs.get('skip_below', sys.float_info.min)
40    _filter.skip_above = kwargs.get('skip_above', sys.float_info.max)
41    _filter.num_lines = kwargs.get('num_lines', 0)
42
43    if 'rel_tolerance' in kwargs.keys():
44        _filter.tolerance = kwargs.get('rel_tolerance')
45        _filter.tolerance_is_relative = True
46        _filter.tolerance_is_set = True
47    elif 'abs_tolerance' in kwargs.keys():
48        _filter.tolerance = kwargs.get('abs_tolerance')
49        _filter.tolerance_is_relative = False
50        _filter.tolerance_is_set = True
51    else:
52        _filter.tolerance_is_set = False
53
54    _filter.mask = kwargs.get('mask', None)
55
56    _filter.from_is_re = False
57    from_re = kwargs.get('from_re', '')
58    if from_re != '':
59        _filter.from_string = from_re
60        _filter.from_is_re = True
61
62    _filter.to_is_re = False
63    to_re = kwargs.get('to_re', '')
64    if to_re != '':
65        _filter.to_string = to_re
66        _filter.to_is_re = True
67
68    only_string = kwargs.get('string', '')
69    if only_string != '':
70        _filter.from_string = only_string
71        _filter.num_lines = 1
72
73    only_re = kwargs.get('re', '')
74    if only_re != '':
75        _filter.from_string = only_re
76        _filter.num_lines = 1
77        _filter.from_is_re = True
78
79    return _filter
80