Skip to content

Commit d220fb1

Browse files
committed
Split out result and report data to separate module
1 parent 4dfeab2 commit d220fb1

4 files changed

Lines changed: 160 additions & 153 deletions

File tree

codespeed/domain.py

Lines changed: 1 addition & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import absolute_import
33

4-
import logging
5-
from datetime import datetime
6-
from django.core.exceptions import ValidationError
74
from django.conf import settings
85

9-
from codespeed.models import (Environment, Executable, Revision,
10-
Project, Branch, Benchmark,
6+
from codespeed.models import (Executable, Revision, Project, Branch, Benchmark,
117
Result, Report)
12-
from codespeed import commits
13-
14-
logger = logging.getLogger(__name__)
158

169

1710
def get_default_environment(enviros, data, multi=False):
@@ -155,140 +148,3 @@ def getcomparisonexes():
155148
all_executables[proj] = executables
156149
exekeys += executablekeys
157150
return all_executables, exekeys
158-
159-
160-
def validate_result(item):
161-
"""
162-
Validates that a result dictionary has all needed parameters
163-
164-
It returns a tuple
165-
Environment, False when no errors where found
166-
Errormessage, True when there is an error
167-
"""
168-
mandatory_data = [
169-
'commitid',
170-
'branch',
171-
'project',
172-
'executable',
173-
'benchmark',
174-
'environment',
175-
'result_value',
176-
]
177-
178-
error = True
179-
for key in mandatory_data:
180-
if key not in item:
181-
return 'Key "' + key + '" missing from request', error
182-
elif key in item and item[key] == "":
183-
return 'Value for key "' + key + '" empty in request', error
184-
185-
# Check that the Environment exists
186-
try:
187-
e = Environment.objects.get(name=item['environment'])
188-
error = False
189-
return e, error
190-
except Environment.DoesNotExist:
191-
return "Environment %(environment)s not found" % item, error
192-
193-
194-
def create_report_if_enough_data(rev, exe, e):
195-
"""Triggers Report creation when there are enough results"""
196-
last_revs = Revision.objects.filter(
197-
branch=rev.branch
198-
).order_by('-date')[:2]
199-
if len(last_revs) > 1:
200-
current_results = rev.results.filter(executable=exe, environment=e)
201-
last_results = last_revs[1].results.filter(
202-
executable=exe, environment=e)
203-
# If there is are at least as many results as in the last revision,
204-
# create new report
205-
if len(current_results) >= len(last_results):
206-
logger.debug("create_report_if_enough_data: About to create new report")
207-
report, created = Report.objects.get_or_create(
208-
executable=exe, environment=e, revision=rev
209-
)
210-
report.full_clean()
211-
report.save()
212-
logger.debug("create_report_if_enough_data: Created new report.")
213-
214-
215-
def save_result(data):
216-
res, error = validate_result(data)
217-
if error:
218-
return res, True
219-
else:
220-
assert(isinstance(res, Environment))
221-
env = res
222-
223-
p, created = Project.objects.get_or_create(name=data["project"])
224-
branch, created = Branch.objects.get_or_create(name=data["branch"],
225-
project=p)
226-
b, created = Benchmark.objects.get_or_create(name=data["benchmark"])
227-
228-
if created:
229-
if "description" in data:
230-
b.description = data["description"]
231-
if "units" in data:
232-
b.units = data["units"]
233-
if "units_title" in data:
234-
b.units_title = data["units_title"]
235-
if "lessisbetter" in data:
236-
b.lessisbetter = data["lessisbetter"]
237-
b.full_clean()
238-
b.save()
239-
240-
try:
241-
rev = branch.revisions.get(commitid=data['commitid'])
242-
except Revision.DoesNotExist:
243-
rev_date = data.get("revision_date")
244-
# "None" (as string) can happen when we urlencode the POST data
245-
if not rev_date or rev_date in ["", "None"]:
246-
rev_date = datetime.today()
247-
rev = Revision(branch=branch, project=p, commitid=data['commitid'],
248-
date=rev_date)
249-
try:
250-
rev.full_clean()
251-
except ValidationError as e:
252-
return str(e), True
253-
if p.repo_type not in ("N", ""):
254-
try:
255-
commit_logs = commits.get_logs(rev, rev, update=True)
256-
except RuntimeError as e:
257-
logger.warning("unable to save revision %s info: %s", rev, e,
258-
exc_info=True)
259-
else:
260-
if commit_logs:
261-
log = commit_logs[0]
262-
rev.author = log['author']
263-
rev.date = log['date']
264-
rev.message = log['message']
265-
266-
rev.save()
267-
268-
exe, created = Executable.objects.get_or_create(
269-
name=data['executable'],
270-
project=p
271-
)
272-
273-
try:
274-
r = Result.objects.get(
275-
revision=rev, executable=exe, benchmark=b, environment=env)
276-
except Result.DoesNotExist:
277-
r = Result(revision=rev, executable=exe, benchmark=b, environment=env)
278-
279-
r.value = data["result_value"]
280-
if 'result_date' in data:
281-
r.date = data["result_date"]
282-
elif rev.date:
283-
r.date = rev.date
284-
else:
285-
r.date = datetime.now()
286-
287-
r.std_dev = data.get('std_dev')
288-
r.val_min = data.get('min')
289-
r.val_max = data.get('max')
290-
291-
r.full_clean()
292-
r.save()
293-
294-
return (rev, exe, env), False

codespeed/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from django.db import models
1010
from django.conf import settings
1111

12-
from codespeed.github import GITHUB_URL_RE
12+
from .commits.github import GITHUB_URL_RE
1313

1414

1515
class Project(models.Model):
@@ -61,7 +61,7 @@ def working_copy(self):
6161

6262
def save(self, *args, **kwargs):
6363
"""Provide a default for commit browsing url in github repositories."""
64-
if not self.commit_browsing_url and self.repo_type == 'H':
64+
if not self.commit_browsing_url and self.repo_type == self.GITHUB:
6565
m = GITHUB_URL_RE.match(self.repo_path)
6666
if m:
6767
url = 'https://github.com/%s/%s/commit/{commitid}' % (

codespeed/results.py

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import absolute_import
3+
4+
import logging
5+
from datetime import datetime
6+
7+
from django.core.exceptions import ValidationError
8+
9+
from .models import (Environment, Project, Branch, Benchmark, Executable,
10+
Revision, Result, Report)
11+
from . import commits
12+
13+
logger = logging.getLogger(__name__)
14+
15+
16+
def validate_result(item):
17+
"""
18+
Validates that a result dictionary has all needed parameters
19+
20+
It returns a tuple
21+
Environment, False when no errors where found
22+
Errormessage, True when there is an error
23+
"""
24+
mandatory_data = [
25+
'commitid',
26+
'branch',
27+
'project',
28+
'executable',
29+
'benchmark',
30+
'environment',
31+
'result_value',
32+
]
33+
34+
error = True
35+
for key in mandatory_data:
36+
if key not in item:
37+
return 'Key "' + key + '" missing from request', error
38+
elif key in item and item[key] == "":
39+
return 'Value for key "' + key + '" empty in request', error
40+
41+
# Check that the Environment exists
42+
try:
43+
e = Environment.objects.get(name=item['environment'])
44+
error = False
45+
return e, error
46+
except Environment.DoesNotExist:
47+
return "Environment %(environment)s not found" % item, error
48+
49+
50+
def save_result(data):
51+
res, error = validate_result(data)
52+
if error:
53+
return res, True
54+
else:
55+
assert(isinstance(res, Environment))
56+
env = res
57+
58+
p, created = Project.objects.get_or_create(name=data["project"])
59+
branch, created = Branch.objects.get_or_create(name=data["branch"],
60+
project=p)
61+
b, created = Benchmark.objects.get_or_create(name=data["benchmark"])
62+
63+
if created:
64+
if "description" in data:
65+
b.description = data["description"]
66+
if "units" in data:
67+
b.units = data["units"]
68+
if "units_title" in data:
69+
b.units_title = data["units_title"]
70+
if "lessisbetter" in data:
71+
b.lessisbetter = data["lessisbetter"]
72+
b.full_clean()
73+
b.save()
74+
75+
try:
76+
rev = branch.revisions.get(commitid=data['commitid'])
77+
except Revision.DoesNotExist:
78+
rev_date = data.get("revision_date")
79+
# "None" (as string) can happen when we urlencode the POST data
80+
if not rev_date or rev_date in ["", "None"]:
81+
rev_date = datetime.today()
82+
rev = Revision(branch=branch, project=p, commitid=data['commitid'],
83+
date=rev_date)
84+
try:
85+
rev.full_clean()
86+
except ValidationError as e:
87+
return str(e), True
88+
if p.repo_type not in ("N", ""):
89+
try:
90+
commit_logs = commits.get_logs(rev, rev, update=True)
91+
except RuntimeError as e:
92+
logger.warning("unable to save revision %s info: %s", rev, e,
93+
exc_info=True)
94+
else:
95+
if commit_logs:
96+
log = commit_logs[0]
97+
rev.author = log['author']
98+
rev.date = log['date']
99+
rev.message = log['message']
100+
101+
rev.save()
102+
103+
exe, created = Executable.objects.get_or_create(
104+
name=data['executable'],
105+
project=p
106+
)
107+
108+
try:
109+
r = Result.objects.get(
110+
revision=rev, executable=exe, benchmark=b, environment=env)
111+
except Result.DoesNotExist:
112+
r = Result(revision=rev, executable=exe, benchmark=b, environment=env)
113+
114+
r.value = data["result_value"]
115+
if 'result_date' in data:
116+
r.date = data["result_date"]
117+
elif rev.date:
118+
r.date = rev.date
119+
else:
120+
r.date = datetime.now()
121+
122+
r.std_dev = data.get('std_dev')
123+
r.val_min = data.get('min')
124+
r.val_max = data.get('max')
125+
126+
r.full_clean()
127+
r.save()
128+
129+
return (rev, exe, env), False
130+
131+
132+
def create_report_if_enough_data(rev, exe, e):
133+
"""Triggers Report creation when there are enough results"""
134+
last_revs = Revision.objects.filter(
135+
branch=rev.branch
136+
).order_by('-date')[:2]
137+
if len(last_revs) > 1:
138+
current_results = rev.results.filter(executable=exe, environment=e)
139+
last_results = last_revs[1].results.filter(
140+
executable=exe, environment=e)
141+
# If there is are at least as many results as in the last revision,
142+
# create new report
143+
if len(current_results) >= len(last_results):
144+
logger.debug("create_report_if_enough_data: About to create new report")
145+
report, created = Report.objects.get_or_create(
146+
executable=exe, environment=e, revision=rev
147+
)
148+
report.full_clean()
149+
report.save()
150+
logger.debug("Created new report for branch %s and revision %s",
151+
rev.branch, rev.commitid)

codespeed/views.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
from django.template import RequestContext
1313
from django.conf import settings
1414

15-
from codespeed.models import (Environment, Report, Project, Revision, Result,
16-
Executable, Benchmark, Branch)
17-
from codespeed.domain import (get_default_environment, getbaselineexecutables,
18-
getdefaultexecutable, getcomparisonexes,
19-
save_result, create_report_if_enough_data)
20-
from codespeed import commits
15+
from .models import (Environment, Report, Project, Revision, Result,
16+
Executable, Benchmark, Branch)
17+
from .domain import (get_default_environment, getbaselineexecutables,
18+
getdefaultexecutable, getcomparisonexes)
19+
from .results import save_result, create_report_if_enough_data
20+
from . import commits
2121

2222
logger = logging.getLogger(__name__)
2323

0 commit comments

Comments
 (0)