diff --git a/speedcenter/codespeed/feeds.py b/speedcenter/codespeed/feeds.py new file mode 100644 index 00000000..949ee4a2 --- /dev/null +++ b/speedcenter/codespeed/feeds.py @@ -0,0 +1,12 @@ +from django.contrib.syndication.feeds import Feed +from codespeed.models import Report +from codespeed import settings + + +class LatestEntries(Feed): + title = settings.website_name + link = "/changes/" + description = "Last benchmark runs" + + def items(self): + return Report.objects.order_by('-revision')[:10] diff --git a/speedcenter/codespeed/models.py b/speedcenter/codespeed/models.py index 7a407244..f6ab73a0 100644 --- a/speedcenter/codespeed/models.py +++ b/speedcenter/codespeed/models.py @@ -29,7 +29,7 @@ class Revision(models.Model): date = models.DateTimeField(null=True) message = models.TextField(blank=True) author = models.CharField(max_length=30, blank=True) - + def get_short_commitid(self): return self.commitid[:10] @@ -100,7 +100,7 @@ class Report(models.Model): revision = models.ForeignKey(Revision) environment = models.ForeignKey(Environment) executable = models.ForeignKey(Executable) - summary = models.CharField(max_length=30, default="none") + summary = models.CharField(max_length=30, blank=True) colorcode = models.CharField(max_length=10, default="none") _tablecache = models.TextField(blank=True) @@ -168,41 +168,43 @@ def save(self, *args, **kwargs): max_trend_ben = row['bench_name'] max_trend_color = color # Reinitialize - self.summary = "none" + self.summary = "" self.colorcode = "none" - - if abs(max_trend) > trend_threshold: + + # Save summary in order of priority + # Average change + if average_change_color != "none": #Substitute plus/minus with up/down - direction = max_trend >= 0 and "+" or "" - self.summary = "%s trend %s%.1f%%" % ( - max_trend_ben, direction, round(max_trend, 1)) - self.colorcode = max_trend_color - if abs(average_trend) > trend_threshold: - if average_trend_color == "red" or self.colorcode != "red": - #Substitute plus/minus with up/down - direction = average_trend >= 0 and "+" or "" - self.summary = "Average %s trend %s%.1f%%" % ( - average_trend_units.lower(), direction, round(average_trend, 1)) - self.colorcode = average_trend_color - if abs(max_change) > change_threshold: - if max_change_color == "red" or self.colorcode != "red": - #Substitute plus/minus with up/down - direction = max_change >= 0 and "+" or "" - self.summary = "%s %s%.1f%%" % ( - max_change_ben, direction, round(max_change, 1)) - self.colorcode = max_change_color - if abs(average_change) > change_threshold: - if average_change_color == "red" or self.colorcode != "red": - #Substitute plus/minus with up/down - direction = average_change >= 0 and "+" or "" - self.summary = "Average %s %s%.1f%%" % ( - average_change_units.lower(), - direction, - round(abs(average_change), 1)) - self.colorcode = average_change_color - if "trend" in self.summary and self.colorcode == "red": - # trend break is only a warning - self.colorcode = "yellow" + direction = average_change >= 0 and "+" or "-" + self.summary = "Average %s %s%.1f%%" % ( + average_change_units.lower(), + direction, + round(abs(average_change), 1)) + self.colorcode = average_change_color + # Single benchmark change + if max_change_color != "none" and self.colorcode != "red": + #Substitute plus/minus with up/down + direction = max_change >= 0 and "+" or "-" + self.summary = "%s %s%.1f%%" % ( + max_change_ben, direction, round(abs(max_change), 1)) + self.colorcode = max_change_color + + # Average trend + if average_trend_color != "none" and self.colorcode == "none": + #Substitute plus/minus with up/down + direction = average_trend >= 0 and "+" or "" + self.summary = "Average %s trend %s%.1f%%" % ( + average_trend_units.lower(), direction, round(average_trend, 1)) + self.colorcode = average_trend_color == "red"\ + and "yellow" or average_trend_color + # Single benchmark trend + if max_trend_color != "none" and self.colorcode != "red": + if self.colorcode == "none" or (self.colorcode == "green" and "trend" not in self.summary): + direction = max_trend >= 0 and "+" or "" + self.summary = "%s trend %s%.1f%%" % ( + max_trend_ben, direction, round(max_trend, 1)) + self.colorcode = max_trend_color == "red"\ + and "yellow" or max_trend_color super(Report, self).save(*args, **kwargs) @@ -375,6 +377,10 @@ def get_changes_table(self, trend_depth=10, force_save=False): self._save_tablecache(tablelist) return tablelist + def get_absolute_url(self): + return "/changes/?rev=%s&exe=%s&env=%s" % ( + self.revision.commitid, self.executable.id, self.environment.name) + def _save_tablecache(self, data): self._tablecache = json.dumps(data) diff --git a/speedcenter/codespeed/settings.py b/speedcenter/codespeed/settings.py index b947c38c..d14ca00b 100644 --- a/speedcenter/codespeed/settings.py +++ b/speedcenter/codespeed/settings.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- ## General default options ## +website_name = "MySpeedSite" + def_environment = None #Name of the environment which should be selected as default @@ -15,7 +17,7 @@ # Threshold that determines when a performance change # over a number of revisions is significant -trend_threshold = 4.0 +trend_threshold = 5.0 # Changes view options ## def_executable = None # Executable that should be chosen as default in the changes view diff --git a/speedcenter/codespeed/urls.py b/speedcenter/codespeed/urls.py index a72cedfd..3c12f648 100644 --- a/speedcenter/codespeed/urls.py +++ b/speedcenter/codespeed/urls.py @@ -1,10 +1,16 @@ - # -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- from django.conf.urls.defaults import * -from django.views.generic.simple import direct_to_template, redirect_to +from django.views.generic.simple import direct_to_template +from codespeed.feeds import LatestEntries + +feeds = { 'latest': LatestEntries } + urlpatterns = patterns('', (r'^$', direct_to_template, {'template': 'home.html'}), (r'^about/$', direct_to_template, {'template': 'about.html'}), + # RSS for reports + (r'^feeds/(?P.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}), ) urlpatterns += patterns('codespeed.views', diff --git a/speedcenter/codespeed/views.py b/speedcenter/codespeed/views.py index f5e5bdc7..0be09b70 100644 --- a/speedcenter/codespeed/views.py +++ b/speedcenter/codespeed/views.py @@ -580,7 +580,7 @@ def reports(request): if request.method != 'GET': return HttpResponseNotAllowed('GET') return render_to_response('codespeed/reports.html', { - 'reports': Report.objects.all().order_by('-revision')[:10], + 'reports': Report.objects.order_by('-revision')[:10], }) def displaylogs(request): diff --git a/speedcenter/media/css/main.css b/speedcenter/media/css/main.css index aa4edd36..53842f31 100644 --- a/speedcenter/media/css/main.css +++ b/speedcenter/media/css/main.css @@ -125,6 +125,8 @@ div#presentation div#comparison p { background: url(/media/images/comparison.png) no-repeat; } +div#presentation div#reports { margin-top: 0.8em; } + /* Navigation elements */ div#sidebar { width: 13.7em; @@ -275,6 +277,9 @@ table.tablesorter, table.info, table.revision, table.reports { border-width: 2px; }*/ table.reports caption { font-size: 110%; } +table.reports caption a { color: black; } +table.reports caption a img { + border: 0; vertical-align: middle; height: 14px; margin-bottom: 1px; } table.reports td { padding: 0.4em; } table.reports td span { opacity: 0.4; } @@ -327,11 +332,11 @@ table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSo table.tablesorter tbody td.text {text-align: left; width: 8.5em; } -table.tablesorter tbody tr td.status-red { background-color: #FF5640; } +table.tablesorter tbody tr td.status-red, td.status-red { background-color: #FF5640; } .reports tr.status-red td.summary { color: #FF5640; font-weight: bold; } -table.tablesorter tbody tr td.status-green { background-color: #9FD54D; } +table.tablesorter tbody tr td.status-green, td.status-green { background-color: #9FD54D; } tr.status-green td.summary { color: #9FD54D; font-weight: bold; } -table.tablesorter tbody tr td.status-yellow { background-color: #FFD843; } +table.tablesorter tbody tr td.status-yellow, td.status-yellow { background-color: #FFD843; } tr.status-yellow td.summary { color: #FFD843; font-weight: bold; } table.tablesorter tbody tr.highlight td, tr.highlight td { diff --git a/speedcenter/media/images/rss.png b/speedcenter/media/images/rss.png new file mode 100755 index 00000000..b3c949d2 Binary files /dev/null and b/speedcenter/media/images/rss.png differ diff --git a/speedcenter/templates/codespeed/reports.html b/speedcenter/templates/codespeed/reports.html index a2fb5574..9e4dcb47 100644 --- a/speedcenter/templates/codespeed/reports.html +++ b/speedcenter/templates/codespeed/reports.html @@ -1,10 +1,10 @@ {% if reports|length %} - + {% for report in reports %} - + {% endfor %}
Latest runsLatest runs
{{ report.revision }}{{ report.executable }}@{{ report.environment}}{% ifequal report.summary "none" %}no significant changes{% else %}{{ report.summary }}{% endifequal %}{% ifequal report.summary "" %}no significant changes{% else %}{{ report.summary }}{% endifequal %}
diff --git a/speedcenter/templates/feeds/latest_description.html b/speedcenter/templates/feeds/latest_description.html new file mode 100644 index 00000000..66f20dcf --- /dev/null +++ b/speedcenter/templates/feeds/latest_description.html @@ -0,0 +1,8 @@ +{% ifequal obj.colorcode "red" %}Performance regressed: {% else %} + {% ifequal obj.colorcode "green" %}Performance improved: {% else %} + {% ifequal obj.colorcode "yellow" %}Trend regressed: {% else %} + No significant changes. + {% endifequal %} + {% endifequal %} +{% endifequal %} +{{ obj.summary }} diff --git a/speedcenter/templates/feeds/latest_title.html b/speedcenter/templates/feeds/latest_title.html new file mode 100644 index 00000000..8c7d9af9 --- /dev/null +++ b/speedcenter/templates/feeds/latest_title.html @@ -0,0 +1 @@ +{{ obj.revision }} {{ obj.executable }}@{{ obj.environment}}