diff --git a/codespeed/results.py b/codespeed/results.py index 97e3e2ea..027f2ffd 100644 --- a/codespeed/results.py +++ b/codespeed/results.py @@ -32,6 +32,7 @@ def validate_result(item): 'benchmark', 'environment', 'result_value', + 'source', ] error = True @@ -41,7 +42,7 @@ def validate_result(item): elif key in item and item[key] == "": return 'Value for key "' + key + '" empty in request', error - if 'source' in item and item['source'] not in dict(Benchmark.S_TYPES): + if item['source'] not in dict(Benchmark.S_TYPES): return 'Invalid source "%s"' % item['source'], error try: @@ -73,9 +74,8 @@ def save_result(data, update_repo=True): p, created = Project.objects.get_or_create(name=data["project"]) branch, created = Branch.objects.get_or_create(name=data["branch"], project=p) - source = data.get("source", "legacy") b, created = Benchmark.objects.get_or_create( - name=data["benchmark"], source=source) + name=data["benchmark"], source=data["source"]) if created: if "description" in data: diff --git a/codespeed/tests/test_views.py b/codespeed/tests/test_views.py index 8f07a61f..3108d5f4 100644 --- a/codespeed/tests/test_views.py +++ b/codespeed/tests/test_views.py @@ -29,6 +29,7 @@ def setUp(self): 'benchmark': 'float', 'environment': 'Dual Core', 'result_value': 456, + 'source': 'legacy', } def test_add_correct_result(self): @@ -190,11 +191,13 @@ def test_source_set_on_new_benchmark(self): b = Benchmark.objects.get(name='newbench') self.assertEqual(b.source, 'pyperformance') - def test_source_defaults_to_legacy(self): - """A payload without a source creates a 'legacy' Benchmark""" - self.client.post(self.path, self.data) - b = Benchmark.objects.get(name='float') - self.assertEqual(b.source, 'legacy') + def test_missing_source_rejected(self): + """A payload without a source is rejected instead of defaulting""" + modified_data = copy.deepcopy(self.data) + del modified_data['source'] + response = self.client.post(self.path, modified_data) + self.assertEqual(response.status_code, 400) + self.assertFalse(Benchmark.objects.filter(name='float').exists()) def test_same_name_different_source_are_distinct(self): """The same name in a different suite is a separate Benchmark""" @@ -245,28 +248,32 @@ def setUp(self): 'executable': 'pypy-c', 'benchmark': 'Richards', 'environment': 'bigdog', - 'result_value': 456}, + 'result_value': 456, + 'source': 'legacy'}, {'commitid': '456', 'project': 'pypy', 'branch': 'default', 'executable': 'pypy-c', 'benchmark': 'Richards', 'environment': 'bigdog', - 'result_value': 457}, + 'result_value': 457, + 'source': 'legacy'}, {'commitid': '456', 'project': 'pypy', 'branch': 'default', 'executable': 'pypy-c', 'benchmark': 'Richards2', 'environment': 'bigdog', - 'result_value': 34}, + 'result_value': 34, + 'source': 'legacy'}, {'commitid': '789', 'project': 'pypy', 'branch': 'default', 'executable': 'pypy-c', 'benchmark': 'Richards', 'environment': 'bigdog', - 'result_value': 458}, + 'result_value': 458, + 'source': 'legacy'}, ] def test_get_returns_405(self): @@ -452,6 +459,7 @@ def setUp(self): 'benchmark': 'float', 'environment': 'Dual Core', 'result_value': 200, + 'source': 'legacy', } resp = self.client.post(reverse('add-result'), self.data) diff --git a/codespeed/views.py b/codespeed/views.py index 723f2e59..deb6d2b0 100644 --- a/codespeed/views.py +++ b/codespeed/views.py @@ -114,7 +114,9 @@ def embed_comparison(request): @require_GET def gethistoricaldata(request): - data = {'results': {}, 'benchmarks': []} + # 'labels' maps each key in tagged_revs (plus baseline and 'latest') to + # a two-line label [tag, project] for the x axis of the history chart. + data = {'results': {}, 'benchmarks': [], 'labels': {}} env = Environment.objects.all() if settings.DEF_ENVIRONMENT: env = env.get(name=settings.DEF_ENVIRONMENT) @@ -134,6 +136,7 @@ def gethistoricaldata(request): ) rev0 = rev[0] resname = '{} {}'.format(b['executable'], rev0.tag) + data['labels'][resname] = [rev0.tag, baseline_exe.project.name] baseline_results.append((resname, Result.objects.filter( executable=baseline_exe, revision=rev0, environment=env, benchmark__source='legacy'))) @@ -165,12 +168,14 @@ def gethistoricaldata(request): logger.info("no results for '%s' '%s' '%s'" % (str(_default_exe), str(rev), str(env))) continue default_results[rev.tag] = res + data['labels'][rev.tag] = [rev.tag, _default_exe.project.name] data['tagged_revs'] = [rev.tag for rev in all_taggedrevs if rev.tag in default_results] # Fetch data for latest results executable = settings.DEF_EXECUTABLES[0] def_name = executable['name'] def_project = Project.objects.get(name=executable['project']) default_exe = Executable.objects.get(name=def_name, project=def_project) + data['labels']['latest'] = ['latest', default_exe.project.name] default_branch = Branch.objects.get( name=default_exe.project.default_branch, project=default_exe.project) diff --git a/speed_pypy/settings.py b/speed_pypy/settings.py index 4d6a559f..722b9c0e 100644 --- a/speed_pypy/settings.py +++ b/speed_pypy/settings.py @@ -93,6 +93,7 @@ {'executable': 'cpython', 'revision': '3.11.15'}, ] DEF_EXECUTABLES = [ + {'name': 'pypy3.12-jit-64', 'project': 'PyPy3.12'}, {'name': 'pypy3.11-jit-64', 'project': 'PyPy3.11'}, ] DEF_ENVIRONMENT = 'benchmarker2' diff --git a/speed_pypy/templates/embed_comparison.html b/speed_pypy/templates/embed_comparison.html index 04f30028..5bd6c565 100644 --- a/speed_pypy/templates/embed_comparison.html +++ b/speed_pypy/templates/embed_comparison.html @@ -6,11 +6,13 @@
Plot 1: The above plot represents {{ default_exe.project }} ({{ default_exe }}) benchmark times normalized to {{ baseline }}. Smaller is better.
It depends greatly on the type of task being performed. The geometric average of all benchmarks is or times faster than {{ baseline }}
@@ -120,9 +120,11 @@