Skip to content

Commit a96c5f8

Browse files
committed
Move view helper functions to domain module
1 parent cbaac72 commit a96c5f8

5 files changed

Lines changed: 158 additions & 141 deletions

File tree

codespeed/domain.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# -*- coding: utf-8 -*-
2+
import logging
3+
4+
from django.conf import settings
5+
from codespeed.models import Executable, Revision
6+
7+
logger = logging.getLogger(__name__)
8+
9+
10+
def get_default_environment(enviros, data, multi=False):
11+
"""Returns the default environment. Preference level is:
12+
* Present in URL parameters (permalinks)
13+
* Value in settings.py
14+
* First Environment ID
15+
16+
"""
17+
defaultenviros = []
18+
# Use permalink values
19+
if 'env' in data:
20+
for env_value in data['env'].split(","):
21+
for env in enviros:
22+
try:
23+
env_id = int(env_value)
24+
except ValueError:
25+
# Not an int
26+
continue
27+
for env in enviros:
28+
if env_id == env.id:
29+
defaultenviros.append(env)
30+
if not multi:
31+
break
32+
# Use settings.py value
33+
if not defaultenviros and not multi:
34+
if (hasattr(settings, 'DEF_ENVIRONMENT') and
35+
settings.DEF_ENVIRONMENT is not None):
36+
for env in enviros:
37+
if settings.DEF_ENVIRONMENT == env.name:
38+
defaultenviros.append(env)
39+
break
40+
# Last fallback
41+
if not defaultenviros:
42+
defaultenviros = enviros
43+
if multi:
44+
return defaultenviros
45+
else:
46+
return defaultenviros[0]
47+
48+
49+
def getbaselineexecutables():
50+
baseline = [{
51+
'key': "none",
52+
'name': "None",
53+
'executable': "none",
54+
'revision': "none",
55+
}]
56+
executables = Executable.objects.select_related('project')
57+
revs = Revision.objects.exclude(tag="").select_related('branch__project')
58+
maxlen = 22
59+
for rev in revs:
60+
# Add executables that correspond to each tagged revision.
61+
for exe in [e for e in executables if e.project == rev.branch.project]:
62+
exestring = str(exe)
63+
if len(exestring) > maxlen:
64+
exestring = str(exe)[0:maxlen] + "..."
65+
name = exestring + " " + rev.tag
66+
key = str(exe.id) + "+" + str(rev.id)
67+
baseline.append({
68+
'key': key,
69+
'executable': exe,
70+
'revision': rev,
71+
'name': name,
72+
})
73+
# move default to first place
74+
if hasattr(settings, 'DEF_BASELINE') and settings.DEF_BASELINE is not None:
75+
try:
76+
exename = settings.DEF_BASELINE['executable']
77+
commitid = settings.DEF_BASELINE['revision']
78+
for base in baseline:
79+
if base['key'] == "none":
80+
continue
81+
if (base['executable'].name == exename and
82+
base['revision'].commitid == commitid):
83+
baseline.remove(base)
84+
baseline.insert(1, base)
85+
break
86+
except KeyError:
87+
# TODO: write to server logs
88+
# error in settings.DEF_BASELINE
89+
pass
90+
return baseline
91+
92+
93+
def getdefaultexecutable():
94+
default = None
95+
if (hasattr(settings, 'DEF_EXECUTABLE') and
96+
settings.DEF_EXECUTABLE is not None):
97+
try:
98+
default = Executable.objects.get(name=settings.DEF_EXECUTABLE)
99+
except Executable.DoesNotExist:
100+
pass
101+
if default is None:
102+
execquery = Executable.objects.filter(project__track=True)
103+
if len(execquery):
104+
default = execquery[0]
105+
106+
return default

codespeed/tests/test_domain.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# -*- coding: utf-8 -*-
2+
from django.test import TestCase
3+
4+
from codespeed.models import Project, Executable, Branch, Revision
5+
from codespeed.views import getbaselineexecutables
6+
7+
8+
class TestGetBaselineExecutables(TestCase):
9+
"""Test helper functions in codespeed.views"""
10+
11+
def setUp(self):
12+
self.project = Project.objects.create(name='Test')
13+
self.executable = Executable.objects.create(
14+
name='TestExecutable', project=self.project)
15+
self.branch = Branch.objects.create(name='master',
16+
project=self.project)
17+
18+
def test_get_baseline_executables(self):
19+
# No revisions, no baseline
20+
result = getbaselineexecutables()
21+
self.assertEqual(len(result), 1)
22+
self.assertEqual(result[0]['executable'], 'none')
23+
24+
# Check that a tagged revision will be included as baseline
25+
revision1 = Revision.objects.create(commitid='1', tag='0.1',
26+
branch=self.branch)
27+
result = getbaselineexecutables()
28+
self.assertEqual(len(result), 2)
29+
self.assertEqual(result[0]['executable'], 'none')
30+
self.assertEqual(result[1]['executable'], self.executable)
31+
self.assertEqual(result[1]['revision'], revision1)
32+
33+
Revision.objects.create(commitid='2', tag='0.2', branch=self.branch)
34+
result = getbaselineexecutables()
35+
self.assertEqual(len(result), 3)
36+
37+
# An untagged revision will not be available as baseline
38+
Revision.objects.create(commitid='3', branch=self.branch)
39+
result = getbaselineexecutables()
40+
self.assertEqual(len(result), 3)

codespeed/tests/test_models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
import os
23

34
from django.conf import settings

codespeed/tests/test_views.py

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
from codespeed.models import (Project, Benchmark, Revision, Branch, Executable,
1010
Environment, Result, Report)
11-
from codespeed.views import getbaselineexecutables
1211

1312

1413
class TestAddResult(TestCase):
@@ -362,7 +361,8 @@ def setUp(self):
362361
'environment': 'Dual Core',
363362
'result_value': 200,
364363
}
365-
resp = self.client.post(reverse('codespeed.views.add_result'), self.data)
364+
resp = self.client.post(reverse('codespeed.views.add_result'),
365+
self.data)
366366
self.assertEqual(resp.status_code, 202)
367367
self.data['commitid'] = "abcd2"
368368
self.data['result_value'] = 150
@@ -381,36 +381,3 @@ def test_reports_post_returns_405(self):
381381
response = self.client.post(reverse('codespeed.views.reports'), {})
382382

383383
self.assertEqual(response.status_code, 405)
384-
385-
386-
class TestViewHelpers(TestCase):
387-
"""Test helper functions in codespeed.views"""
388-
389-
def setUp(self):
390-
self.project = Project.objects.create(name='Test')
391-
self.executable = Executable.objects.create(
392-
name='TestExecutable', project=self.project)
393-
self.branch = Branch.objects.create(name='master', project=self.project)
394-
395-
def test_get_baseline_executables(self):
396-
# No revisions, no baseline
397-
result = getbaselineexecutables()
398-
self.assertEqual(len(result), 1)
399-
self.assertEqual(result[0]['executable'], 'none')
400-
401-
# Check that a tagged revision will be included as baseline
402-
revision1 = Revision.objects.create(commitid='1', tag='0.1', branch=self.branch)
403-
result = getbaselineexecutables()
404-
self.assertEqual(len(result), 2)
405-
self.assertEqual(result[0]['executable'], 'none')
406-
self.assertEqual(result[1]['executable'], self.executable)
407-
self.assertEqual(result[1]['revision'], revision1)
408-
409-
revision2 = Revision.objects.create(commitid='2', tag='0.2', branch=self.branch)
410-
result = getbaselineexecutables()
411-
self.assertEqual(len(result), 3)
412-
413-
# An untagged revision will not be available as baseline
414-
Revision.objects.create(commitid='3', branch=self.branch)
415-
result = getbaselineexecutables()
416-
self.assertEqual(len(result), 3)

codespeed/views.py

Lines changed: 9 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515

1616
from codespeed.models import (Environment, Report, Project, Revision, Result,
1717
Executable, Benchmark, Branch)
18-
18+
from codespeed.domain import (get_default_environment, getbaselineexecutables,
19+
getdefaultexecutable)
1920

2021
logger = logging.getLogger(__name__)
2122

@@ -51,104 +52,6 @@ def no_data_found(request):
5152
}, context_instance=RequestContext(request))
5253

5354

54-
def getbaselineexecutables():
55-
baseline = [{
56-
'key': "none",
57-
'name': "None",
58-
'executable': "none",
59-
'revision': "none",
60-
}]
61-
executables = Executable.objects.select_related('project')
62-
revs = Revision.objects.exclude(tag="").select_related('branch__project')
63-
maxlen = 22
64-
for rev in revs:
65-
# Add executables that correspond to each tagged revision.
66-
for exe in [e for e in executables if e.project == rev.branch.project]:
67-
exestring = str(exe)
68-
if len(exestring) > maxlen:
69-
exestring = str(exe)[0:maxlen] + "..."
70-
name = exestring + " " + rev.tag
71-
key = str(exe.id) + "+" + str(rev.id)
72-
baseline.append({
73-
'key': key,
74-
'executable': exe,
75-
'revision': rev,
76-
'name': name,
77-
})
78-
# move default to first place
79-
if hasattr(settings, 'DEF_BASELINE') and settings.DEF_BASELINE is not None:
80-
try:
81-
exename = settings.DEF_BASELINE['executable']
82-
commitid = settings.DEF_BASELINE['revision']
83-
for base in baseline:
84-
if base['key'] == "none":
85-
continue
86-
if (base['executable'].name == exename and
87-
base['revision'].commitid == commitid):
88-
baseline.remove(base)
89-
baseline.insert(1, base)
90-
break
91-
except KeyError:
92-
# TODO: write to server logs
93-
#error in settings.DEF_BASELINE
94-
pass
95-
return baseline
96-
97-
98-
def get_default_environment(enviros, data, multi=False):
99-
"""Returns the default environment. Preference level is:
100-
* Present in URL parameters (permalinks)
101-
* Value in settings.py
102-
* First Environment ID
103-
104-
"""
105-
defaultenviros = []
106-
# Use permalink values
107-
if 'env' in data:
108-
for env_value in data['env'].split(","):
109-
for env in enviros:
110-
try:
111-
env_id = int(env_value)
112-
except ValueError:
113-
# Not an int
114-
continue
115-
for env in enviros:
116-
if env_id == env.id:
117-
defaultenviros.append(env)
118-
if not multi:
119-
break
120-
# Use settings.py value
121-
if not defaultenviros and not multi:
122-
if (hasattr(settings, 'DEF_ENVIRONMENT') and
123-
settings.DEF_ENVIRONMENT is not None):
124-
for env in enviros:
125-
if settings.DEF_ENVIRONMENT == env.name:
126-
defaultenviros.append(env)
127-
break
128-
# Last fallback
129-
if not defaultenviros:
130-
defaultenviros = enviros
131-
if multi:
132-
return defaultenviros
133-
else:
134-
return defaultenviros[0]
135-
136-
137-
def getdefaultexecutable():
138-
default = None
139-
if hasattr(settings, 'DEF_EXECUTABLE') and settings.DEF_EXECUTABLE is not None:
140-
try:
141-
default = Executable.objects.get(name=settings.DEF_EXECUTABLE)
142-
except Executable.DoesNotExist:
143-
pass
144-
if default is None:
145-
execquery = Executable.objects.filter(project__track=True)
146-
if len(execquery):
147-
default = execquery[0]
148-
149-
return default
150-
151-
15255
def getcomparisonexes():
15356
all_executables = {}
15457
exekeys = []
@@ -689,7 +592,7 @@ def changes(request):
689592
selectedrevision = Revision.objects.get(
690593
commitid__startswith=commitid, branch=branch
691594
)
692-
if not selectedrevision in revisionlists[selectedrevision.project.name]:
595+
if selectedrevision not in revisionlists[selectedrevision.project.name]:
693596
revisionlists[selectedrevision.project.name].append(selectedrevision)
694597
except Revision.DoesNotExist:
695598
selectedrevision = lastrevisions[0]
@@ -735,11 +638,11 @@ def reports(request):
735638
context['significant_reports'] = \
736639
Report.objects.filter(
737640
revision__branch__name=settings.DEF_BRANCH,
738-
colorcode__in = ('red','green')
641+
colorcode__in=('red', 'green')
739642
).order_by('-revision__date')[:10]
740643

741-
return render_to_response('codespeed/reports.html',
742-
context, context_instance=RequestContext(request))
644+
return render_to_response('codespeed/reports.html', context,
645+
context_instance=RequestContext(request))
743646

744647

745648
@require_GET
@@ -780,7 +683,7 @@ def displaylogs(request):
780683
rev, e, exc_info=True)
781684
error = repr(e)
782685

783-
# add commit browsing url to logs
686+
# Add commit browsing url to logs
784687
project = rev.branch.project
785688
for log in logs:
786689
log['commit_browse_url'] = project.commit_browsing_url.format(**log)
@@ -851,7 +754,7 @@ def validate_result(item):
851754

852755
error = True
853756
for key in mandatory_data:
854-
if not key in item:
757+
if key not in item:
855758
return 'Key "' + key + '" missing from request', error
856759
elif key in item and item[key] == "":
857760
return 'Value for key "' + key + '" empty in request', error
@@ -995,7 +898,7 @@ def add_json_results(request):
995898
if error:
996899
logger.debug(
997900
"add_json_results: could not save item %d because %s" % (
998-
i, response))
901+
i, response))
999902
return HttpResponseBadRequest(response)
1000903
else:
1001904
unique_reports.add(response)

0 commit comments

Comments
 (0)