koder aka kdanilov | 6c49106 | 2015-04-09 22:33:13 +0300 | [diff] [blame] | 1 | import re |
| 2 | import json |
koder aka kdanilov | 4a510ee | 2015-04-21 18:50:42 +0300 | [diff] [blame] | 3 | |
koder aka kdanilov | 6c49106 | 2015-04-09 22:33:13 +0300 | [diff] [blame] | 4 | |
| 5 | def parse_output(out_err): |
koder aka kdanilov | 46d4f39 | 2015-04-24 11:35:00 +0300 | [diff] [blame] | 6 | 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 kdanilov | 6c49106 | 2015-04-09 22:33:13 +0300 | [diff] [blame] | 14 | 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 | |
| 29 | def 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 kdanilov | 4a510ee | 2015-04-21 18:50:42 +0300 | [diff] [blame] | 44 | def 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 |