Skip to content

Commit 9538b22

Browse files
committed
models/crate: Load crate.versions explicitly with a task
A debugging assert is also included to inform missing `perform()` called before accessing getters. This fix the following deprecations: - The toArray method on ember-data's PromiseManyArray is deprecated. - The `toArray` method on the class ManyArray is deprecated.
1 parent 42ca1c7 commit 9538b22

File tree

4 files changed

+41
-13
lines changed

4 files changed

+41
-13
lines changed

app/models/crate.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,34 @@ export default class Crate extends Model {
3737
@hasMany('dependency', { async: true, inverse: null }) reverse_dependencies;
3838

3939
@cached get versionIdsBySemver() {
40-
let versions = this.versions.toArray() ?? [];
41-
return versions.sort(compareVersionBySemver).map(v => v.id);
40+
let { last } = this.loadVersionsTask;
41+
assert('`loadVersionsTask.perform()` must be called before calling `versionIdsBySemver`', last != null);
42+
let versions = last?.value ?? [];
43+
return versions
44+
.slice()
45+
.sort(compareVersionBySemver)
46+
.map(v => v.id);
4247
}
4348

4449
@cached get versionIdsByDate() {
45-
let versions = this.versions.toArray() ?? [];
46-
return versions.sort(compareVersionByDate).map(v => v.id);
50+
let { last } = this.loadVersionsTask;
51+
assert('`loadVersionsTask.perform()` must be called before calling `versionIdsByDate`', last != null);
52+
let versions = last?.value ?? [];
53+
return versions
54+
.slice()
55+
.sort(compareVersionByDate)
56+
.map(v => v.id);
4757
}
4858

4959
@cached get firstVersionId() {
5060
return this.versionIdsByDate.at(-1);
5161
}
5262

5363
@cached get versionsObj() {
54-
let versions = this.versions.toArray() ?? [];
55-
return Object.fromEntries(versions.map(v => [v.id, v]));
64+
let { last } = this.loadVersionsTask;
65+
assert('`loadVersionsTask.perform()` must be called before calling `versionsObj`', last != null);
66+
let versions = last?.value ?? [];
67+
return Object.fromEntries(versions.slice().map(v => [v.id, v]));
5668
}
5769

5870
@cached get releaseTrackSet() {
@@ -117,6 +129,10 @@ export default class Crate extends Model {
117129
let [teams, users] = await Promise.all([this.owner_team, this.owner_user]);
118130
return [...(teams ?? []), ...(users ?? [])];
119131
});
132+
133+
loadVersionsTask = task(async () => {
134+
return (await this.versions) ?? [];
135+
});
120136
}
121137

122138
function compareVersionBySemver(a, b) {

app/routes/crate/versions.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Route from '@ember/routing/route';
2+
import { waitForPromise } from '@ember/test-waiters';
3+
4+
export default class VersionsRoute extends Route {
5+
setupController(controller) {
6+
super.setupController(...arguments);
7+
let crate = this.modelFor('crate');
8+
controller.set('crate', crate);
9+
// TODO: Add error handling
10+
waitForPromise(crate.loadVersionsTask.perform());
11+
}
12+
}

tests/components/version-list-row-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module('Component | VersionList::Row', function (hooks) {
1818

1919
let store = this.owner.lookup('service:store');
2020
let crateRecord = await store.findRecord('crate', crate.name);
21-
let versions = (await crateRecord.versions).slice();
21+
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
2222
await crateRecord.loadOwnerUserTask.perform();
2323
this.firstVersion = versions[0];
2424
this.secondVersion = versions[1];
@@ -39,7 +39,7 @@ module('Component | VersionList::Row', function (hooks) {
3939

4040
let store = this.owner.lookup('service:store');
4141
let crateRecord = await store.findRecord('crate', crate.name);
42-
this.version = (await crateRecord.versions).slice()[0];
42+
this.version = (await crateRecord.loadVersionsTask.perform()).slice()[0];
4343
await crateRecord.loadOwnerUserTask.perform();
4444

4545
await render(hbs`<VersionList::Row @version={{this.version}} />`);
@@ -73,7 +73,7 @@ module('Component | VersionList::Row', function (hooks) {
7373

7474
let store = this.owner.lookup('service:store');
7575
let crateRecord = await store.findRecord('crate', crate.name);
76-
let versions = (await crateRecord.versions).slice();
76+
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
7777
await crateRecord.loadOwnerUserTask.perform();
7878
this.firstVersion = versions[0];
7979
this.secondVersion = versions[1];

tests/models/version-test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ module('Model | Version', function (hooks) {
167167
}
168168

169169
let crateRecord = await this.store.findRecord('crate', crate.name);
170-
let versions = (await crateRecord.versions).slice();
170+
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
171171

172172
assert.deepEqual(
173173
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -198,7 +198,7 @@ module('Model | Version', function (hooks) {
198198
this.server.create('version', { crate, num: '0.4.2', yanked: true });
199199

200200
let crateRecord = await this.store.findRecord('crate', crate.name);
201-
let versions = (await crateRecord.versions).slice();
201+
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
202202

203203
assert.deepEqual(
204204
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -216,7 +216,7 @@ module('Model | Version', function (hooks) {
216216
this.server.create('version', { crate, num: '0.4.1' });
217217

218218
let crateRecord = await this.store.findRecord('crate', crate.name);
219-
let versions = (await crateRecord.versions).slice();
219+
let versions = (await crateRecord.loadVersionsTask.perform()).slice();
220220

221221
assert.deepEqual(
222222
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),
@@ -229,7 +229,7 @@ module('Model | Version', function (hooks) {
229229
this.server.create('version', { crate, num: '0.4.2' });
230230
this.server.create('version', { crate, num: '0.4.3', yanked: true });
231231
crateRecord = await this.store.findRecord('crate', crate.name, { reload: true });
232-
versions = (await crateRecord.versions).slice();
232+
versions = (await crateRecord.loadVersionsTask.perform()).slice();
233233

234234
assert.deepEqual(
235235
versions.map(it => ({ num: it.num, isHighestOfReleaseTrack: it.isHighestOfReleaseTrack })),

0 commit comments

Comments
 (0)