From 2eaad15032f12ba5771f83f98180174bb6c6252f Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:12:01 +0100 Subject: [PATCH 1/9] mirage/version-download: Replace `version` property with relationship --- mirage/factories/version-download.js | 8 ++++++-- mirage/fixtures/version-downloads.js | 6 +++--- mirage/models/version-download.js | 6 ++++-- mirage/route-handlers/crates.js | 4 ++-- mirage/serializers/version-download.js | 22 ++++++++++++++++++++++ tests/mirage/crates-test.js | 12 ++++++------ 6 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 mirage/serializers/version-download.js diff --git a/mirage/factories/version-download.js b/mirage/factories/version-download.js index 2e5f0085360..0490a4fbe87 100644 --- a/mirage/factories/version-download.js +++ b/mirage/factories/version-download.js @@ -1,8 +1,12 @@ import { Factory } from 'ember-cli-mirage'; export default Factory.extend({ - // version - date: '2019-05-21', downloads: i => (((i * 42) % 13) + 4) * 2345, + + afterCreate(self) { + if (!self.versionId) { + throw new Error(`Missing \`version\` relationship on \`version-download:${self.date}\``); + } + }, }); diff --git a/mirage/fixtures/version-downloads.js b/mirage/fixtures/version-downloads.js index d8ed3b7a6da..26728e8565c 100644 --- a/mirage/fixtures/version-downloads.js +++ b/mirage/fixtures/version-downloads.js @@ -2,16 +2,16 @@ export default [ { date: '2017-02-10T00:00:00Z', downloads: 2, - version: 40905, + versionId: 40905, }, { date: '2017-02-10T00:00:00Z', downloads: 1, - version: 18445, + versionId: 18445, }, { date: '2017-02-11T00:00:00Z', downloads: 1, - version: 40905, + versionId: 40905, }, ]; diff --git a/mirage/models/version-download.js b/mirage/models/version-download.js index 770b50936d3..6728cf2f9e4 100644 --- a/mirage/models/version-download.js +++ b/mirage/models/version-download.js @@ -1,3 +1,5 @@ -import { Model } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'ember-cli-mirage'; -export default Model.extend({}); +export default Model.extend({ + version: belongsTo(), +}); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index ac72552c889..c3d726c0f3e 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -97,7 +97,7 @@ export function register(server) { let version = schema.versions.findBy({ crate: crateId, num: versionNum }); if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${versionNum}\`` }] }; - return schema.versionDownloads.where({ version: version.id }); + return schema.versionDownloads.where({ versionId: version.id }); }); server.get('/api/v1/crates/:crate_id/owner_user', function(schema, request) { @@ -159,7 +159,7 @@ export function register(server) { let versionDownloads = schema.versionDownloads .all() - .filter(it => crate.versions.indexOf(parseInt(it.version, 10)) !== -1); + .filter(it => crate.versions.indexOf(parseInt(it.versionId, 10)) !== -1); return withMeta(this.serialize(versionDownloads), { extra_downloads: crate._extra_downloads }); }); diff --git a/mirage/serializers/version-download.js b/mirage/serializers/version-download.js new file mode 100644 index 00000000000..d8f9467963f --- /dev/null +++ b/mirage/serializers/version-download.js @@ -0,0 +1,22 @@ +import BaseSerializer from './application'; + +export default BaseSerializer.extend({ + getHashForResource() { + let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments); + + if (Array.isArray(hash)) { + for (let resource of hash) { + this._adjust(resource); + } + } else { + this._adjust(hash); + } + + return [hash, addToIncludes]; + }, + + _adjust(hash) { + hash.version = hash.version_id; + delete hash.version_id; + }, +}); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 95828164889..43cf9aa7160 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -586,9 +586,9 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of version downloads belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); let version = this.server.create('version', { crate: 'rand', num: '1.0.0' }); - this.server.create('version-download', { version: version.id, date: '2020-01-13' }); - this.server.create('version-download', { version: version.id, date: '2020-01-14' }); - this.server.create('version-download', { version: version.id, date: '2020-01-15' }); + this.server.create('version-download', { version, date: '2020-01-13' }); + this.server.create('version-download', { version, date: '2020-01-14' }); + this.server.create('version-download', { version, date: '2020-01-15' }); let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.equal(response.status, 200); @@ -896,9 +896,9 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of version downloads belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); let versions = this.server.createList('version', 2, { crate: 'rand' }); - this.server.create('version-download', { version: versions[0].id, date: '2020-01-13' }); - this.server.create('version-download', { version: versions[1].id, date: '2020-01-14' }); - this.server.create('version-download', { version: versions[1].id, date: '2020-01-15' }); + this.server.create('version-download', { version: versions[0], date: '2020-01-13' }); + this.server.create('version-download', { version: versions[1], date: '2020-01-14' }); + this.server.create('version-download', { version: versions[1], date: '2020-01-15' }); let response = await fetch('/api/v1/crates/rand/downloads'); assert.equal(response.status, 200); From 672a1e1e74aaca765dfda7cdbae66bc607be777b Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:13:13 +0100 Subject: [PATCH 2/9] mirage/version-download: Remove `id` from serialized responses --- mirage/serializers/version-download.js | 1 + tests/mirage/crates-test.js | 8 -------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/mirage/serializers/version-download.js b/mirage/serializers/version-download.js index d8f9467963f..53b0582efcf 100644 --- a/mirage/serializers/version-download.js +++ b/mirage/serializers/version-download.js @@ -18,5 +18,6 @@ export default BaseSerializer.extend({ _adjust(hash) { hash.version = hash.version_id; delete hash.version_id; + delete hash.id; }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 43cf9aa7160..fc8d1a3166b 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -593,24 +593,20 @@ module('Mirage | Keywords', function(hooks) { let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.equal(response.status, 200); - // TODO Remove the `id` properties from the response let responsePayload = await response.json(); assert.deepEqual(responsePayload, { version_downloads: [ { - id: '1', date: '2020-01-13', downloads: 9380, version: '1', }, { - id: '2', date: '2020-01-14', downloads: 16415, version: '1', }, { - id: '3', date: '2020-01-15', downloads: 23450, version: '1', @@ -903,24 +899,20 @@ module('Mirage | Keywords', function(hooks) { let response = await fetch('/api/v1/crates/rand/downloads'); assert.equal(response.status, 200); - // TODO Remove the `id` properties from the response let responsePayload = await response.json(); assert.deepEqual(responsePayload, { version_downloads: [ { - id: '1', date: '2020-01-13', downloads: 9380, version: '1', }, { - id: '2', date: '2020-01-14', downloads: 16415, version: '2', }, { - id: '3', date: '2020-01-15', downloads: 23450, version: '2', From 447113cbe3952aa649a37e5e8fe136508d59c189 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:35:50 +0100 Subject: [PATCH 3/9] mirage/version: Replace `crate` property with relationship --- mirage/factories/version.js | 10 ++++---- mirage/fixtures/crates.js | 4 ++-- mirage/fixtures/versions.js | 42 +++++++++++---------------------- mirage/models/version.js | 6 +++-- mirage/route-handlers/crates.js | 8 +++---- mirage/serializers/version.js | 29 +++++++++++++++++++---- tests/acceptance/crate-test.js | 22 ++++++++--------- tests/acceptance/search-test.js | 4 ++-- tests/mirage/crates-test.js | 34 +++++++++++++------------- 9 files changed, 83 insertions(+), 76 deletions(-) diff --git a/mirage/factories/version.js b/mirage/factories/version.js index d3b49a050cf..e439eb6ba32 100644 --- a/mirage/factories/version.js +++ b/mirage/factories/version.js @@ -11,10 +11,6 @@ export default Factory.extend({ yanked: false, license: i => LICENSES[i % LICENSES.length], - dl_path() { - return `/api/v1/crates/${this.crate}/${this.num}/download`; - }, - downloads: i => (((i + 13) * 42) % 13) * 1234, features: () => {}, @@ -23,7 +19,11 @@ export default Factory.extend({ crate_size: i => (((i + 13) * 42) % 13) * 54321, afterCreate(version, server) { - let crate = server.schema.crates.find(version.crate); + if (!version.crateId) { + throw new Error(`Missing \`crate\` relationship on \`version:${version.num}\``); + } + + let crate = server.schema.crates.find(version.crateId); crate.update({ versions: crate.versions.concat(parseInt(version.id, 10)) }); }, }); diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 8ec46073fa6..d6575757c31 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -370,11 +370,11 @@ export default [ downloads: 109, recent_downloads: 0, homepage: 'https://github.com/nicolas-cherel/rustlex', - id: 'nc_rustlex', + id: 'unicorn-rpc', keywords: ['lexer', 'lexical', 'analyser', 'generator'], max_version: '0.3.1', newest_version: '0.3.1', - name: 'nc_rustlex', + name: 'unicorn-rpc', repository: 'https://github.com/nicolas-cherel/rustlex', updated_at: '2015-08-25T19:15:35Z', versions: null, diff --git a/mirage/fixtures/versions.js b/mirage/fixtures/versions.js index e7aaa14bd6f..1acccfc7920 100644 --- a/mirage/fixtures/versions.js +++ b/mirage/fixtures/versions.js @@ -1,8 +1,7 @@ export default [ { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2016-12-20T07:30:00Z', - dl_path: '/api/v1/crates/nanomsg/0.7.0-alpha.1/download', downloads: 260, features: { bundled: ['nanomsg-sys/bundled'], @@ -25,9 +24,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2016-12-27T08:40:00Z', - dl_path: '/api/v1/crates/nanomsg/0.6.1/download', downloads: 260, features: { bundled: ['nanomsg-sys/bundled'], @@ -50,9 +48,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2016-06-10T20:03:55Z', - dl_path: '/api/v1/crates/nanomsg/0.6.0/download', downloads: 904, features: {}, id: 28431, @@ -72,9 +69,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2016-01-24T22:07:58Z', - dl_path: '/api/v1/crates/nanomsg/0.5.0/download', downloads: 1217, features: {}, id: 21273, @@ -94,9 +90,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-11-23T12:10:09Z', - dl_path: '/api/v1/crates/nanomsg/0.4.2/download', downloads: 318, features: {}, id: 18445, @@ -116,9 +111,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-10-29T22:13:45Z', - dl_path: '/api/v1/crates/nanomsg/0.4.1/download', downloads: 168, features: {}, id: 17384, @@ -138,9 +132,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-07-23T05:54:44Z', - dl_path: '/api/v1/crates/nanomsg/0.4.0/download', downloads: 311, features: {}, id: 13574, @@ -160,9 +153,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-04-18T20:45:03Z', - dl_path: '/api/v1/crates/nanomsg/0.3.4/download', downloads: 237, features: {}, id: 9014, @@ -182,9 +174,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-04-06T18:57:47Z', - dl_path: '/api/v1/crates/nanomsg/0.3.3/download', downloads: 99, features: {}, id: 8236, @@ -204,9 +195,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-03-26T06:51:10Z', - dl_path: '/api/v1/crates/nanomsg/0.3.2/download', downloads: 98, features: {}, id: 7190, @@ -226,9 +216,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2015-02-12T20:20:32Z', - dl_path: '/api/v1/crates/nanomsg/0.3.1/download', downloads: 95, features: {}, id: 4944, @@ -248,9 +237,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2014-12-08T16:21:01Z', - dl_path: '/api/v1/crates/nanomsg/0.3.0/download', downloads: 102, features: {}, id: 940, @@ -270,9 +258,8 @@ export default [ ], }, { - crate: 'nanomsg', + crateId: 'nanomsg', created_at: '2014-12-08T02:08:06Z', - dl_path: '/api/v1/crates/nanomsg/0.2.0/download', downloads: 79, features: {}, id: 924, @@ -292,9 +279,8 @@ export default [ ], }, { - crate: 'unicorn-rpc', + crateId: 'unicorn-rpc', created_at: '2014-12-08T02:08:06Z', - dl_path: '/api/v1/crates/unicorn-rpc/0.2.0/download', downloads: 79, features: {}, id: 28674, diff --git a/mirage/models/version.js b/mirage/models/version.js index 770b50936d3..ca4c10fcd01 100644 --- a/mirage/models/version.js +++ b/mirage/models/version.js @@ -1,3 +1,5 @@ -import { Model } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'ember-cli-mirage'; -export default Model.extend({}); +export default Model.extend({ + crate: belongsTo(), +}); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index c3d726c0f3e..a3901807e9b 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -61,7 +61,7 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - return schema.versions.where({ crate: crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at)); + return schema.versions.where({ crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at)); }); server.get('/api/v1/crates/:crate_id/:version_num/authors', (schema, request) => { @@ -70,7 +70,7 @@ export function register(server) { if (!crate) return notFound(); let num = request.params.version_num; - let version = schema.versions.findBy({ crate: crateId, num }); + let version = schema.versions.findBy({ crateId, num }); if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] }; return { meta: { names: version._authors }, users: [] }; @@ -82,7 +82,7 @@ export function register(server) { if (!crate) return notFound(); let num = request.params.version_num; - let version = schema.versions.findBy({ crate: crateId, num }); + let version = schema.versions.findBy({ crateId, num }); if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] }; return schema.dependencies.where({ version_id: version.id }); @@ -94,7 +94,7 @@ export function register(server) { if (!crate) return notFound(); let versionNum = request.params.version_num; - let version = schema.versions.findBy({ crate: crateId, num: versionNum }); + let version = schema.versions.findBy({ crateId, num: versionNum }); if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${versionNum}\`` }] }; return schema.versionDownloads.where({ versionId: version.id }); diff --git a/mirage/serializers/version.js b/mirage/serializers/version.js index 06f2d158ccc..e4c66d640ff 100644 --- a/mirage/serializers/version.js +++ b/mirage/serializers/version.js @@ -2,9 +2,8 @@ import BaseSerializer from './application'; export default BaseSerializer.extend({ attrs: [ - 'crate', + 'crate_id', 'created_at', - 'dl_path', 'downloads', 'features', 'id', @@ -18,9 +17,29 @@ export default BaseSerializer.extend({ links(version) { return { - authors: `/api/v1/crates/${version.crate}/${version.num}/authors`, - dependencies: `/api/v1/crates/${version.crate}/${version.num}/dependencies`, - version_downloads: `/api/v1/crates/${version.crate}/${version.num}/downloads`, + authors: `/api/v1/crates/${version.crateId}/${version.num}/authors`, + dependencies: `/api/v1/crates/${version.crateId}/${version.num}/dependencies`, + version_downloads: `/api/v1/crates/${version.crateId}/${version.num}/downloads`, }; }, + + getHashForResource() { + let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments); + + if (Array.isArray(hash)) { + for (let resource of hash) { + this._adjust(resource); + } + } else { + this._adjust(hash); + } + + return [hash, addToIncludes]; + }, + + _adjust(hash) { + hash.dl_path = `/api/v1/crates/${hash.crate_id}/${hash.num}/download`; + hash.crate = hash.crate_id; + delete hash.crate_id; + }, }); diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index b189b7fdc60..6921e68c73c 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -16,8 +16,8 @@ module('Acceptance | crate page', function(hooks) { assert.expect(0); this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.0' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/crates/nanomsg'); percySnapshot(assert); @@ -29,8 +29,8 @@ module('Acceptance | crate page', function(hooks) { assert.expect(0); this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.0' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/crates/nanomsg/0.6.0'); percySnapshot(assert); @@ -51,7 +51,7 @@ module('Acceptance | crate page', function(hooks) { test('visiting a crate page from the front page', async function(assert) { this.server.create('crate', { name: 'nanomsg', newest_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/'); await click('[data-test-just-updated] [data-test-crate-link="0"]'); @@ -65,8 +65,8 @@ module('Acceptance | crate page', function(hooks) { test('visiting /crates/nanomsg', async function(assert) { this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.0' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/crates/nanomsg'); @@ -80,8 +80,8 @@ module('Acceptance | crate page', function(hooks) { test('visiting /crates/nanomsg/', async function(assert) { this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.0' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/crates/nanomsg/'); @@ -95,8 +95,8 @@ module('Acceptance | crate page', function(hooks) { test('visiting /crates/nanomsg/0.6.0', async function(assert) { this.server.create('crate', { name: 'nanomsg', max_version: '0.6.1' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.0' }); - this.server.create('version', { crate: 'nanomsg', num: '0.6.1' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); await visit('/crates/nanomsg/0.6.0'); diff --git a/tests/acceptance/search-test.js b/tests/acceptance/search-test.js index 3068f5798e1..acd239a5825 100644 --- a/tests/acceptance/search-test.js +++ b/tests/acceptance/search-test.js @@ -34,7 +34,7 @@ module('Acceptance | search', function(hooks) { assert.equal(title(), "Search Results for 'rust' - crates.io: Rust Package Registry"); assert.dom('[data-test-heading]').hasText("Search Results for 'rust'"); - assert.dom('[data-test-search-nav]').hasText('Displaying 1-8 of 8 total results'); + assert.dom('[data-test-search-nav]').hasText('Displaying 1-7 of 7 total results'); assert .dom('[data-test-search-sort]') .hasText('Sort by Relevance Relevance All-Time Downloads Recent Downloads Recent Updates'); @@ -59,7 +59,7 @@ module('Acceptance | search', function(hooks) { assert.dom('[data-test-search-input]').hasValue('rust'); assert.dom('[data-test-heading]').hasText("Search Results for 'rust'"); - assert.dom('[data-test-search-nav]').hasText('Displaying 1-8 of 8 total results'); + assert.dom('[data-test-search-nav]').hasText('Displaying 1-7 of 7 total results'); }); test('clearing search results', async function(assert) { diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index fc8d1a3166b..c6bc94fb729 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -216,9 +216,9 @@ module('Mirage | Keywords', function(hooks) { test('includes related versions', async function(assert) { this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0' }); - this.server.create('version', { crate: 'rand', num: '1.1.0' }); - this.server.create('version', { crate: 'rand', num: '1.2.0' }); + this.server.create('version', { crateId: 'rand', num: '1.0.0' }); + this.server.create('version', { crateId: 'rand', num: '1.1.0' }); + this.server.create('version', { crateId: 'rand', num: '1.2.0' }); let response = await fetch('/api/v1/crates/rand'); assert.equal(response.status, 200); @@ -342,9 +342,9 @@ module('Mirage | Keywords', function(hooks) { test('returns all versions belonging to the specified crate', async function(assert) { this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0' }); - this.server.create('version', { crate: 'rand', num: '1.1.0' }); - this.server.create('version', { crate: 'rand', num: '1.2.0' }); + this.server.create('version', { crateId: 'rand', num: '1.0.0' }); + this.server.create('version', { crateId: 'rand', num: '1.1.0' }); + this.server.create('version', { crateId: 'rand', num: '1.2.0' }); let response = await fetch('/api/v1/crates/rand/versions'); assert.equal(response.status, 200); @@ -431,7 +431,7 @@ module('Mirage | Keywords', function(hooks) { test('empty case', async function(assert) { this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0' }); + this.server.create('version', { crateId: 'rand', num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/authors'); assert.equal(response.status, 200); @@ -449,7 +449,7 @@ module('Mirage | Keywords', function(hooks) { let authors = ['John Doe ', 'The Rust Project Developers']; this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0', _authors: authors }); + this.server.create('version', { crateId: 'rand', num: '1.0.0', _authors: authors }); let response = await fetch('/api/v1/crates/rand/1.0.0/authors'); assert.equal(response.status, 200); @@ -487,7 +487,7 @@ module('Mirage | Keywords', function(hooks) { test('empty case', async function(assert) { this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0' }); + this.server.create('version', { crateId: 'rand', num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies'); assert.equal(response.status, 200); @@ -500,7 +500,7 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of dependencies belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); - let version = this.server.create('version', { crate: 'rand', num: '1.0.0' }); + let version = this.server.create('version', { crateId: 'rand', num: '1.0.0' }); this.server.create('dependency', { crate_id: 'foo', version_id: version.id }); this.server.create('dependency', { crate_id: 'bar', version_id: version.id }); this.server.create('dependency', { crate_id: 'baz', version_id: version.id }); @@ -572,7 +572,7 @@ module('Mirage | Keywords', function(hooks) { test('empty case', async function(assert) { this.server.create('crate', { name: 'rand' }); - this.server.create('version', { crate: 'rand', num: '1.0.0' }); + this.server.create('version', { crateId: 'rand', num: '1.0.0' }); let response = await fetch('/api/v1/crates/rand/1.0.0/downloads'); assert.equal(response.status, 200); @@ -585,7 +585,7 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of version downloads belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); - let version = this.server.create('version', { crate: 'rand', num: '1.0.0' }); + let version = this.server.create('version', { crateId: 'rand', num: '1.0.0' }); this.server.create('version-download', { version, date: '2020-01-13' }); this.server.create('version-download', { version, date: '2020-01-14' }); this.server.create('version-download', { version, date: '2020-01-15' }); @@ -735,14 +735,14 @@ module('Mirage | Keywords', function(hooks) { this.server.create('dependency', { crate_id: 'foo', version_id: this.server.create('version', { - crate: this.server.create('crate', { name: 'bar' }).id, + crate: this.server.create('crate', { name: 'bar' }), }).id, }); this.server.create('dependency', { crate_id: 'foo', version_id: this.server.create('version', { - crate: this.server.create('crate', { name: 'baz' }).id, + crate: this.server.create('crate', { name: 'baz' }), }).id, }); @@ -824,7 +824,7 @@ module('Mirage | Keywords', function(hooks) { crate_id: 'foo', version_id: () => this.server.create('version', { - crate: () => this.server.create('crate', { name: 'bar' }).id, + crate: () => this.server.create('crate', { name: 'bar' }), }).id, }); @@ -844,7 +844,7 @@ module('Mirage | Keywords', function(hooks) { name: i => `crate-${String(i + 1).padStart(2, '0')}`, }); let versions = this.server.createList('version', crates.length, { - crate: i => crates[i].id, + crate: i => crates[i], }); this.server.createList('dependency', versions.length, { crate_id: 'foo', @@ -891,7 +891,7 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of version downloads belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); - let versions = this.server.createList('version', 2, { crate: 'rand' }); + let versions = this.server.createList('version', 2, { crateId: 'rand' }); this.server.create('version-download', { version: versions[0], date: '2020-01-13' }); this.server.create('version-download', { version: versions[1], date: '2020-01-14' }); this.server.create('version-download', { version: versions[1], date: '2020-01-15' }); From d766a4fde8a6c9fbe29983d1ed5b6b254293a13c Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:38:25 +0100 Subject: [PATCH 4/9] mirage/dependency: Replace `crate` and `version` properties with relationships --- mirage/factories/dependency.js | 12 ++++++++--- mirage/fixtures/crates.js | 32 +++++++++++++++++++++++++++++ mirage/fixtures/dependencies.js | 20 +++++++++--------- mirage/models/dependency.js | 7 +++++-- mirage/route-handlers/crates.js | 6 +++--- tests/acceptance/front-page-test.js | 4 ++-- tests/mirage/crates-test.js | 26 +++++++++++++---------- 7 files changed, 76 insertions(+), 31 deletions(-) diff --git a/mirage/factories/dependency.js b/mirage/factories/dependency.js index 414f10d6452..c97ebd7a197 100644 --- a/mirage/factories/dependency.js +++ b/mirage/factories/dependency.js @@ -3,13 +3,19 @@ import { Factory } from 'ember-cli-mirage'; const REQS = ['^0.1.0', '^2.1.3', '0.3.7', '~5.2.12']; export default Factory.extend({ - // crate_id, - // version_id, - default_features: i => i % 4 === 3, features: () => [], kind: i => (i % 3 === 0 ? 'dev' : 'normal'), optional: i => i % 4 !== 3, req: i => REQS[i % REQS.length], target: null, + + afterCreate(self) { + if (!self.crateId) { + throw new Error(`Missing \`crate\` relationship on \`dependency:${self.id}\``); + } + if (!self.versionId) { + throw new Error(`Missing \`version\` relationship on \`dependency:${self.id}\``); + } + }, }); diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index d6575757c31..73748d342d0 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -395,4 +395,36 @@ export default [ updated_at: '2015-11-22T22:00:41Z', versions: null, }, + { + id: 'libc', + name: 'libc', + max_version: '1.0.1', + newest_version: '1.0.1', + downloads: 5169, + recent_downloads: 69, + }, + { + id: 'nanomsg-sys', + name: 'nanomsg-sys', + max_version: '1.0.1', + newest_version: '1.0.1', + downloads: 5169, + recent_downloads: 69, + }, + { + id: 'mock-build-deps', + name: 'mock-build-deps', + max_version: '1.0.1', + newest_version: '1.0.1', + downloads: 5169, + recent_downloads: 69, + }, + { + id: 'mock-dev-deps', + name: 'mock-dev-deps', + max_version: '1.0.1', + newest_version: '1.0.1', + downloads: 5169, + recent_downloads: 69, + }, ]; diff --git a/mirage/fixtures/dependencies.js b/mirage/fixtures/dependencies.js index 61fceb78ab2..8a55eef6952 100644 --- a/mirage/fixtures/dependencies.js +++ b/mirage/fixtures/dependencies.js @@ -1,6 +1,6 @@ export default [ { - crate_id: 'libc', + crateId: 'libc', default_features: true, features: '', id: 146231, @@ -8,10 +8,10 @@ export default [ optional: false, req: '^0.2.18', target: null, - version_id: 40905, + versionId: 40905, }, { - crate_id: 'nanomsg-sys', + crateId: 'nanomsg-sys', default_features: true, features: '', id: 146232, @@ -19,10 +19,10 @@ export default [ optional: false, req: '^0.6.1', target: null, - version_id: 40905, + versionId: 40905, }, { - crate_id: 'nanomsg', + crateId: 'nanomsg', default_features: true, features: '', id: 146233, @@ -30,10 +30,10 @@ export default [ optional: false, req: '^0.5.0', target: null, - version_id: 28674, + versionId: 28674, }, { - crate_id: 'mock-build-deps', + crateId: 'mock-build-deps', default_features: true, features: '', id: 146234, @@ -41,10 +41,10 @@ export default [ optional: false, req: '^0.6.1', target: null, - version_id: 40905, + versionId: 40905, }, { - crate_id: 'mock-dev-deps', + crateId: 'mock-dev-deps', default_features: true, features: '', id: 146235, @@ -52,6 +52,6 @@ export default [ optional: true, req: '^0.6.1', target: null, - version_id: 40905, + versionId: 40905, }, ]; diff --git a/mirage/models/dependency.js b/mirage/models/dependency.js index 770b50936d3..aab4813aa97 100644 --- a/mirage/models/dependency.js +++ b/mirage/models/dependency.js @@ -1,3 +1,6 @@ -import { Model } from 'ember-cli-mirage'; +import { Model, belongsTo } from 'ember-cli-mirage'; -export default Model.extend({}); +export default Model.extend({ + crate: belongsTo(), + version: belongsTo(), +}); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index a3901807e9b..5acab0d2dc9 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -85,7 +85,7 @@ export function register(server) { let version = schema.versions.findBy({ crateId, num }); if (!version) return { errors: [{ detail: `crate \`${crateId}\` does not have a version \`${num}\`` }] }; - return schema.dependencies.where({ version_id: version.id }); + return schema.dependencies.where({ versionId: version.id }); }); server.get('/api/v1/crates/:crate_id/:version_num/downloads', function(schema, request) { @@ -139,11 +139,11 @@ export function register(server) { let { start, end } = pageParams(request); - let allDependencies = schema.dependencies.where({ crate_id: crateId }); + let allDependencies = schema.dependencies.where({ crateId: crateId }); let dependencies = allDependencies.slice(start, end); let total = allDependencies.length; - let versions = schema.versions.find(dependencies.models.map(it => it.version_id)); + let versions = schema.versions.find(dependencies.models.map(it => it.versionId)); return { ...this.serialize(dependencies), diff --git a/tests/acceptance/front-page-test.js b/tests/acceptance/front-page-test.js index 8fc023b87b0..71c38516b52 100644 --- a/tests/acceptance/front-page-test.js +++ b/tests/acceptance/front-page-test.js @@ -32,8 +32,8 @@ module('Acceptance | front page', function(hooks) { assert.dom('[data-test-all-crates-link]').exists(); assert.dom('[data-test-login-link]').exists(); - assert.dom('[data-test-total-downloads]').hasText('122,669'); - assert.dom('[data-test-total-crates]').hasText('19'); + assert.dom('[data-test-total-downloads]').hasText('143,345'); + assert.dom('[data-test-total-crates]').hasText('23'); assert.dom('[data-test-new-crates] [data-test-crate-link="0"]').hasText('Inflector (0.1.6)'); assert.dom('[data-test-new-crates] [data-test-crate-link="0"]').hasAttribute('href', '/crates/Inflector/0.1.6'); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index c6bc94fb729..03174e92892 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -501,9 +501,13 @@ module('Mirage | Keywords', function(hooks) { test('returns a list of dependencies belonging to the specified crate version', async function(assert) { this.server.create('crate', { name: 'rand' }); let version = this.server.create('version', { crateId: 'rand', num: '1.0.0' }); - this.server.create('dependency', { crate_id: 'foo', version_id: version.id }); - this.server.create('dependency', { crate_id: 'bar', version_id: version.id }); - this.server.create('dependency', { crate_id: 'baz', version_id: version.id }); + + this.server.create('crate', { name: 'foo' }); + this.server.create('dependency', { crateId: 'foo', versionId: version.id }); + this.server.create('crate', { name: 'bar' }); + this.server.create('dependency', { crateId: 'bar', versionId: version.id }); + this.server.create('crate', { name: 'baz' }); + this.server.create('dependency', { crateId: 'baz', versionId: version.id }); let response = await fetch('/api/v1/crates/rand/1.0.0/dependencies'); assert.equal(response.status, 200); @@ -733,15 +737,15 @@ module('Mirage | Keywords', function(hooks) { this.server.create('crate', { name: 'foo' }); this.server.create('dependency', { - crate_id: 'foo', - version_id: this.server.create('version', { + crateId: 'foo', + versionId: this.server.create('version', { crate: this.server.create('crate', { name: 'bar' }), }).id, }); this.server.create('dependency', { - crate_id: 'foo', - version_id: this.server.create('version', { + crateId: 'foo', + versionId: this.server.create('version', { crate: this.server.create('crate', { name: 'baz' }), }).id, }); @@ -821,8 +825,8 @@ module('Mirage | Keywords', function(hooks) { this.server.create('crate', { name: 'foo' }); this.server.createList('dependency', 25, { - crate_id: 'foo', - version_id: () => + crateId: 'foo', + versionId: () => this.server.create('version', { crate: () => this.server.create('crate', { name: 'bar' }), }).id, @@ -847,8 +851,8 @@ module('Mirage | Keywords', function(hooks) { crate: i => crates[i], }); this.server.createList('dependency', versions.length, { - crate_id: 'foo', - version_id: i => versions[i].id, + crateId: 'foo', + versionId: i => versions[i].id, }); let response = await fetch('/api/v1/crates/foo/reverse_dependencies?page=2&per_page=5'); From 169e9ba7bf1b5fd42b43915dc87245046b8f8cce Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:42:47 +0100 Subject: [PATCH 5/9] mirage/crate: Replace `categories` property with relationship --- mirage/factories/crate.js | 1 - mirage/fixtures/crates.js | 2 +- mirage/models/crate.js | 6 ++++-- mirage/route-handlers/crates.js | 3 +-- mirage/serializers/crate.js | 19 +++++++++++++++++++ tests/mirage/crates-test.js | 3 ++- 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/mirage/factories/crate.js b/mirage/factories/crate.js index 741cf4e96ab..343295815d1 100644 --- a/mirage/factories/crate.js +++ b/mirage/factories/crate.js @@ -23,7 +23,6 @@ export default Factory.extend({ updated_at: '2017-02-24T12:34:56Z', badges: () => [], - categories: () => [], keywords: () => [], versions: () => [], _extra_downloads: () => [], diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 73748d342d0..b1c98ff3f2e 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -32,7 +32,7 @@ export default [ }, }, ], - categories: [], + categoryIds: [], created_at: '2014-12-08T02:08:06Z', description: 'A high-level, Rust idiomatic wrapper around nanomsg.', documentation: 'https://github.com/thehydroimpulse/nanomsg.rs', diff --git a/mirage/models/crate.js b/mirage/models/crate.js index 770b50936d3..89b55f30bd0 100644 --- a/mirage/models/crate.js +++ b/mirage/models/crate.js @@ -1,3 +1,5 @@ -import { Model } from 'ember-cli-mirage'; +import { Model, hasMany } from 'ember-cli-mirage'; -export default Model.extend({}); +export default Model.extend({ + categories: hasMany(), +}); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 5acab0d2dc9..18c2169eda4 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -38,7 +38,6 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let categories = schema.categories.all().filter(category => (crate.categories || []).indexOf(category.id) !== -1); let keywords = schema.keywords.all().filter(keyword => (crate.keywords || []).indexOf(keyword.id) !== -1); let versions = schema.versions .all() @@ -46,7 +45,7 @@ export function register(server) { return { ...this.serialize(crate), - ...this.serialize(categories), + ...this.serialize(crate.categories), ...this.serialize(keywords), ...this.serialize(versions), }; diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index ef9ad34957c..dc822ae0be4 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -30,4 +30,23 @@ export default BaseSerializer.extend({ versions: `/api/v1/crates/${crate.id}/versions`, }; }, + + getHashForResource() { + let [hash, addToIncludes] = BaseSerializer.prototype.getHashForResource.apply(this, arguments); + + if (Array.isArray(hash)) { + for (let resource of hash) { + this._adjust(resource); + } + } else { + this._adjust(hash); + } + + return [hash, addToIncludes]; + }, + + _adjust(hash) { + hash.categories = hash.category_ids; + delete hash.category_ids; + }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 03174e92892..3bf4b0a5abe 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -282,12 +282,13 @@ module('Mirage | Keywords', function(hooks) { test('includes related categories', async function(assert) { this.server.create('category', { category: 'no-std' }); this.server.create('category', { category: 'cli' }); - this.server.create('crate', { name: 'rand', categories: ['no-std'] }); + this.server.create('crate', { name: 'rand', categoryIds: ['no-std'] }); let response = await fetch('/api/v1/crates/rand'); assert.equal(response.status, 200); let responsePayload = await response.json(); + assert.deepEqual(responsePayload.crate.categories, ['no-std']); assert.deepEqual(responsePayload.categories, [ { id: 'no-std', From 8cec74fe7aba68569ae4c42ce7690ef3e73ac6a6 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:44:07 +0100 Subject: [PATCH 6/9] mirage/crate: Replace `keywords` property with relationship --- mirage/factories/crate.js | 1 - mirage/fixtures/crates.js | 38 ++++++++-------- mirage/fixtures/keywords.js | 78 +++++++++++++++++++++++++++++++++ mirage/models/crate.js | 1 + mirage/route-handlers/crates.js | 3 +- mirage/serializers/crate.js | 3 ++ tests/mirage/crates-test.js | 3 +- 7 files changed, 104 insertions(+), 23 deletions(-) diff --git a/mirage/factories/crate.js b/mirage/factories/crate.js index 343295815d1..3d230b5bffb 100644 --- a/mirage/factories/crate.js +++ b/mirage/factories/crate.js @@ -23,7 +23,6 @@ export default Factory.extend({ updated_at: '2017-02-24T12:34:56Z', badges: () => [], - keywords: () => [], versions: () => [], _extra_downloads: () => [], _owner_teams: () => [], diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index b1c98ff3f2e..6d1afd2ef75 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -15,7 +15,7 @@ export default [ recent_downloads: 125, homepage: 'https://icorderi.github.io/icorderi/kinetic-rust', id: 'kinetic-rust', - keywords: ['Protocol', 'Kinetic', 'Storage'], + keywordIds: [], max_version: '0.0.16', newest_version: '0.0.16', name: 'kinetic-rust', @@ -40,7 +40,7 @@ export default [ recent_downloads: 800, homepage: 'https://github.com/thehydroimpulse/nanomsg.rs', id: 'nanomsg', - keywords: ['network'], + keywordIds: ['network'], max_version: '0.7.0-alpha', newest_version: '0.6.1', name: 'nanomsg', @@ -70,7 +70,7 @@ export default [ exact_match: true, homepage: 'https://github.com/huonw/external_mixin', id: 'rust_mixin', - keywords: ['rust', 'plugin', 'code-generation'], + keywordIds: ['rust', 'plugin', 'code-generation'], max_version: '0.0.1', newest_version: '0.0.1', name: 'rust_mixin', @@ -143,7 +143,7 @@ export default [ recent_downloads: 497, homepage: 'https://github.com/huonw/external_mixin', id: 'external_mixin', - keywords: ['python', 'ruby', 'shell', 'plugin', 'code-generation'], + keywordIds: ['python', 'ruby', 'shell', 'plugin', 'code-generation'], max_version: '0.0.1', newest_version: '0.0.1', name: 'external_mixin', @@ -159,7 +159,7 @@ export default [ recent_downloads: 0, homepage: 'https://github.com/huonw/external_mixin', id: 'external_mixin_umbrella', - keywords: ['plugin', 'code-generation'], + keywordIds: ['plugin', 'code-generation'], max_version: '0.0.2', newest_version: '0.0.2', name: 'external_mixin_umbrella', @@ -176,7 +176,7 @@ export default [ recent_downloads: 1, homepage: 'https://github.com/whatisinternet/inflector', id: 'Inflector', - keywords: ['string', 'case', 'camel', 'snake', 'inflection'], + keywordIds: ['string', 'case', 'camel', 'snake', 'inflection'], max_version: '0.1.6', newest_version: '0.1.6', name: 'Inflector', @@ -192,7 +192,7 @@ export default [ recent_downloads: 21, homepage: null, id: 'rs-es', - keywords: ['elasticsearch', 'elastic'], + keywordIds: ['elasticsearch', 'elastic'], max_version: '0.1.17', newest_version: '0.1.17', name: 'rs-es', @@ -208,7 +208,7 @@ export default [ recent_downloads: 2000, homepage: 'https://github.com/DaGenix/rust-crypto/', id: 'rust-crypto', - keywords: ['Crypto', 'MD5', 'Sha1', 'Sha2', 'AES'], + keywordIds: [], max_version: '0.2.34', newest_version: '0.2.34', name: 'rust-crypto', @@ -224,7 +224,7 @@ export default [ recent_downloads: 85, homepage: null, id: 'rust-htslib', - keywords: ['htslib', 'bam', 'bioinformatics', 'pileup', 'sequencing'], + keywordIds: [], max_version: '0.5.2', newest_version: '0.5.2', name: 'rust-htslib', @@ -240,7 +240,7 @@ export default [ recent_downloads: 500, homepage: 'https://github.com/rustless/rustless', id: 'rustless', - keywords: ['api', 'web', 'hyper', 'iron', 'rest'], + keywordIds: [], max_version: '0.8.0', newest_version: '0.8.0', name: 'rustless', @@ -256,7 +256,7 @@ export default [ recent_downloads: 854, homepage: null, id: 'serde', - keywords: ['serde', 'serialization'], + keywordIds: [], max_version: '0.6.1', newest_version: '0.6.1', name: 'serde', @@ -272,7 +272,7 @@ export default [ recent_downloads: 54, homepage: 'https://github.com/livioribeiro/rusted-cypher', id: 'rusted_cypher', - keywords: ['neo4j', 'database', 'query', 'cypher', 'graph'], + keywordIds: [], max_version: '0.7.1', newest_version: '0.7.1', name: 'rusted_cypher', @@ -289,7 +289,7 @@ export default [ recent_downloads: 23, homepage: null, id: 'zlib', - keywords: [], + keywordIds: [], max_version: '0.0.1', newest_version: '0.0.1', name: 'zlib', @@ -306,7 +306,7 @@ export default [ recent_downloads: 76, homepage: null, id: 'rustful', - keywords: ['web', 'rest', 'framework', 'http', 'routing'], + keywordIds: [], max_version: '0.5.0', newest_version: '0.5.0', name: 'rustful', @@ -322,7 +322,7 @@ export default [ recent_downloads: 13, homepage: null, id: 'postgres', - keywords: ['database', 'sql'], + keywordIds: [], max_version: '0.10.1', newest_version: '0.10.1', name: 'postgres', @@ -338,7 +338,7 @@ export default [ recent_downloads: 143, homepage: 'https://github.com/BurntSushi/quickcheck', id: 'quickcheck', - keywords: ['testing', 'quickcheck', 'property', 'shrinking', 'fuzz'], + keywordIds: [], max_version: '0.2.24', newest_version: '0.2.24', name: 'quickcheck', @@ -354,7 +354,7 @@ export default [ recent_downloads: 768, homepage: 'https://github.com/BurntSushi/quickcheck', id: 'quickcheck_macros', - keywords: ['testing', 'quickcheck', 'property', 'shrinking', 'fuzz'], + keywordIds: [], max_version: '0.2.24', newest_version: '0.2.24', name: 'quickcheck_macros', @@ -371,7 +371,7 @@ export default [ recent_downloads: 0, homepage: 'https://github.com/nicolas-cherel/rustlex', id: 'unicorn-rpc', - keywords: ['lexer', 'lexical', 'analyser', 'generator'], + keywordIds: [], max_version: '0.3.1', newest_version: '0.3.1', name: 'unicorn-rpc', @@ -387,7 +387,7 @@ export default [ recent_downloads: 69, homepage: null, id: 'nom', - keywords: ['parser', 'parser-combinators', 'parsing', 'streaming', 'bit'], + keywordIds: [], max_version: '1.0.1', newest_version: '1.0.1', name: 'nom', diff --git a/mirage/fixtures/keywords.js b/mirage/fixtures/keywords.js index b370228b6b3..fda98b3966d 100644 --- a/mirage/fixtures/keywords.js +++ b/mirage/fixtures/keywords.js @@ -5,4 +5,82 @@ export default [ id: 'network', keyword: 'network', }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'rust', + keyword: 'rust', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'plugin', + keyword: 'plugin', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'code-generation', + keyword: 'code-generation', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'python', + keyword: 'python', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'ruby', + keyword: 'ruby', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'shell', + keyword: 'shell', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'string', + keyword: 'string', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'case', + keyword: 'case', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'camel', + keyword: 'camel', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'snake', + keyword: 'snake', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'inflection', + keyword: 'inflection', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'elastic', + keyword: 'elastic', + }, + { + crates_cnt: 1, + created_at: '2014-11-23T06:47:40Z', + id: 'elasticsearch', + keyword: 'elasticsearch', + }, ]; diff --git a/mirage/models/crate.js b/mirage/models/crate.js index 89b55f30bd0..f30dc19624b 100644 --- a/mirage/models/crate.js +++ b/mirage/models/crate.js @@ -2,4 +2,5 @@ import { Model, hasMany } from 'ember-cli-mirage'; export default Model.extend({ categories: hasMany(), + keywords: hasMany(), }); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 18c2169eda4..aaa5261a4aa 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -38,7 +38,6 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let keywords = schema.keywords.all().filter(keyword => (crate.keywords || []).indexOf(keyword.id) !== -1); let versions = schema.versions .all() .filter(version => (crate.versions || []).indexOf(parseInt(version.id, 10)) !== -1); @@ -46,7 +45,7 @@ export function register(server) { return { ...this.serialize(crate), ...this.serialize(crate.categories), - ...this.serialize(keywords), + ...this.serialize(crate.keywords), ...this.serialize(versions), }; }); diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index dc822ae0be4..c67b51e87ee 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -48,5 +48,8 @@ export default BaseSerializer.extend({ _adjust(hash) { hash.categories = hash.category_ids; delete hash.category_ids; + + hash.keywords = hash.keyword_ids; + delete hash.keyword_ids; }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 3bf4b0a5abe..1719fd13714 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -304,12 +304,13 @@ module('Mirage | Keywords', function(hooks) { test('includes related keywords', async function(assert) { this.server.create('keyword', { keyword: 'no-std' }); this.server.create('keyword', { keyword: 'cli' }); - this.server.create('crate', { name: 'rand', keywords: ['no-std'] }); + this.server.create('crate', { name: 'rand', keywordIds: ['no-std'] }); let response = await fetch('/api/v1/crates/rand'); assert.equal(response.status, 200); let responsePayload = await response.json(); + assert.deepEqual(responsePayload.crate.keywords, ['no-std']); assert.deepEqual(responsePayload.keywords, [ { crates_cnt: 0, From 1f917ad67caf372af90b08bfb6f093b95bcb2161 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 17:54:05 +0100 Subject: [PATCH 7/9] mirage/crate: Replace `versions` property with relationship --- mirage/factories/crate.js | 1 - mirage/factories/version.js | 5 +---- mirage/fixtures/crates.js | 38 ++++++++++++++++----------------- mirage/models/crate.js | 1 + mirage/route-handlers/crates.js | 12 +++-------- mirage/serializers/crate.js | 3 +++ tests/mirage/crates-test.js | 1 + 7 files changed, 28 insertions(+), 33 deletions(-) diff --git a/mirage/factories/crate.js b/mirage/factories/crate.js index 3d230b5bffb..a7e821fe7c3 100644 --- a/mirage/factories/crate.js +++ b/mirage/factories/crate.js @@ -23,7 +23,6 @@ export default Factory.extend({ updated_at: '2017-02-24T12:34:56Z', badges: () => [], - versions: () => [], _extra_downloads: () => [], _owner_teams: () => [], _owner_users: () => [], diff --git a/mirage/factories/version.js b/mirage/factories/version.js index e439eb6ba32..a0fc91a6db3 100644 --- a/mirage/factories/version.js +++ b/mirage/factories/version.js @@ -18,12 +18,9 @@ export default Factory.extend({ crate_size: i => (((i + 13) * 42) % 13) * 54321, - afterCreate(version, server) { + afterCreate(version) { if (!version.crateId) { throw new Error(`Missing \`crate\` relationship on \`version:${version.num}\``); } - - let crate = server.schema.crates.find(version.crateId); - crate.update({ versions: crate.versions.concat(parseInt(version.id, 10)) }); }, }); diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 6d1afd2ef75..0a18c968ad6 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -21,7 +21,7 @@ export default [ name: 'kinetic-rust', repository: 'https://github.com/icorderi/kinetic-rust/', updated_at: '2015-04-21T00:15:49Z', - versions: null, + versionIds: [], }, { badges: [ @@ -46,7 +46,7 @@ export default [ name: 'nanomsg', repository: 'https://github.com/thehydroimpulse/nanomsg.rs', updated_at: '2016-12-28T08:40:00Z', - versions: [40906, 40905, 28431, 21273, 18445, 17384, 13574, 9014, 8236, 7190, 4944, 940, 924], + versionIds: [40906, 40905, 28431, 21273, 18445, 17384, 13574, 9014, 8236, 7190, 4944, 940, 924], _extra_downloads: [ { date: '2017-02-02', @@ -132,7 +132,7 @@ export default [ badge_type: 'coveralls', }, ], - versions: null, + versionIds: [], }, { created_at: '2015-02-27T11:51:58Z', @@ -149,7 +149,7 @@ export default [ name: 'external_mixin', repository: 'https://github.com/huonw/external_mixin', updated_at: '2015-02-27T11:51:58Z', - versions: null, + versionIds: [], }, { created_at: '2015-02-27T11:51:40Z', @@ -165,7 +165,7 @@ export default [ name: 'external_mixin_umbrella', repository: 'https://github.com/huonw/external_mixin', updated_at: '2015-02-27T11:52:30Z', - versions: null, + versionIds: [], }, { created_at: '2015-10-10T15:26:24Z', @@ -182,7 +182,7 @@ export default [ name: 'Inflector', repository: 'https://github.com/whatisinternet/inflector', updated_at: '2015-10-27T01:51:42Z', - versions: null, + versionIds: [], }, { created_at: '2015-05-21T17:43:38Z', @@ -198,7 +198,7 @@ export default [ name: 'rs-es', repository: 'https://github.com/benashford/rs-es', updated_at: '2015-09-09T15:34:50Z', - versions: null, + versionIds: [], }, { created_at: '2014-11-21T05:12:08Z', @@ -214,7 +214,7 @@ export default [ name: 'rust-crypto', repository: 'https://github.com/DaGenix/rust-crypto/', updated_at: '2015-10-29T01:16:17Z', - versions: null, + versionIds: [], }, { created_at: '2015-03-20T13:46:04Z', @@ -230,7 +230,7 @@ export default [ name: 'rust-htslib', repository: 'https://github.com/rust-bio/rust-htslib.git', updated_at: '2015-11-11T00:10:43Z', - versions: null, + versionIds: [], }, { created_at: '2014-11-29T17:51:55Z', @@ -246,7 +246,7 @@ export default [ name: 'rustless', repository: 'https://crates.io/crates/rustless', updated_at: '2015-10-31T11:49:29Z', - versions: null, + versionIds: [], }, { created_at: '2014-12-05T20:20:39Z', @@ -262,7 +262,7 @@ export default [ name: 'serde', repository: 'https://github.com/serde-rs/serde', updated_at: '2015-10-18T03:10:21Z', - versions: null, + versionIds: [], }, { created_at: '2015-08-26T13:50:58Z', @@ -278,7 +278,7 @@ export default [ name: 'rusted_cypher', repository: 'https://github.com/livioribeiro/rusted-cypher', updated_at: '2015-11-07T17:26:55Z', - versions: null, + versionIds: [], }, { created_at: '2015-01-02T20:54:04Z', @@ -295,7 +295,7 @@ export default [ name: 'zlib', repository: null, updated_at: '2015-01-02T20:54:04Z', - versions: null, + versionIds: [], }, { created_at: '2015-05-08T19:34:16Z', @@ -312,7 +312,7 @@ export default [ name: 'rustful', repository: 'https://github.com/Ogeon/rustful', updated_at: '2015-09-19T21:10:27Z', - versions: null, + versionIds: [], }, { created_at: '2014-11-24T02:34:44Z', @@ -328,7 +328,7 @@ export default [ name: 'postgres', repository: 'https://github.com/sfackler/rust-postgres', updated_at: '2015-11-08T00:48:59Z', - versions: null, + versionIds: [], }, { created_at: '2014-11-21T00:20:47Z', @@ -344,7 +344,7 @@ export default [ name: 'quickcheck', repository: 'https://github.com/BurntSushi/quickcheck', updated_at: '2015-09-20T21:53:38Z', - versions: null, + versionIds: [], }, { created_at: '2014-11-21T00:21:04Z', @@ -360,7 +360,7 @@ export default [ name: 'quickcheck_macros', repository: 'https://github.com/BurntSushi/quickcheck', updated_at: '2015-09-20T21:53:57Z', - versions: null, + versionIds: [], }, { created_at: '2015-08-25T19:15:35Z', @@ -377,7 +377,7 @@ export default [ name: 'unicorn-rpc', repository: 'https://github.com/nicolas-cherel/rustlex', updated_at: '2015-08-25T19:15:35Z', - versions: null, + versionIds: [], }, { created_at: '2015-01-17T17:47:52Z', @@ -393,7 +393,7 @@ export default [ name: 'nom', repository: 'https://github.com/Geal/nom', updated_at: '2015-11-22T22:00:41Z', - versions: null, + versionIds: [], }, { id: 'libc', diff --git a/mirage/models/crate.js b/mirage/models/crate.js index f30dc19624b..18d3abce9b6 100644 --- a/mirage/models/crate.js +++ b/mirage/models/crate.js @@ -3,4 +3,5 @@ import { Model, hasMany } from 'ember-cli-mirage'; export default Model.extend({ categories: hasMany(), keywords: hasMany(), + versions: hasMany(), }); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index aaa5261a4aa..20944ac77d1 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -38,15 +38,11 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let versions = schema.versions - .all() - .filter(version => (crate.versions || []).indexOf(parseInt(version.id, 10)) !== -1); - return { ...this.serialize(crate), ...this.serialize(crate.categories), ...this.serialize(crate.keywords), - ...this.serialize(versions), + ...this.serialize(crate.versions), }; }); @@ -59,7 +55,7 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - return schema.versions.where({ crateId }).sort((a, b) => compareIsoDates(b.created_at, a.created_at)); + return crate.versions.sort((a, b) => compareIsoDates(b.created_at, a.created_at)); }); server.get('/api/v1/crates/:crate_id/:version_num/authors', (schema, request) => { @@ -155,9 +151,7 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let versionDownloads = schema.versionDownloads - .all() - .filter(it => crate.versions.indexOf(parseInt(it.versionId, 10)) !== -1); + let versionDownloads = schema.versionDownloads.all().filter(it => it.version.crateId === crateId); return withMeta(this.serialize(versionDownloads), { extra_downloads: crate._extra_downloads }); }); diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index c67b51e87ee..8ad98edb165 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -51,5 +51,8 @@ export default BaseSerializer.extend({ hash.keywords = hash.keyword_ids; delete hash.keyword_ids; + + hash.versions = hash.version_ids; + delete hash.version_ids; }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 1719fd13714..c771b284137 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -224,6 +224,7 @@ module('Mirage | Keywords', function(hooks) { assert.equal(response.status, 200); let responsePayload = await response.json(); + assert.deepEqual(responsePayload.crate.versions, ['1', '2', '3']); assert.deepEqual(responsePayload.versions, [ { id: '1', From be1d985e88bf5db8ecc489ee012b0f97293bc0b9 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 18:05:49 +0100 Subject: [PATCH 8/9] mirage/crate: Replace `_owner_users` property with `userOwners` relationship --- mirage/factories/crate.js | 1 - mirage/fixtures/crates.js | 2 +- mirage/models/crate.js | 1 + mirage/route-handlers/crates.js | 4 +--- mirage/serializers/crate.js | 2 ++ tests/mirage/crates-test.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mirage/factories/crate.js b/mirage/factories/crate.js index a7e821fe7c3..2a1a289fe1f 100644 --- a/mirage/factories/crate.js +++ b/mirage/factories/crate.js @@ -25,5 +25,4 @@ export default Factory.extend({ badges: () => [], _extra_downloads: () => [], _owner_teams: () => [], - _owner_users: () => [], }); diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 0a18c968ad6..5015917c87b 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -58,7 +58,7 @@ export default [ }, ], _owner_teams: [1, 303], - _owner_users: [2, 303], + userOwnerIds: [2, 303], }, { created_at: '2015-02-27T11:52:13Z', diff --git a/mirage/models/crate.js b/mirage/models/crate.js index 18d3abce9b6..9711b5b09f0 100644 --- a/mirage/models/crate.js +++ b/mirage/models/crate.js @@ -4,4 +4,5 @@ export default Model.extend({ categories: hasMany(), keywords: hasMany(), versions: hasMany(), + userOwners: hasMany('user'), }); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index 20944ac77d1..bf9bb3d52ab 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -99,9 +99,7 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let users = schema.users.find(crate._owner_users); - - let response = this.serialize(users); + let response = this.serialize(crate.userOwners); response.users.forEach(user => { user.kind = 'user'; diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index 8ad98edb165..380add9c9b3 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -54,5 +54,7 @@ export default BaseSerializer.extend({ hash.versions = hash.version_ids; delete hash.version_ids; + + delete hash.user_owner_ids; }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index c771b284137..4784120e0b5 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -646,7 +646,7 @@ module('Mirage | Keywords', function(hooks) { test('returns the list of users that own the specified crate', async function(assert) { let user = this.server.create('user', { name: 'John Doe' }); - this.server.create('crate', { name: 'rand', _owner_users: [user.id] }); + this.server.create('crate', { name: 'rand', userOwners: [user] }); let response = await fetch('/api/v1/crates/rand/owner_user'); assert.equal(response.status, 200); From bf34146fe258ee084de85d825d86333ecd48c5fa Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Wed, 15 Jan 2020 18:07:07 +0100 Subject: [PATCH 9/9] mirage/crate: Replace `_owner_teams` property with `teamOwners` relationship --- mirage/factories/crate.js | 1 - mirage/fixtures/crates.js | 2 +- mirage/models/crate.js | 1 + mirage/route-handlers/crates.js | 4 +--- mirage/serializers/crate.js | 1 + tests/mirage/crates-test.js | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mirage/factories/crate.js b/mirage/factories/crate.js index 2a1a289fe1f..a9d7f96f308 100644 --- a/mirage/factories/crate.js +++ b/mirage/factories/crate.js @@ -24,5 +24,4 @@ export default Factory.extend({ badges: () => [], _extra_downloads: () => [], - _owner_teams: () => [], }); diff --git a/mirage/fixtures/crates.js b/mirage/fixtures/crates.js index 5015917c87b..fa5c64d8c22 100644 --- a/mirage/fixtures/crates.js +++ b/mirage/fixtures/crates.js @@ -57,7 +57,7 @@ export default [ downloads: 14, }, ], - _owner_teams: [1, 303], + teamOwnerIds: [1, 303], userOwnerIds: [2, 303], }, { diff --git a/mirage/models/crate.js b/mirage/models/crate.js index 9711b5b09f0..74fb5b5d816 100644 --- a/mirage/models/crate.js +++ b/mirage/models/crate.js @@ -3,6 +3,7 @@ import { Model, hasMany } from 'ember-cli-mirage'; export default Model.extend({ categories: hasMany(), keywords: hasMany(), + teamOwners: hasMany('team'), versions: hasMany(), userOwners: hasMany('user'), }); diff --git a/mirage/route-handlers/crates.js b/mirage/route-handlers/crates.js index bf9bb3d52ab..45472b63c46 100644 --- a/mirage/route-handlers/crates.js +++ b/mirage/route-handlers/crates.js @@ -113,9 +113,7 @@ export function register(server) { let crate = schema.crates.find(crateId); if (!crate) return notFound(); - let teams = schema.teams.find(crate._owner_teams); - - let response = this.serialize(teams); + let response = this.serialize(crate.teamOwners); response.teams.forEach(team => { team.kind = 'team'; diff --git a/mirage/serializers/crate.js b/mirage/serializers/crate.js index 380add9c9b3..b14261e8b52 100644 --- a/mirage/serializers/crate.js +++ b/mirage/serializers/crate.js @@ -55,6 +55,7 @@ export default BaseSerializer.extend({ hash.versions = hash.version_ids; delete hash.version_ids; + delete hash.team_owner_ids; delete hash.user_owner_ids; }, }); diff --git a/tests/mirage/crates-test.js b/tests/mirage/crates-test.js index 4784120e0b5..66a17859a3b 100644 --- a/tests/mirage/crates-test.js +++ b/tests/mirage/crates-test.js @@ -690,7 +690,7 @@ module('Mirage | Keywords', function(hooks) { test('returns the list of teams that own the specified crate', async function(assert) { let team = this.server.create('team', { name: 'maintainers' }); - this.server.create('crate', { name: 'rand', _owner_teams: [team.id] }); + this.server.create('crate', { name: 'rand', teamOwners: [team] }); let response = await fetch('/api/v1/crates/rand/owner_team'); assert.equal(response.status, 200);