Skip to content

Commit 334bf6e

Browse files
mattipclaude
andcommitted
add a csv export option to the comparison page
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 872e78a commit 334bf6e

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

codespeed/static/js/comparison.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function updateBaselineDropdown() {
129129

130130
function loadData() {
131131
var conf = getConfiguration();
132-
if (!conf.exe || !conf.ben) { return; }
132+
if (!conf.exe || !conf.ben) { refreshContent(); return; }
133133
var cacheKey = conf.exe + "|" + conf.ben;
134134
if (dataCache[cacheKey]) {
135135
compdata = dataCache[cacheKey];
@@ -373,6 +373,49 @@ function init(defaults) {
373373
$("#permalink").click(function() {
374374
window.location = "?" + $.param(getConfiguration());
375375
});
376+
377+
$("#exportcsv").click(function(e) {
378+
e.preventDefault();
379+
if (!compdata) { return; }
380+
var conf = getConfiguration();
381+
var exes = conf.exe ? conf.exe.split(",").filter(Boolean) : [];
382+
var enviros = readCheckbox("input[name='environments']:checked").split(",").filter(Boolean);
383+
var benchmarks = conf.ben ? conf.ben.split(",").filter(Boolean) : [];
384+
385+
// Header row: benchmark, then one column per exe@env
386+
var header = ["benchmark"];
387+
for (var i = 0; i < exes.length; i++) {
388+
for (var j = 0; j < enviros.length; j++) {
389+
var exeLabel = $("label[for='exe_" + exes[i] + "']").text().trim();
390+
var envLabel = $("label[for='env_" + enviros[j] + "']").text().trim();
391+
header.push(enviros.length > 1 ? exeLabel + "@" + envLabel : exeLabel);
392+
}
393+
}
394+
395+
var rows = [header];
396+
for (var b = 0; b < benchmarks.length; b++) {
397+
var benchLabel = $("label[for='benchmark_" + benchmarks[b] + "']").text().trim();
398+
var row = [benchLabel];
399+
for (var i = 0; i < exes.length; i++) {
400+
for (var j = 0; j < enviros.length; j++) {
401+
var val = compdata[exes[i]] && compdata[exes[i]][enviros[j]]
402+
? compdata[exes[i]][enviros[j]][benchmarks[b]]
403+
: "";
404+
row.push(val === null || val === undefined ? "" : val);
405+
}
406+
}
407+
rows.push(row);
408+
}
409+
410+
var csv = rows.map(function(r) { return r.join(","); }).join("\n");
411+
var blob = new Blob([csv], {type: "text/csv"});
412+
var url = URL.createObjectURL(blob);
413+
var a = document.createElement("a");
414+
a.href = url;
415+
a.download = "comparison.csv";
416+
a.click();
417+
URL.revokeObjectURL(url);
418+
});
376419
}
377420

378421
return {

codespeed/templates/codespeed/comparison.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
<input id="direction" type="checkbox" name="direction" value="horizontal"/>
7979
</span>
8080
<a id="permalink" href="#">Permalink</a>
81+
<a id="exportcsv" href="#">Export CSV</a>
8182
</div>
8283
<div id="content" class="clearfix">
8384
<div id="plotwrapper"></div>

0 commit comments

Comments
 (0)