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