Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
S2-group
GitHub Repository: S2-group/android-runner
Path: blob/master/examples/plugin/Scripts/aggregate_android_plugin.py
907 views
1
import csv
2
import os
3
import sys
4
from collections import OrderedDict
5
from functools import reduce
6
import pdb
7
8
9
def list_subdir(a_dir):
10
"""List immediate subdirectories of a_dir"""
11
# https://stackoverflow.com/a/800201
12
return [name for name in os.listdir(a_dir)
13
if os.path.isdir(os.path.join(a_dir, name))]
14
15
16
def aggregate_android_final(logs_dir):
17
def add_row(accum, new):
18
row = {k: v + float(new[k]) for k, v in list(accum.items()) if k not in ['Component', 'count']}
19
count = accum['count'] + 1
20
return dict(row, **{'count': count})
21
22
runs = []
23
for run_file in [f for f in os.listdir(logs_dir) if os.path.isfile(os.path.join(logs_dir, f))]:
24
with open(os.path.join(logs_dir, run_file), 'r') as run:
25
reader = csv.DictReader(run)
26
init = dict({fn: 0 for fn in reader.fieldnames if fn != 'datetime'}, **{'count': 0})
27
run_total = reduce(add_row, reader, init)
28
runs.append({k: v / run_total['count'] for k, v in list(run_total.items()) if k != 'count'})
29
runs_total = reduce(lambda x, y: {k: v + y[k] for k, v in list(x.items())}, runs)
30
return OrderedDict(
31
sorted(list({'android_' + k: v / len(runs) for k, v in list(runs_total.items())}.items()), key=lambda x: x[0]))
32
33
34
def aggregate(data_dir):
35
rows = []
36
for device in list_subdir(data_dir):
37
row = OrderedDict({'device': device})
38
device_dir = os.path.join(data_dir, device)
39
for subject in list_subdir(device_dir):
40
row.update({'subject': subject})
41
subject_dir = os.path.join(device_dir, subject)
42
if os.path.isdir(os.path.join(subject_dir, 'AndroidPlugin')):
43
row.update(aggregate_android_final(os.path.join(subject_dir, 'AndroidPlugin')))
44
rows.append(row.copy())
45
else:
46
for browser in list_subdir(subject_dir):
47
row.update({'browser': browser})
48
browser_dir = os.path.join(subject_dir, browser)
49
if os.path.isdir(os.path.join(browser_dir, 'AndroidPlugin')):
50
row.update(aggregate_android_final(os.path.join(browser_dir, 'AndroidPlugin')))
51
rows.append(row.copy())
52
return rows
53
54
55
def write_to_file(filename, rows):
56
with open(filename, 'w') as f:
57
writer = csv.DictWriter(f, list(rows[0].keys()))
58
writer.writeheader()
59
writer.writerows(rows)
60
61
62
# noinspection PyUnusedLocal
63
def main(dummy, data_dir, result_file):
64
print(('Output file: {}'.format(result_file)))
65
rows = aggregate(data_dir)
66
write_to_file(result_file, rows)
67
68
69
if __name__ == '__main__':
70
if len(sys.argv) == 3:
71
# noinspection PyArgumentList
72
main(None, sys.argv[1], sys.argv[2])
73
74