blob: 988fe0ec05b76685ce01fb7140355b5bbfc61c51 [file] [log] [blame]
koder aka kdanilov6c491062015-04-09 22:33:13 +03001import re
2import json
koder aka kdanilov4a510ee2015-04-21 18:50:42 +03003
koder aka kdanilov6c491062015-04-09 22:33:13 +03004
5def parse_output(out_err):
koder aka kdanilov46d4f392015-04-24 11:35:00 +03006 err_start_patt = r"(?ims)=+\s+ERROR\s+=+"
7 err_end_patt = r"(?ims)=+\s+END OF ERROR\s+=+"
8
9 for block in re.split(err_start_patt, out_err)[1:]:
10 tb, garbage = re.split(err_end_patt, block)
11 msg = "Test fails with error:\n" + tb.strip() + "\n"
12 raise OSError(msg)
13
koder aka kdanilov6c491062015-04-09 22:33:13 +030014 start_patt = r"(?ims)=+\s+RESULTS\(format=json\)\s+=+"
15 end_patt = r"(?ims)=+\s+END OF RESULTS\s+=+"
16
17 for block in re.split(start_patt, out_err)[1:]:
18 data, garbage = re.split(end_patt, block)
19 yield json.loads(data.strip())
20
21 start_patt = r"(?ims)=+\s+RESULTS\(format=eval\)\s+=+"
22 end_patt = r"(?ims)=+\s+END OF RESULTS\s+=+"
23
24 for block in re.split(start_patt, out_err)[1:]:
25 data, garbage = re.split(end_patt, block)
26 yield eval(data.strip())
27
28
29def filter_data(name_prefix, fields_to_select, **filters):
30 def closure(data):
31 for result in data:
32 if name_prefix is not None:
33 if not result['jobname'].startswith(name_prefix):
34 continue
35
36 for k, v in filters.items():
37 if result.get(k) != v:
38 break
39 else:
40 yield map(result.get, fields_to_select)
41 return closure
42
43
koder aka kdanilov4a510ee2015-04-21 18:50:42 +030044def filter_processed_data(name_prefix, fields_to_select, **filters):
45 def closure(data):
46 for name, result in data.items():
47 if name_prefix is not None:
48 if not name.startswith(name_prefix):
49 continue
50
51 for k, v in filters.items():
52 if result.raw.get(k) != v:
53 break
54 else:
55 yield map(result.raw.get, fields_to_select)
56 return closure