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