blob: c0a9cb1748ffb2bf7d48d92cf66afe51213c5c9d [file] [log] [blame]
gstepanove0f26ab2015-02-02 18:09:37 +02001from gspread import WorksheetNotFound, login
2import json
3import os
4from config import ROW_COUNT
5
6
7def get_work_sheet(sheet, name, column_names):
8 try:
9 work_sheet = sheet.worksheet(name)
10 except WorksheetNotFound:
11 work_sheet = sheet.add_worksheet(title=name, rows=ROW_COUNT,
12 cols=max(40, len(column_names)))
13
14 for i in range(1, len(column_names) + 1):
15 work_sheet.update_cell(1, i, column_names[i - 1])
16
17 return work_sheet
18
19
20def get_row_number(work_sheet):
21 num = 2
22
23 while num < work_sheet.row_count and work_sheet.cell(num, 1).value != "":
24 num += 1
25
26 if num == work_sheet.row_count:
27 work_sheet.append_row(["" for x in range(work_sheet.col_count)])
28
29 return num
30
31
32def append_row(work_sheet, row):
33 row_number = get_row_number(work_sheet)
34
35 i = 1
36 for k in row.keys():
37 work_sheet.update_cell(row_number, i, row[k])
38 i += 1
gstepanov71764e92015-02-02 16:33:11 +020039
40
41class Measurement(object):
42 def __init__(self):
43 self.build = ""
44 self.build_type = 0 # GA/Master/Other
45 self.md5 = ""
46 self.results = {
47 "": (float, float)
48 }
49
50
51class Storage(object):
gstepanove0f26ab2015-02-02 18:09:37 +020052 def store(self, data):
53 pass
gstepanov71764e92015-02-02 16:33:11 +020054
gstepanove0f26ab2015-02-02 18:09:37 +020055 def retrieve(self, id):
56 pass
57
58
59class GoogleDocsStorage(Storage):
60
61 def __init__(self, doc_id, work_sheet_name, email=None, password=None):
62 self.gc = login(email, password)
gstepanov71764e92015-02-02 16:33:11 +020063 self.sh = self.gc.open_by_key(doc_id)
64 self.work_sheet = get_work_sheet(self.sh, work_sheet_name, 40)
65
66 def store(self, data):
67 append_row(self.work_sheet, data)
68
69 def retrieve(self, id):
70 row_number = self.find_by_id(id)
71
72 if row_number != -1:
73 vals = self.work_sheet.row_values(row_number)
74 m = Measurement()
gstepanove0f26ab2015-02-02 18:09:37 +020075 m.build = vals.pop("build_id")
76 m.build_type = vals.pop("type")
77 m.md5 = vals.pop("iso_md5")
gstepanov71764e92015-02-02 16:33:11 +020078 m.results = {k: vals[k] for k in vals.keys()}
79 else:
80 return None
81
82 def find_by_id(self, row_id):
83 for i in range(1, self.work_sheet):
84 if self.work_sheet.cell(i, 1) == row_id:
85 return i
86
87 return -1
88
89
gstepanove0f26ab2015-02-02 18:09:37 +020090class DiskStorage(Storage):
91 def __init__(self, file_name):
92 self.file_name = file_name
93
94 if not os.path.exists(file_name):
95 with open(file_name, "w+") as f:
96 f.write(json.dumps([]))
97
98 def store(self, data):
99 with open(self.file_name, "rt") as f:
100 raw_data = f.read()
101 document = json.loads(raw_data)
102 document.append(data)
103
104 with open(self.file_name, "w+") as f:
105 f.write(json.dumps(document))
106
107 def retrieve(self, id):
108 with open(self.file_name, "rt") as f:
109 raw_data = f.read()
110 document = json.loads(raw_data)
111
112 for row in document:
113 if row["build_id"] == id:
114 m = Measurement()
115 m.build = row.pop("build_id")
116 m.build_type = row.pop("type")
117 m.md5 = row.pop("iso_md5")
118 m.results = {k: row[k] for k in row.keys()}
119
120 return m
121 return None
122