Skip to content

Commit 2bed55f

Browse files
committed
crate.version: Move downloadData() property to DownloadGraph component
1 parent 97354aa commit 2bed55f

File tree

4 files changed

+93
-66
lines changed

4 files changed

+93
-66
lines changed

app/components/download-graph.js

Lines changed: 58 additions & 1 deletion
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,7 +66,7 @@ export default class DownloadGraph extends Component {
6566
}
6667

6768
get data() {
68-
let [labels, ...rows] = this.args.data;
69+
let [labels, ...rows] = this.downloadData;
6970

7071
let datasets = labels
7172
.slice(1)
@@ -89,4 +90,60 @@ export default class DownloadGraph extends Component {
8990

9091
return { datasets };
9192
}
93+
94+
get downloadData() {
95+
let downloads = this.args.data;
96+
if (!downloads) {
97+
return;
98+
}
99+
100+
let extra = downloads.content?.meta?.extra_downloads ?? [];
101+
102+
let dates = {};
103+
let versions = new Set([]);
104+
105+
let now = new Date();
106+
for (let i = 0; i < 90; i++) {
107+
let date = subDays(now, i);
108+
dates[date.toISOString().slice(0, 10)] = { date, cnt: {} };
109+
}
110+
111+
downloads.forEach(d => {
112+
let version_num = d.version.num;
113+
114+
versions.add(version_num);
115+
116+
let key = d.date;
117+
if (dates[key]) {
118+
let prev = dates[key].cnt[version_num] || 0;
119+
dates[key].cnt[version_num] = prev + d.downloads;
120+
}
121+
});
122+
123+
extra.forEach(d => {
124+
let key = d.date;
125+
if (dates[key]) {
126+
let prev = dates[key].cnt['Other'] || 0;
127+
dates[key].cnt['Other'] = prev + d.downloads;
128+
}
129+
});
130+
131+
let versionsList = [...versions].sort();
132+
if (extra.length !== 0) {
133+
versionsList.unshift('Other');
134+
}
135+
136+
let headers = ['Date', ...versionsList];
137+
138+
let data = [headers];
139+
for (let date in dates) {
140+
let row = [dates[date].date];
141+
for (let version of versionsList) {
142+
row.push(dates[date].cnt[version] || 0);
143+
}
144+
data.push(row);
145+
}
146+
147+
return data;
148+
}
92149
}

app/controllers/crate/version.js

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { computed } from '@ember/object';
33
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

98
export default class CrateVersionController extends Controller {
@@ -24,63 +23,6 @@ export default class CrateVersionController extends Controller {
2423
return this.crate.owner_user.findBy('id', this.session.currentUser?.id);
2524
}
2625

27-
@computed('downloads')
28-
get downloadData() {
29-
let downloads = this.downloads;
30-
if (!downloads) {
31-
return;
32-
}
33-
34-
let extra = downloads.content?.meta?.extra_downloads ?? [];
35-
36-
let dates = {};
37-
let versions = new Set([]);
38-
39-
let now = new Date();
40-
for (let i = 0; i < 90; i++) {
41-
let date = subDays(now, i);
42-
dates[date.toISOString().slice(0, 10)] = { date, cnt: {} };
43-
}
44-
45-
downloads.forEach(d => {
46-
let version_num = d.version.num;
47-
48-
versions.add(version_num);
49-
50-
let key = d.date;
51-
if (dates[key]) {
52-
let prev = dates[key].cnt[version_num] || 0;
53-
dates[key].cnt[version_num] = prev + d.downloads;
54-
}
55-
});
56-
57-
extra.forEach(d => {
58-
let key = d.date;
59-
if (dates[key]) {
60-
let prev = dates[key].cnt['Other'] || 0;
61-
dates[key].cnt['Other'] = prev + d.downloads;
62-
}
63-
});
64-
65-
let versionsList = [...versions].sort();
66-
if (extra.length !== 0) {
67-
versionsList.unshift('Other');
68-
}
69-
70-
let headers = ['Date', ...versionsList];
71-
72-
let data = [headers];
73-
for (let date in dates) {
74-
let row = [dates[date].date];
75-
for (let version of versionsList) {
76-
row.push(dates[date].cnt[version] || 0);
77-
}
78-
data.push(row);
79-
}
80-
81-
return data;
82-
}
83-
8426
@alias('loadReadmeTask.last.value') readme;
8527

8628
@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)