Skip to content

Commit 78c16aa

Browse files
committed
models/version: Add features/featureList properties
1 parent 463d304 commit 78c16aa

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

app/models/version.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default class Version extends Model {
1313
@attr('date') created_at;
1414
@attr('date') updated_at;
1515
@attr downloads;
16+
@attr features;
1617
@attr yanked;
1718
@attr license;
1819
@attr crate_size;
@@ -28,6 +29,19 @@ export default class Version extends Model {
2829
})
2930
crateName;
3031

32+
get featureList() {
33+
let { features } = this;
34+
if (typeof features !== 'object' || features === null) {
35+
return [];
36+
}
37+
38+
let defaultFeatures = features.default ?? [];
39+
return Object.keys(features)
40+
.filter(name => name !== 'default')
41+
.sort()
42+
.map(name => ({ name, isDefault: defaultFeatures.includes(name), dependencies: features[name] }));
43+
}
44+
3145
@alias('loadAuthorsTask.last.value') authorNames;
3246

3347
@(task(function* () {

tests/models/version-test.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { setupTest } from 'ember-qunit';
2+
import { module, test } from 'qunit';
3+
4+
import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
5+
6+
module('Model | Version', function (hooks) {
7+
setupTest(hooks);
8+
setupMirage(hooks);
9+
10+
hooks.beforeEach(function () {
11+
this.store = this.owner.lookup('service:store');
12+
});
13+
14+
module('featuresList', function () {
15+
async function prepare(context, { features }) {
16+
let { server, store } = context;
17+
18+
let crate = server.create('crate');
19+
server.create('version', { crate, features });
20+
21+
let crateRecord = await store.findRecord('crate', crate.id);
22+
let versions = (await crateRecord.versions).toArray();
23+
return versions[0];
24+
}
25+
26+
test('`features: {}` results in empty list', async function (assert) {
27+
let version = await prepare(this, { features: {} });
28+
assert.deepEqual(version.featureList, []);
29+
});
30+
31+
test('`features: null` results in empty list', async function (assert) {
32+
let version = await prepare(this, { features: null });
33+
assert.deepEqual(version.featureList, []);
34+
});
35+
36+
test('real world case', async function (assert) {
37+
let features = {
38+
alloc: ['rand_core/alloc'],
39+
default: ['std', 'std_rng'],
40+
getrandom: ['rand_core/getrandom'],
41+
nightly: [],
42+
serde1: ['serde'],
43+
simd_support: ['packed_simd'],
44+
small_rng: [],
45+
std: ['rand_core/std', 'rand_chacha/std', 'alloc', 'getrandom', 'libc'],
46+
std_rng: ['rand_chacha', 'rand_hc'],
47+
};
48+
49+
let version = await prepare(this, { features });
50+
assert.deepEqual(version.featureList, [
51+
{
52+
dependencies: ['rand_core/alloc'],
53+
isDefault: false,
54+
name: 'alloc',
55+
},
56+
{
57+
dependencies: ['rand_core/getrandom'],
58+
isDefault: false,
59+
name: 'getrandom',
60+
},
61+
{
62+
dependencies: [],
63+
isDefault: false,
64+
name: 'nightly',
65+
},
66+
{
67+
dependencies: ['serde'],
68+
isDefault: false,
69+
name: 'serde1',
70+
},
71+
{
72+
dependencies: ['packed_simd'],
73+
isDefault: false,
74+
name: 'simd_support',
75+
},
76+
{
77+
dependencies: [],
78+
isDefault: false,
79+
name: 'small_rng',
80+
},
81+
{
82+
dependencies: ['rand_core/std', 'rand_chacha/std', 'alloc', 'getrandom', 'libc'],
83+
isDefault: true,
84+
name: 'std',
85+
},
86+
{
87+
dependencies: ['rand_chacha', 'rand_hc'],
88+
isDefault: true,
89+
name: 'std_rng',
90+
},
91+
]);
92+
});
93+
});
94+
});

0 commit comments

Comments
 (0)