Skip to content

Commit 447113c

Browse files
committed
mirage/version: Replace crate property with relationship
1 parent 672a1e1 commit 447113c

File tree

9 files changed

+83
-76
lines changed

9 files changed

+83
-76
lines changed

mirage/factories/version.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ export default Factory.extend({
1111
yanked: false,
1212
license: i => LICENSES[i % LICENSES.length],
1313

14-
dl_path() {
15-
return `/api/v1/crates/${this.crate}/${this.num}/download`;
16-
},
17-
1814
downloads: i => (((i + 13) * 42) % 13) * 1234,
1915

2016
features: () => {},
@@ -23,7 +19,11 @@ export default Factory.extend({
2319
crate_size: i => (((i + 13) * 42) % 13) * 54321,
2420

2521
afterCreate(version, server) {
26-
let crate = server.schema.crates.find(version.crate);
22+
if (!version.crateId) {
23+
throw new Error(`Missing \`crate\` relationship on \`version:${version.num}\``);
24+
}
25+
26+
let crate = server.schema.crates.find(version.crateId);
2727
crate.update({ versions: crate.versions.concat(parseInt(version.id, 10)) });
2828
},
2929
});

mirage/fixtures/crates.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,11 +370,11 @@ export default [
370370
downloads: 109,
371371
recent_downloads: 0,
372372
homepage: 'https://github.com/nicolas-cherel/rustlex',
373-
id: 'nc_rustlex',
373+
id: 'unicorn-rpc',
374374
keywords: ['lexer', 'lexical', 'analyser', 'generator'],
375375
max_version: '0.3.1',
376376
newest_version: '0.3.1',
377-
name: 'nc_rustlex',
377+
name: 'unicorn-rpc',
378378
repository: 'https://github.com/nicolas-cherel/rustlex',
379379
updated_at: '2015-08-25T19:15:35Z',
380380
versions: null,

mirage/fixtures/versions.js

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
export default [
22
{
3-
crate: 'nanomsg',
3+
crateId: 'nanomsg',
44
created_at: '2016-12-20T07:30:00Z',
5-
dl_path: '/api/v1/crates/nanomsg/0.7.0-alpha.1/download',
65
downloads: 260,
76
features: {
87
bundled: ['nanomsg-sys/bundled'],
@@ -25,9 +24,8 @@ export default [
2524
],
2625
},
2726
{
28-
crate: 'nanomsg',
27+
crateId: 'nanomsg',
2928
created_at: '2016-12-27T08:40:00Z',
30-
dl_path: '/api/v1/crates/nanomsg/0.6.1/download',
3129
downloads: 260,
3230
features: {
3331
bundled: ['nanomsg-sys/bundled'],
@@ -50,9 +48,8 @@ export default [
5048
],
5149
},
5250
{
53-
crate: 'nanomsg',
51+
crateId: 'nanomsg',
5452
created_at: '2016-06-10T20:03:55Z',
55-
dl_path: '/api/v1/crates/nanomsg/0.6.0/download',
5653
downloads: 904,
5754
features: {},
5855
id: 28431,
@@ -72,9 +69,8 @@ export default [
7269
],
7370
},
7471
{
75-
crate: 'nanomsg',
72+
crateId: 'nanomsg',
7673
created_at: '2016-01-24T22:07:58Z',
77-
dl_path: '/api/v1/crates/nanomsg/0.5.0/download',
7874
downloads: 1217,
7975
features: {},
8076
id: 21273,
@@ -94,9 +90,8 @@ export default [
9490
],
9591
},
9692
{
97-
crate: 'nanomsg',
93+
crateId: 'nanomsg',
9894
created_at: '2015-11-23T12:10:09Z',
99-
dl_path: '/api/v1/crates/nanomsg/0.4.2/download',
10095
downloads: 318,
10196
features: {},
10297
id: 18445,
@@ -116,9 +111,8 @@ export default [
116111
],
117112
},
118113
{
119-
crate: 'nanomsg',
114+
crateId: 'nanomsg',
120115
created_at: '2015-10-29T22:13:45Z',
121-
dl_path: '/api/v1/crates/nanomsg/0.4.1/download',
122116
downloads: 168,
123117
features: {},
124118
id: 17384,
@@ -138,9 +132,8 @@ export default [
138132
],
139133
},
140134
{
141-
crate: 'nanomsg',
135+
crateId: 'nanomsg',
142136
created_at: '2015-07-23T05:54:44Z',
143-
dl_path: '/api/v1/crates/nanomsg/0.4.0/download',
144137
downloads: 311,
145138
features: {},
146139
id: 13574,
@@ -160,9 +153,8 @@ export default [
160153
],
161154
},
162155
{
163-
crate: 'nanomsg',
156+
crateId: 'nanomsg',
164157
created_at: '2015-04-18T20:45:03Z',
165-
dl_path: '/api/v1/crates/nanomsg/0.3.4/download',
166158
downloads: 237,
167159
features: {},
168160
id: 9014,
@@ -182,9 +174,8 @@ export default [
182174
],
183175
},
184176
{
185-
crate: 'nanomsg',
177+
crateId: 'nanomsg',
186178
created_at: '2015-04-06T18:57:47Z',
187-
dl_path: '/api/v1/crates/nanomsg/0.3.3/download',
188179
downloads: 99,
189180
features: {},
190181
id: 8236,
@@ -204,9 +195,8 @@ export default [
204195
],
205196
},
206197
{
207-
crate: 'nanomsg',
198+
crateId: 'nanomsg',
208199
created_at: '2015-03-26T06:51:10Z',
209-
dl_path: '/api/v1/crates/nanomsg/0.3.2/download',
210200
downloads: 98,
211201
features: {},
212202
id: 7190,
@@ -226,9 +216,8 @@ export default [
226216
],
227217
},
228218
{
229-
crate: 'nanomsg',
219+
crateId: 'nanomsg',
230220
created_at: '2015-02-12T20:20:32Z',
231-
dl_path: '/api/v1/crates/nanomsg/0.3.1/download',
232221
downloads: 95,
233222
features: {},
234223
id: 4944,
@@ -248,9 +237,8 @@ export default [
248237
],
249238
},
250239
{
251-
crate: 'nanomsg',
240+
crateId: 'nanomsg',
252241
created_at: '2014-12-08T16:21:01Z',
253-
dl_path: '/api/v1/crates/nanomsg/0.3.0/download',
254242
downloads: 102,
255243
features: {},
256244
id: 940,
@@ -270,9 +258,8 @@ export default [
270258
],
271259
},
272260
{
273-
crate: 'nanomsg',
261+
crateId: 'nanomsg',
274262
created_at: '2014-12-08T02:08:06Z',
275-
dl_path: '/api/v1/crates/nanomsg/0.2.0/download',
276263
downloads: 79,
277264
features: {},
278265
id: 924,
@@ -292,9 +279,8 @@ export default [
292279
],
293280
},
294281
{
295-
crate: 'unicorn-rpc',
282+
crateId: 'unicorn-rpc',
296283
created_at: '2014-12-08T02:08:06Z',
297-
dl_path: '/api/v1/crates/unicorn-rpc/0.2.0/download',
298284
downloads: 79,
299285
features: {},
300286
id: 28674,

mirage/models/version.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
import { Model } from 'ember-cli-mirage';
1+
import { Model, belongsTo } from 'ember-cli-mirage';
22

3-
export default Model.extend({});
3+
export default Model.extend({
4+
crate: belongsTo(),
5+
});

mirage/route-handlers/crates.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export function register(server) {
6161
let crate = schema.crates.find(crateId);
6262
if (!crate) return notFound();
6363

64-
return schema.versions.where({ crate: crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at));
64+
return schema.versions.where({ crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at));
6565
});
6666

6767
server.get('/api/v1/crates/:crate_id/:version_num/authors', (schema, request) => {
@@ -70,7 +70,7 @@ export function register(server) {
7070
if (!crate) return notFound();
7171

7272
let num = request.params.version_num;
73-
let version = schema.versions.findBy({ crate: crateId, num });
73+
let version = schema.versions.findBy({ crateId, num });
7474
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
7575

7676
return { meta: { names: version._authors }, users: [] };
@@ -82,7 +82,7 @@ export function register(server) {
8282
if (!crate) return notFound();
8383

8484
let num = request.params.version_num;
85-
let version = schema.versions.findBy({ crate: crateId, num });
85+
let version = schema.versions.findBy({ crateId, num });
8686
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] };
8787

8888
return schema.dependencies.where({ version_id: version.id });
@@ -94,7 +94,7 @@ export function register(server) {
9494
if (!crate) return notFound();
9595

9696
let versionNum = request.params.version_num;
97-
let version = schema.versions.findBy({ crate: crateId, num: versionNum });
97+
let version = schema.versions.findBy({ crateId, num: versionNum });
9898
if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${versionNum}\`` }] };
9999

100100
return schema.versionDownloads.where({ versionId: version.id });

mirage/serializers/version.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import BaseSerializer from './application';
22

33
export default BaseSerializer.extend({
44
attrs: [
5-
'crate',
5+
'crate_id',
66
'created_at',
7-
'dl_path',
87
'downloads',
98
'features',
109
'id',
@@ -18,9 +17,29 @@ export default BaseSerializer.extend({
1817

1918
links(version) {
2019
return {
21-
authors: `/api/v1/crates/${version.crate}/${version.num}/authors`,
22-
dependencies: `/api/v1/crates/${version.crate}/${version.num}/dependencies`,
23-
version_downloads: `/api/v1/crates/${version.crate}/${version.num}/downloads`,
20+
authors: `/api/v1/crates/${version.crateId}/${version.num}/authors`,
21+
dependencies: `/api/v1/crates/${version.crateId}/${version.num}/dependencies`,
22+
version_downloads: `/api/v1/crates/${version.crateId}/${version.num}/downloads`,
2423
};
2524
},
25+
26+
getHashForResource() {
27+
let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments);
28+
29+
if (Array.isArray(hash)) {
30+
for (let resource of hash) {
31+
this._adjust(resource);
32+
}
33+
} else {
34+
this._adjust(hash);
35+
}
36+
37+
return [hash, addToIncludes];
38+
},
39+
40+
_adjust(hash) {
41+
hash.dl_path = `/api/v1/crates/${hash.crate_id}/${hash.num}/download`;
42+
hash.crate = hash.crate_id;
43+
delete hash.crate_id;
44+
},
2645
});

tests/acceptance/crate-test.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ module('Acceptance | crate page', function(hooks) {
1616
assert.expect(0);
1717

1818
this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' });
19-
this.server.create('version', { crate: 'nanomsg', num: '0.6.0' });
20-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
19+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' });
20+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
2121

2222
await visit('/crates/nanomsg');
2323
percySnapshot(assert);
@@ -29,8 +29,8 @@ module('Acceptance | crate page', function(hooks) {
2929
assert.expect(0);
3030

3131
this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' });
32-
this.server.create('version', { crate: 'nanomsg', num: '0.6.0' });
33-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
32+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' });
33+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
3434

3535
await visit('/crates/nanomsg/0.6.0');
3636
percySnapshot(assert);
@@ -51,7 +51,7 @@ module('Acceptance | crate page', function(hooks) {
5151

5252
test('visiting a crate page from the front page', async function(assert) {
5353
this.server.create('crate', { name: 'nanomsg', newest_version: '0.6.1' });
54-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
54+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
5555

5656
await visit('/');
5757
await click('[data-test-just-updated] [data-test-crate-link="0"]');
@@ -65,8 +65,8 @@ module('Acceptance | crate page', function(hooks) {
6565

6666
test('visiting /crates/nanomsg', async function(assert) {
6767
this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' });
68-
this.server.create('version', { crate: 'nanomsg', num: '0.6.0' });
69-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
68+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' });
69+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
7070

7171
await visit('/crates/nanomsg');
7272

@@ -80,8 +80,8 @@ module('Acceptance | crate page', function(hooks) {
8080

8181
test('visiting /crates/nanomsg/', async function(assert) {
8282
this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' });
83-
this.server.create('version', { crate: 'nanomsg', num: '0.6.0' });
84-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
83+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' });
84+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
8585

8686
await visit('/crates/nanomsg/');
8787

@@ -95,8 +95,8 @@ module('Acceptance | crate page', function(hooks) {
9595

9696
test('visiting /crates/nanomsg/0.6.0', async function(assert) {
9797
this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' });
98-
this.server.create('version', { crate: 'nanomsg', num: '0.6.0' });
99-
this.server.create('version', { crate: 'nanomsg', num: '0.6.1' });
98+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' });
99+
this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' });
100100

101101
await visit('/crates/nanomsg/0.6.0');
102102

tests/acceptance/search-test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ module('Acceptance | search', function(hooks) {
3434
assert.equal(title(), "Search Results for 'rust' - crates.io: Rust Package Registry");
3535

3636
assert.dom('[data-test-heading]').hasText("Search Results for 'rust'");
37-
assert.dom('[data-test-search-nav]').hasText('Displaying 1-8 of 8 total results');
37+
assert.dom('[data-test-search-nav]').hasText('Displaying 1-7 of 7 total results');
3838
assert
3939
.dom('[data-test-search-sort]')
4040
.hasText('Sort by Relevance Relevance All-Time Downloads Recent Downloads Recent Updates');
@@ -59,7 +59,7 @@ module('Acceptance | search', function(hooks) {
5959

6060
assert.dom('[data-test-search-input]').hasValue('rust');
6161
assert.dom('[data-test-heading]').hasText("Search Results for 'rust'");
62-
assert.dom('[data-test-search-nav]').hasText('Displaying 1-8 of 8 total results');
62+
assert.dom('[data-test-search-nav]').hasText('Displaying 1-7 of 7 total results');
6363
});
6464

6565
test('clearing search results', async function(assert) {

0 commit comments

Comments
 (0)