Skip to content

Commit 5169b7f

Browse files
committed
Auto merge of #3234 - Turbo87:downloads-prop, r=locks
Move download data processing code into `DownloadGraph` component This code is only needed inside the `DownloadGraph` component, so that's where the code should live. This also gives us the opportunity to simplify the code a little bit, since the Chart.js library needs to data in a different layout than the previous implementation that was based on Google Charts. Visually the results should still be identical to the previous state though :) r? `@locks`
2 parents d245dd5 + b22de17 commit 5169b7f

File tree

4 files changed

+83
-87
lines changed

4 files changed

+83
-87
lines changed

app/components/download-graph.js

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { inject as service } from '@ember/service';
33
import { waitForPromise } from '@ember/test-waiters';
44
import Component from '@glimmer/component';
55

6+
import subDays from 'date-fns/subDays';
67
import window from 'ember-window-mock';
78

89
// Colors by http://colorbrewer2.org/#type=diverging&scheme=RdBu&n=10
@@ -65,10 +66,53 @@ export default class DownloadGraph extends Component {
6566
}
6667

6768
get data() {
68-
let [labels, ...rows] = this.args.data;
69+
let downloads = this.args.data;
70+
if (!downloads) {
71+
return { datasets: [] };
72+
}
73+
74+
let extra = downloads.content?.meta?.extra_downloads ?? [];
75+
76+
let dates = {};
77+
let versions = new Set([]);
78+
79+
let now = new Date();
80+
for (let i = 0; i < 90; i++) {
81+
let date = subDays(now, i);
82+
dates[date.toISOString().slice(0, 10)] = { date, cnt: {} };
83+
}
84+
85+
downloads.forEach(d => {
86+
let version_num = d.version.num;
87+
88+
versions.add(version_num);
89+
90+
let key = d.date;
91+
if (dates[key]) {
92+
let prev = dates[key].cnt[version_num] || 0;
93+
dates[key].cnt[version_num] = prev + d.downloads;
94+
}
95+
});
96+
97+
extra.forEach(d => {
98+
let key = d.date;
99+
if (dates[key]) {
100+
let prev = dates[key].cnt['Other'] || 0;
101+
dates[key].cnt['Other'] = prev + d.downloads;
102+
}
103+
});
104+
105+
let versionsList = [...versions].sort();
106+
if (extra.length !== 0) {
107+
versionsList.unshift('Other');
108+
}
109+
110+
let rows = Object.keys(dates).map(date => [
111+
dates[date].date,
112+
...versionsList.map(version => dates[date].cnt[version] || 0),
113+
]);
69114

70-
let datasets = labels
71-
.slice(1)
115+
let datasets = versionsList
72116
.map((label, index) => ({
73117
data: rows.map(row => ({ x: row[0], y: row[index + 1] })),
74118
label: label,

app/controllers/crate/version.js

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import Controller from '@ember/controller';
22
import { computed } from '@ember/object';
3-
import { alias, readOnly } from '@ember/object/computed';
3+
import { alias } from '@ember/object/computed';
44
import { inject as service } from '@ember/service';
55

6-
import subDays from 'date-fns/subDays';
76
import { task } from 'ember-concurrency';
87

9-
const NUM_VERSIONS = 5;
10-
118
export default class CrateVersionController extends Controller {
129
@service session;
1310

@@ -17,7 +14,6 @@ export default class CrateVersionController extends Controller {
1714
}
1815

1916
@alias('downloadsContext.version_downloads') downloads;
20-
@alias('downloads.content.meta.extra_downloads') extraDownloads;
2117
@alias('model.crate') crate;
2218
@alias('model.requestedVersion') requestedVersion;
2319
@alias('model.version') currentVersion;
@@ -27,78 +23,6 @@ export default class CrateVersionController extends Controller {
2723
return this.crate.owner_user.findBy('id', this.session.currentUser?.id);
2824
}
2925

30-
@readOnly('crate.versions') sortedVersions;
31-
32-
@computed('sortedVersions')
33-
get smallSortedVersions() {
34-
return this.sortedVersions.slice(0, NUM_VERSIONS);
35-
}
36-
37-
@computed('downloads', 'extraDownloads', 'requestedVersion')
38-
get downloadData() {
39-
let downloads = this.downloads;
40-
if (!downloads) {
41-
return;
42-
}
43-
44-
let extra = this.extraDownloads || [];
45-
46-
let dates = {};
47-
let versions = [];
48-
49-
let now = new Date();
50-
for (let i = 0; i < 90; i++) {
51-
let date = subDays(now, i);
52-
dates[date.toISOString().slice(0, 10)] = { date, cnt: {} };
53-
}
54-
55-
downloads.forEach(d => {
56-
let version_id = d.version.id;
57-
let key = d.date;
58-
if (dates[key]) {
59-
let prev = dates[key].cnt[version_id] || 0;
60-
dates[key].cnt[version_id] = prev + d.downloads;
61-
}
62-
});
63-
64-
extra.forEach(d => {
65-
let key = d.date;
66-
if (dates[key]) {
67-
let prev = dates[key].cnt[null] || 0;
68-
dates[key].cnt[null] = prev + d.downloads;
69-
}
70-
});
71-
if (this.requestedVersion) {
72-
versions.push(this.currentVersion.getProperties('id', 'num'));
73-
} else {
74-
this.smallSortedVersions.forEach(version => {
75-
versions.push(version.getProperties('id', 'num'));
76-
});
77-
}
78-
if (extra.length !== 0) {
79-
versions.push({
80-
id: null,
81-
num: 'Other',
82-
});
83-
}
84-
85-
let headers = ['Date'];
86-
versions.sort(b => b.num).reverse();
87-
for (let version of versions) {
88-
headers.push(version.num);
89-
}
90-
let data = [headers];
91-
for (let date in dates) {
92-
let row = [dates[date].date];
93-
for (let version of versions) {
94-
row.push(dates[date].cnt[version.id] || 0);
95-
}
96-
data.push(row);
97-
}
98-
99-
return data;
100-
}
101-
10226
@alias('loadReadmeTask.last.value') readme;
10327

10428
@task(function* () {

app/templates/crate/version.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
</div>
101101
<div local-class='graph'>
102102
<h4>Downloads over the last 90 days</h4>
103-
<DownloadGraph @data={{this.downloadData}} local-class="graph-data" />
103+
<DownloadGraph @data={{this.downloads}} local-class="graph-data" />
104104
</div>
105105
</div>
106106
{{/unless}}

tests/components/download-graph-test.js

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,39 @@ module('Component | DownloadGraph', function (hooks) {
7878
});
7979

8080
function exampleData() {
81-
return [
82-
['Date', 'Other', '1.0.52', '1.0.53', '1.0.54', '1.0.55', '1.0.56'],
83-
[new Date('2020-12-30'), 36745, 201, 2228, 4298, 3702, 30520],
84-
[new Date('2020-12-29'), 33242, 261, 1650, 4277, 4157, 31631],
85-
[new Date('2020-12-28'), 19981, 181, 968, 2786, 2414, 23616],
86-
[new Date('2020-12-27'), 19064, 186, 873, 2477, 15713, 3815],
81+
let downloads = [
82+
{ version: { num: '1.0.52' }, date: '2020-12-30', downloads: 201 },
83+
{ version: { num: '1.0.53' }, date: '2020-12-30', downloads: 2228 },
84+
{ version: { num: '1.0.54' }, date: '2020-12-30', downloads: 4298 },
85+
{ version: { num: '1.0.55' }, date: '2020-12-30', downloads: 3702 },
86+
{ version: { num: '1.0.56' }, date: '2020-12-30', downloads: 30520 },
87+
{ version: { num: '1.0.52' }, date: '2020-12-29', downloads: 261 },
88+
{ version: { num: '1.0.53' }, date: '2020-12-29', downloads: 1650 },
89+
{ version: { num: '1.0.54' }, date: '2020-12-29', downloads: 4277 },
90+
{ version: { num: '1.0.55' }, date: '2020-12-29', downloads: 4157 },
91+
{ version: { num: '1.0.56' }, date: '2020-12-29', downloads: 31631 },
92+
{ version: { num: '1.0.52' }, date: '2020-12-28', downloads: 181 },
93+
{ version: { num: '1.0.53' }, date: '2020-12-28', downloads: 968 },
94+
{ version: { num: '1.0.54' }, date: '2020-12-28', downloads: 2786 },
95+
{ version: { num: '1.0.55' }, date: '2020-12-28', downloads: 2414 },
96+
{ version: { num: '1.0.56' }, date: '2020-12-28', downloads: 23616 },
97+
{ version: { num: '1.0.52' }, date: '2020-12-27', downloads: 186 },
98+
{ version: { num: '1.0.53' }, date: '2020-12-27', downloads: 873 },
99+
{ version: { num: '1.0.54' }, date: '2020-12-27', downloads: 2477 },
100+
{ version: { num: '1.0.55' }, date: '2020-12-27', downloads: 15713 },
101+
{ version: { num: '1.0.56' }, date: '2020-12-27', downloads: 3815 },
87102
];
103+
104+
downloads.content = {
105+
meta: {
106+
extra_downloads: [
107+
{ date: '2020-12-30', downloads: 36745 },
108+
{ date: '2020-12-29', downloads: 33242 },
109+
{ date: '2020-12-28', downloads: 19981 },
110+
{ date: '2020-12-27', downloads: 19064 },
111+
],
112+
},
113+
};
114+
115+
return downloads;
88116
}

0 commit comments

Comments
 (0)