From 58bf36676b3a1e83ad4e12533b2740335b58fc2d Mon Sep 17 00:00:00 2001 From: Stefan Penner Date: Fri, 2 Oct 2015 10:38:05 -0700 Subject: [PATCH 1/7] ember-data should provide its blueprints --- .../files/tests/unit/__path__/__test__.js | 12 +++ blueprints/model-test/index.js | 16 ++++ blueprints/model/HELP.md | 25 ++++++ .../model/files/__root__/__path__/__name__.js | 5 ++ blueprints/model/index.js | 77 +++++++++++++++++++ .../files/tests/unit/__path__/__test__.js | 15 ++++ blueprints/serializer-test/index.js | 12 +++ .../files/__root__/__path__/__name__.js | 4 + blueprints/serializer/index.js | 5 ++ .../files/tests/unit/__path__/__test__.js | 12 +++ blueprints/transform-test/index.js | 12 +++ .../files/__root__/__path__/__name__.js | 11 +++ blueprints/transform/index.js | 5 ++ index.js | 6 ++ shims/shims.js | 35 +++++++++ 15 files changed, 252 insertions(+) create mode 100644 blueprints/model-test/files/tests/unit/__path__/__test__.js create mode 100644 blueprints/model-test/index.js create mode 100644 blueprints/model/HELP.md create mode 100644 blueprints/model/files/__root__/__path__/__name__.js create mode 100644 blueprints/model/index.js create mode 100644 blueprints/serializer-test/files/tests/unit/__path__/__test__.js create mode 100644 blueprints/serializer-test/index.js create mode 100644 blueprints/serializer/files/__root__/__path__/__name__.js create mode 100644 blueprints/serializer/index.js create mode 100644 blueprints/transform-test/files/tests/unit/__path__/__test__.js create mode 100644 blueprints/transform-test/index.js create mode 100644 blueprints/transform/files/__root__/__path__/__name__.js create mode 100644 blueprints/transform/index.js create mode 100644 shims/shims.js diff --git a/blueprints/model-test/files/tests/unit/__path__/__test__.js b/blueprints/model-test/files/tests/unit/__path__/__test__.js new file mode 100644 index 00000000000..88003fc2be8 --- /dev/null +++ b/blueprints/model-test/files/tests/unit/__path__/__test__.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('<%= dasherizedModuleName %>', '<%= friendlyDescription %>', { + // Specify the other units that are required for this test. +<%= typeof needs !== 'undefined' ? needs : '' %> +}); + +test('it exists', function(assert) { + var model = this.subject(); + // var store = this.store(); + assert.ok(!!model); +}); diff --git a/blueprints/model-test/index.js b/blueprints/model-test/index.js new file mode 100644 index 00000000000..d85bd57e38b --- /dev/null +++ b/blueprints/model-test/index.js @@ -0,0 +1,16 @@ +/*jshint node:true*/ + +var ModelBlueprint = require('../model'); +var testInfo = require('ember-cli-test-info'); + +module.exports = { + description: 'Generates a model unit test.', + + locals: function(options) { + var result = ModelBlueprint.locals.apply(this, arguments); + + result.friendlyDescription = testInfo.description(options.entity.name, "Unit", "Model"); + + return result; + } +}; diff --git a/blueprints/model/HELP.md b/blueprints/model/HELP.md new file mode 100644 index 00000000000..78bd0af7d43 --- /dev/null +++ b/blueprints/model/HELP.md @@ -0,0 +1,25 @@ +You may generate models with as many attrs as you would like to pass. The following attribute types are supported: + + :array + :boolean + :date + :object + :number + :string + :your-custom-transform + :belongs-to: + :has-many: + +For instance: \`ember generate model taco filling:belongs-to:protein toppings:has-many:toppings name:string price:number misc\` +would result in the following model: + +```js +import DS from 'ember-data'; +export default DS.Model.extend({ + filling: DS.belongsTo('protein'), + toppings: DS.hasMany('topping'), + name: DS.attr('string'), + price: DS.attr('number'), + misc: DS.attr() +}); +``` diff --git a/blueprints/model/files/__root__/__path__/__name__.js b/blueprints/model/files/__root__/__path__/__name__.js new file mode 100644 index 00000000000..c1b8b8fac45 --- /dev/null +++ b/blueprints/model/files/__root__/__path__/__name__.js @@ -0,0 +1,5 @@ +import DS from 'ember-data'; + +export default DS.Model.extend({ + <%= attrs %> +}); diff --git a/blueprints/model/index.js b/blueprints/model/index.js new file mode 100644 index 00000000000..5acd699db5a --- /dev/null +++ b/blueprints/model/index.js @@ -0,0 +1,77 @@ +/*jshint node:true*/ + +var inflection = require('inflection'); +var stringUtils = require('ember-cli-string-utils'); +var EOL = require('os').EOL; + +module.exports = { + description: 'Generates an ember-data model.', + + anonymousOptions: [ + 'name', + 'attr:type' + ], + + locals: function(options) { + var attrs = []; + var needs = []; + var entityOptions = options.entity.options; + + for (var name in entityOptions) { + var type = entityOptions[name] || ''; + var foreignModel = name; + if (type.indexOf(':') > -1) { + foreignModel = type.split(':')[1]; + type = type.split(':')[0]; + } + var dasherizedName = stringUtils.dasherize(name); + var dasherizedNameSingular = inflection.singularize(dasherizedName); + var camelizedName = stringUtils.camelize(name); + var dasherizedType = stringUtils.dasherize(type); + var dasherizedForeignModel = stringUtils.dasherize(foreignModel); + var dasherizedForeignModelSingular = inflection.singularize(dasherizedForeignModel); + + if (/has-many/.test(dasherizedType)) { + var camelizedNamePlural = inflection.pluralize(camelizedName); + var attr = dsAttr(dasherizedForeignModelSingular, dasherizedType); + attrs.push(camelizedNamePlural + ': ' + attr); + } else if (/belongs-to/.test(dasherizedType)) { + var attr = dsAttr(dasherizedForeignModel, dasherizedType) + attrs.push(camelizedName + ': ' + attr); + } else { + var attr = dsAttr(dasherizedName, dasherizedType) + attrs.push(camelizedName + ': ' + attr); + } + + if (/has-many|belongs-to/.test(dasherizedType)) { + needs.push("'model:" + dasherizedForeignModelSingular + "'"); + } + } + var needsDeduplicated = needs.filter(function(need, i) { + return needs.indexOf(need) === i; + }) + + attrs = attrs.join(',' + EOL + ' '); + needs = ' needs: [' + needsDeduplicated.join(', ') + ']'; + + return { + attrs: attrs, + needs: needs + }; + } +}; + +function dsAttr(name, type) { + switch (type) { + case 'belongs-to': + return 'DS.belongsTo(\'' + name + '\')'; + case 'has-many': + return 'DS.hasMany(\'' + name + '\')'; + case '': + //"If you don't specify the type of the attribute, it will be whatever was provided by the server" + //http://emberjs.com/guides/models/defining-models/ + return 'DS.attr()'; + default: + return 'DS.attr(\'' + type + '\')'; + } +} diff --git a/blueprints/serializer-test/files/tests/unit/__path__/__test__.js b/blueprints/serializer-test/files/tests/unit/__path__/__test__.js new file mode 100644 index 00000000000..55e0bd031b2 --- /dev/null +++ b/blueprints/serializer-test/files/tests/unit/__path__/__test__.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('<%= dasherizedModuleName %>', '<%= friendlyTestDescription %>', { + // Specify the other units that are required for this test. + needs: ['serializer:<%= dasherizedModuleName %>'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + var record = this.subject(); + + var serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); diff --git a/blueprints/serializer-test/index.js b/blueprints/serializer-test/index.js new file mode 100644 index 00000000000..4da25f30a64 --- /dev/null +++ b/blueprints/serializer-test/index.js @@ -0,0 +1,12 @@ +/*jshint node:true*/ + +var testInfo = require('ember-cli-test-info'); + +module.exports = { + description: 'Generates a serializer unit test.', + locals: function(options) { + return { + friendlyTestDescription: testInfo.description(options.entity.name, "Unit", "Serializer") + }; + }, +}; diff --git a/blueprints/serializer/files/__root__/__path__/__name__.js b/blueprints/serializer/files/__root__/__path__/__name__.js new file mode 100644 index 00000000000..d698ab7a750 --- /dev/null +++ b/blueprints/serializer/files/__root__/__path__/__name__.js @@ -0,0 +1,4 @@ +import DS from 'ember-data'; + +export default DS.RESTSerializer.extend({ +}); diff --git a/blueprints/serializer/index.js b/blueprints/serializer/index.js new file mode 100644 index 00000000000..bd3f41c12cd --- /dev/null +++ b/blueprints/serializer/index.js @@ -0,0 +1,5 @@ +/*jshint node:true*/ + +module.exports = { + description: 'Generates an ember-data serializer.' +}; diff --git a/blueprints/transform-test/files/tests/unit/__path__/__test__.js b/blueprints/transform-test/files/tests/unit/__path__/__test__.js new file mode 100644 index 00000000000..5b628648490 --- /dev/null +++ b/blueprints/transform-test/files/tests/unit/__path__/__test__.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('transform:<%= dasherizedModuleName %>', '<%= friendlyTestDescription %>', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var transform = this.subject(); + assert.ok(transform); +}); diff --git a/blueprints/transform-test/index.js b/blueprints/transform-test/index.js new file mode 100644 index 00000000000..59b7e9e8734 --- /dev/null +++ b/blueprints/transform-test/index.js @@ -0,0 +1,12 @@ +/*jshint node:true*/ + +var testInfo = require('ember-cli-test-info'); + +module.exports = { + description: 'Generates a transform unit test.', + locals: function(options) { + return { + friendlyTestDescription: testInfo.description(options.entity.name, "Unit", "Transform") + }; + }, +}; diff --git a/blueprints/transform/files/__root__/__path__/__name__.js b/blueprints/transform/files/__root__/__path__/__name__.js new file mode 100644 index 00000000000..3fb7bbf57e8 --- /dev/null +++ b/blueprints/transform/files/__root__/__path__/__name__.js @@ -0,0 +1,11 @@ +import DS from 'ember-data'; + +export default DS.Transform.extend({ + deserialize: function(serialized) { + return serialized; + }, + + serialize: function(deserialized) { + return deserialized; + } +}); diff --git a/blueprints/transform/index.js b/blueprints/transform/index.js new file mode 100644 index 00000000000..a258ff364ce --- /dev/null +++ b/blueprints/transform/index.js @@ -0,0 +1,5 @@ +/*jshint node:true*/ + +module.exports = { + description: 'Generates an ember-data value transform.' +}; diff --git a/index.js b/index.js index 03ae7ec4ea8..b8527540cb7 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,8 @@ /* jshint node: true */ 'use strict'; +var path = require('path'); + module.exports = { name: 'ember-data', @@ -37,6 +39,10 @@ module.exports = { } }, + blueprintsPath: function() { + return path.join(__dirname, 'blueprints'); + }, + treeForAddon: function(dir) { if (this._forceBowerUsage) { // Fakes an empty broccoli tree diff --git a/shims/shims.js b/shims/shims.js new file mode 100644 index 00000000000..8ec8e2106fa --- /dev/null +++ b/shims/shims.js @@ -0,0 +1,35 @@ +;(function() { + 'use strict'; + + function defineModule(name, value) { + define(name, [], function() { + + return { default: value }; + }); + } + + defineModule('ember-data', DS); + defineModule('ember-data/model', DS.Model); + defineModule('ember-data/serializers/rest', DS.RESTSerializer); + defineModule('ember-data/serializers/active-model', DS.ActiveModelSerializer); + defineModule('ember-data/serializers/json', DS.JSONSerializer); + defineModule('ember-data/serializers/json-api', DS.JSONAPISerializer); + defineModule('ember-data/adapters/json-api', DS.JSONAPIAdapter); + defineModule('ember-data/adapters/rest', DS.RESTAdapter); + defineModule('ember-data/adapter', DS.Adapter); + defineModule('ember-data/adapters/active-model', DS.ActiveModelAdapter); + defineModule('ember-data/store', DS.Store); + defineModule('ember-data/transform', DS.Transform); + defineModule('ember-data/attr', DS.attr); + define('ember-data/relationships', [], function() { + return { + hasMany: DS.hasMany, + belongsTo: DS.belongsTo + }; + }); + + if (Ember.Test) { + defineModule('ember-test/adapter', Ember.Test.Adapter); + defineModule('ember-test/qunit-adapter', Ember.Test.QUnitAdapter); + } +}()); From 1d936c6427916742971c0bfd7ae4c461da080b43 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 14 Dec 2015 18:24:14 -0500 Subject: [PATCH 2/7] Remove unused `shims` file. These shims are already provided by `lib/ember-data-shims.js`. --- shims/shims.js | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 shims/shims.js diff --git a/shims/shims.js b/shims/shims.js deleted file mode 100644 index 8ec8e2106fa..00000000000 --- a/shims/shims.js +++ /dev/null @@ -1,35 +0,0 @@ -;(function() { - 'use strict'; - - function defineModule(name, value) { - define(name, [], function() { - - return { default: value }; - }); - } - - defineModule('ember-data', DS); - defineModule('ember-data/model', DS.Model); - defineModule('ember-data/serializers/rest', DS.RESTSerializer); - defineModule('ember-data/serializers/active-model', DS.ActiveModelSerializer); - defineModule('ember-data/serializers/json', DS.JSONSerializer); - defineModule('ember-data/serializers/json-api', DS.JSONAPISerializer); - defineModule('ember-data/adapters/json-api', DS.JSONAPIAdapter); - defineModule('ember-data/adapters/rest', DS.RESTAdapter); - defineModule('ember-data/adapter', DS.Adapter); - defineModule('ember-data/adapters/active-model', DS.ActiveModelAdapter); - defineModule('ember-data/store', DS.Store); - defineModule('ember-data/transform', DS.Transform); - defineModule('ember-data/attr', DS.attr); - define('ember-data/relationships', [], function() { - return { - hasMany: DS.hasMany, - belongsTo: DS.belongsTo - }; - }); - - if (Ember.Test) { - defineModule('ember-test/adapter', Ember.Test.Adapter); - defineModule('ember-test/qunit-adapter', Ember.Test.QUnitAdapter); - } -}()); From 304f0176b2b9fd434d50ebc2c440c57d602d75aa Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 14 Dec 2015 21:47:22 -0500 Subject: [PATCH 3/7] Update blueprints to match ember-cli 2.2.0-beta.1. --- .../files/tests/unit/__path__/__test__.js | 12 +++++ blueprints/adapter-test/index.js | 12 +++++ .../files/__root__/__path__/__name__.js | 4 ++ blueprints/adapter/index.js | 44 +++++++++++++++++++ .../files/tests/unit/__path__/__test__.js | 4 +- blueprints/model/index.js | 10 ++--- .../files/tests/unit/__path__/__test__.js | 4 +- .../files/tests/unit/__path__/__test__.js | 2 +- .../files/__root__/__path__/__name__.js | 4 +- 9 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 blueprints/adapter-test/files/tests/unit/__path__/__test__.js create mode 100644 blueprints/adapter-test/index.js create mode 100644 blueprints/adapter/files/__root__/__path__/__name__.js create mode 100644 blueprints/adapter/index.js diff --git a/blueprints/adapter-test/files/tests/unit/__path__/__test__.js b/blueprints/adapter-test/files/tests/unit/__path__/__test__.js new file mode 100644 index 00000000000..739d5eb7303 --- /dev/null +++ b/blueprints/adapter-test/files/tests/unit/__path__/__test__.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('adapter:<%= dasherizedModuleName %>', '<%= friendlyTestDescription %>', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let adapter = this.subject(); + assert.ok(adapter); +}); diff --git a/blueprints/adapter-test/index.js b/blueprints/adapter-test/index.js new file mode 100644 index 00000000000..0f73ca498f6 --- /dev/null +++ b/blueprints/adapter-test/index.js @@ -0,0 +1,12 @@ +/*jshint node:true*/ + +var testInfo = require('ember-cli-test-info'); + +module.exports = { + description: 'Generates an ember-data adapter unit test', + locals: function(options) { + return { + friendlyTestDescription: testInfo.description(options.entity.name, "Unit", "Adapter") + }; + } +}; diff --git a/blueprints/adapter/files/__root__/__path__/__name__.js b/blueprints/adapter/files/__root__/__path__/__name__.js new file mode 100644 index 00000000000..2b54b829447 --- /dev/null +++ b/blueprints/adapter/files/__root__/__path__/__name__.js @@ -0,0 +1,4 @@ +<%= importStatement %> + +export default <%= baseClass %>.extend({ +}); diff --git a/blueprints/adapter/index.js b/blueprints/adapter/index.js new file mode 100644 index 00000000000..f277c3111a6 --- /dev/null +++ b/blueprints/adapter/index.js @@ -0,0 +1,44 @@ +/*jshint node:true*/ + +var stringUtil = require('ember-cli-string-utils'); +var SilentError = require('silent-error'); +var pathUtil = require('ember-cli-path-utils'); + +module.exports = { + description: 'Generates an ember-data adapter.', + + availableOptions: [ + { name: 'base-class', type: String } + ], + + locals: function(options) { + var adapterName = options.entity.name; + var baseClass = 'DS.RESTAdapter'; + var importStatement = 'import DS from \'ember-data\';'; + var isAddon = options.inRepoAddon || options.project.isEmberCLIAddon(); + var relativePath = pathUtil.getRelativePath(options.entity.name); + + if (options.pod && options.podPath) { + relativePath = pathUtil.getRelativePath(options.podPath + options.entity.name); + } + + if (!isAddon && !options.baseClass && adapterName !== 'application') { + options.baseClass = 'application'; + } + + if (options.baseClass === adapterName) { + throw new SilentError('Adapters cannot extend from themself. To resolve this, remove the `--base-class` option or change to a different base-class.'); + } + + if (options.baseClass) { + baseClass = stringUtil.classify(options.baseClass.replace('\/', '-')); + baseClass = baseClass + 'Adapter'; + importStatement = 'import ' + baseClass + ' from \'' + relativePath + options.baseClass + '\';'; + } + + return { + importStatement: importStatement, + baseClass: baseClass + }; + } +}; diff --git a/blueprints/model-test/files/tests/unit/__path__/__test__.js b/blueprints/model-test/files/tests/unit/__path__/__test__.js index 88003fc2be8..8f26bfd1b67 100644 --- a/blueprints/model-test/files/tests/unit/__path__/__test__.js +++ b/blueprints/model-test/files/tests/unit/__path__/__test__.js @@ -6,7 +6,7 @@ moduleForModel('<%= dasherizedModuleName %>', '<%= friendlyDescription %>', { }); test('it exists', function(assert) { - var model = this.subject(); - // var store = this.store(); + let model = this.subject(); + // let store = this.store(); assert.ok(!!model); }); diff --git a/blueprints/model/index.js b/blueprints/model/index.js index 5acd699db5a..1787ad788a1 100644 --- a/blueprints/model/index.js +++ b/blueprints/model/index.js @@ -25,21 +25,21 @@ module.exports = { type = type.split(':')[0]; } var dasherizedName = stringUtils.dasherize(name); - var dasherizedNameSingular = inflection.singularize(dasherizedName); var camelizedName = stringUtils.camelize(name); var dasherizedType = stringUtils.dasherize(type); var dasherizedForeignModel = stringUtils.dasherize(foreignModel); var dasherizedForeignModelSingular = inflection.singularize(dasherizedForeignModel); + var attr; if (/has-many/.test(dasherizedType)) { var camelizedNamePlural = inflection.pluralize(camelizedName); - var attr = dsAttr(dasherizedForeignModelSingular, dasherizedType); + attr = dsAttr(dasherizedForeignModelSingular, dasherizedType); attrs.push(camelizedNamePlural + ': ' + attr); } else if (/belongs-to/.test(dasherizedType)) { - var attr = dsAttr(dasherizedForeignModel, dasherizedType) + attr = dsAttr(dasherizedForeignModel, dasherizedType); attrs.push(camelizedName + ': ' + attr); } else { - var attr = dsAttr(dasherizedName, dasherizedType) + attr = dsAttr(dasherizedName, dasherizedType); attrs.push(camelizedName + ': ' + attr); } @@ -49,7 +49,7 @@ module.exports = { } var needsDeduplicated = needs.filter(function(need, i) { return needs.indexOf(need) === i; - }) + }); attrs = attrs.join(',' + EOL + ' '); needs = ' needs: [' + needsDeduplicated.join(', ') + ']'; diff --git a/blueprints/serializer-test/files/tests/unit/__path__/__test__.js b/blueprints/serializer-test/files/tests/unit/__path__/__test__.js index 55e0bd031b2..bfc3aa943ca 100644 --- a/blueprints/serializer-test/files/tests/unit/__path__/__test__.js +++ b/blueprints/serializer-test/files/tests/unit/__path__/__test__.js @@ -7,9 +7,9 @@ moduleForModel('<%= dasherizedModuleName %>', '<%= friendlyTestDescription %>', // Replace this with your real tests. test('it serializes records', function(assert) { - var record = this.subject(); + let record = this.subject(); - var serializedRecord = record.serialize(); + let serializedRecord = record.serialize(); assert.ok(serializedRecord); }); diff --git a/blueprints/transform-test/files/tests/unit/__path__/__test__.js b/blueprints/transform-test/files/tests/unit/__path__/__test__.js index 5b628648490..ef14ae150b3 100644 --- a/blueprints/transform-test/files/tests/unit/__path__/__test__.js +++ b/blueprints/transform-test/files/tests/unit/__path__/__test__.js @@ -7,6 +7,6 @@ moduleFor('transform:<%= dasherizedModuleName %>', '<%= friendlyTestDescription // Replace this with your real tests. test('it exists', function(assert) { - var transform = this.subject(); + let transform = this.subject(); assert.ok(transform); }); diff --git a/blueprints/transform/files/__root__/__path__/__name__.js b/blueprints/transform/files/__root__/__path__/__name__.js index 3fb7bbf57e8..722408742d7 100644 --- a/blueprints/transform/files/__root__/__path__/__name__.js +++ b/blueprints/transform/files/__root__/__path__/__name__.js @@ -1,11 +1,11 @@ import DS from 'ember-data'; export default DS.Transform.extend({ - deserialize: function(serialized) { + deserialize(serialized) { return serialized; }, - serialize: function(deserialized) { + serialize(deserialized) { return deserialized; } }); From 7066d77c4b8ef25ee9de99914323cf0e58934328 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 14 Dec 2015 18:28:04 -0500 Subject: [PATCH 4/7] Add missing dependencies. --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 935d77278d7..c4f202ec43d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,10 @@ "broccoli-merge-trees": "^1.0.0", "chalk": "^1.1.1", "ember-cli-babel": "^5.1.3", - "ember-cli-version-checker": "^1.1.4" + "ember-cli-string-utils": "^1.0.0", + "ember-cli-test-info": "^1.0.0", + "ember-cli-version-checker": "^1.1.4", + "inflection": "^1.8.0" }, "devDependencies": { "babel-plugin-feature-flags": "^0.2.0", From 3446090ff474dc1601025c0b7659d45c6ba7c5bf Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 14 Dec 2015 21:15:27 -0500 Subject: [PATCH 5/7] Ensure `config/features.json` works with different cwd. --- tests/dummy/config/environment.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index f367c52449c..9cd862b02ca 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -1,7 +1,9 @@ /* jshint node: true */ var fs = require('fs'); -var featuresJson = fs.readFileSync('config/features.json', { encoding: 'utf8' }); +var path = require('path'); +var featuresJsonPath = path.join(__dirname, '../../../config/features.json'); +var featuresJson = fs.readFileSync(featuresJsonPath, { encoding: 'utf8' }); var featureFlags = JSON.parse(featuresJson); module.exports = function(environment) { From 7f03ec70ff41739af51ffc8e2e14a96f8f3e0878 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 14 Dec 2015 21:23:17 -0500 Subject: [PATCH 6/7] Add tests for blueprints. --- .travis.yml | 1 + node-tests/blueprints/adapter-test.js | 40 ++++++++++++++++++++++ node-tests/blueprints/model-test.js | 40 ++++++++++++++++++++++ node-tests/blueprints/serializer-test.js | 40 ++++++++++++++++++++++ node-tests/blueprints/transform-test.js | 42 ++++++++++++++++++++++++ package.json | 9 +++-- 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 node-tests/blueprints/adapter-test.js create mode 100644 node-tests/blueprints/model-test.js create mode 100644 node-tests/blueprints/serializer-test.js create mode 100644 node-tests/blueprints/transform-test.js diff --git a/.travis.yml b/.travis.yml index ad55c004238..1f3eff604a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ script: - ./bin/lint-features - npm run-script test - npm run-script test:optional-features + - npm run-script node-tests after_success: - npm run-script production - "./bin/bower-ember-data-build" diff --git a/node-tests/blueprints/adapter-test.js b/node-tests/blueprints/adapter-test.js new file mode 100644 index 00000000000..d57b54a6119 --- /dev/null +++ b/node-tests/blueprints/adapter-test.js @@ -0,0 +1,40 @@ +var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup'); +var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper'); +var generateAndDestroy = BlueprintHelpers.generateAndDestroy; + +describe('Acceptance: generate and destroy adapter blueprints', function() { + setupTestHooks(this); + + it('adapter', function() { + return generateAndDestroy(['adapter', 'foo'], { + files: [ + { + file: 'app/adapters/foo.js', + contains: [ + 'import ApplicationAdapter from \'./application\';', + 'export default ApplicationAdapter.extend({' + ] + }, + { + file: 'tests/unit/adapters/foo-test.js', + contains: [ + 'moduleFor(\'adapter:foo\'' + ] + } + ] + }); + }); + + it('adapter-test', function() { + return generateAndDestroy(['adapter-test', 'foo'], { + files: [ + { + file: 'tests/unit/adapters/foo-test.js', + contains: [ + 'moduleFor(\'adapter:foo\'' + ] + } + ] + }); + }); +}); diff --git a/node-tests/blueprints/model-test.js b/node-tests/blueprints/model-test.js new file mode 100644 index 00000000000..9dbe6213a92 --- /dev/null +++ b/node-tests/blueprints/model-test.js @@ -0,0 +1,40 @@ +var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup'); +var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper'); +var generateAndDestroy = BlueprintHelpers.generateAndDestroy; + +describe('Acceptance: generate and destroy model blueprints', function() { + setupTestHooks(this); + + it('model', function() { + return generateAndDestroy(['model', 'foo'], { + files: [ + { + file: 'app/models/foo.js', + contains: [ + 'import DS from \'ember-data\';', + 'export default DS.Model.extend(' + ] + }, + { + file: 'tests/unit/models/foo-test.js', + contains: [ + 'moduleForModel(\'foo\'' + ] + } + ] + }); + }); + + it('model-test', function() { + return generateAndDestroy(['model-test', 'foo'], { + files: [ + { + file: 'tests/unit/models/foo-test.js', + contains: [ + 'moduleForModel(\'foo\'' + ] + } + ] + }); + }); +}); diff --git a/node-tests/blueprints/serializer-test.js b/node-tests/blueprints/serializer-test.js new file mode 100644 index 00000000000..cdea2670704 --- /dev/null +++ b/node-tests/blueprints/serializer-test.js @@ -0,0 +1,40 @@ +var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup'); +var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper'); +var generateAndDestroy = BlueprintHelpers.generateAndDestroy; + +describe('Acceptance: generate and destroy serializer blueprints', function() { + setupTestHooks(this); + + it('serializer', function() { + return generateAndDestroy(['serializer', 'foo'], { + files: [ + { + file: 'app/serializers/foo.js', + contains: [ + 'import DS from \'ember-data\';', + 'export default DS.RESTSerializer.extend(' + ] + }, + { + file: 'tests/unit/serializers/foo-test.js', + contains: [ + 'moduleForModel(\'foo\'' + ] + } + ] + }); + }); + + it('serializer-test', function() { + return generateAndDestroy(['serializer-test', 'foo'], { + files: [ + { + file: 'tests/unit/serializers/foo-test.js', + contains: [ + 'moduleForModel(\'foo\'' + ] + } + ] + }); + }); +}); diff --git a/node-tests/blueprints/transform-test.js b/node-tests/blueprints/transform-test.js new file mode 100644 index 00000000000..07768e44c6f --- /dev/null +++ b/node-tests/blueprints/transform-test.js @@ -0,0 +1,42 @@ +var setupTestHooks = require('ember-cli-blueprint-test-helpers/lib/helpers/setup'); +var BlueprintHelpers = require('ember-cli-blueprint-test-helpers/lib/helpers/blueprint-helper'); +var generateAndDestroy = BlueprintHelpers.generateAndDestroy; + +describe('Acceptance: generate and destroy transform blueprints', function() { + setupTestHooks(this); + + it('transform', function() { + return generateAndDestroy(['transform', 'foo'], { + files: [ + { + file: 'app/transforms/foo.js', + contains: [ + 'import DS from \'ember-data\';', + 'export default DS.Transform.extend(', + 'deserialize(serialized) {', + 'serialize(deserialized) {' + ] + }, + { + file: 'tests/unit/transforms/foo-test.js', + contains: [ + 'moduleFor(\'transform:foo\'' + ] + } + ] + }); + }); + + it('transforms-test', function() { + return generateAndDestroy(['transform-test', 'foo'], { + files: [ + { + file: 'tests/unit/transforms/foo-test.js', + contains: [ + 'moduleFor(\'transform:foo\'' + ] + } + ] + }); + }); +}); diff --git a/package.json b/package.json index c4f202ec43d..d3e7f5f1ae6 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "build": "ember build", "start": "ember server", "test": "ember try:testall", + "node-tests": "mocha node-tests/blueprints/*-test.js", "test:optional-features": "ember test --environment=test-optional-features", "bower": "bower install", "production": "ember build --environment=production" @@ -25,10 +26,12 @@ "broccoli-merge-trees": "^1.0.0", "chalk": "^1.1.1", "ember-cli-babel": "^5.1.3", + "ember-cli-path-utils": "^1.0.0", "ember-cli-string-utils": "^1.0.0", "ember-cli-test-info": "^1.0.0", "ember-cli-version-checker": "^1.1.4", - "inflection": "^1.8.0" + "inflection": "^1.8.0", + "silent-error": "^1.0.0" }, "devDependencies": { "babel-plugin-feature-flags": "^0.2.0", @@ -45,6 +48,7 @@ "broccoli-yuidoc": "^2.1.0", "ember-cli": "1.13.12", "ember-cli-app-version": "0.5.0", + "ember-cli-blueprint-test-helpers": "^0.5.0", "ember-cli-content-security-policy": "0.4.0", "ember-cli-dependency-checker": "^1.0.1", "ember-cli-htmlbars": "0.7.9", @@ -61,7 +65,8 @@ "ember-try": "0.0.6", "ember-watson": "^0.7.0", "git-repo-version": "^0.3.0", - "lodash.assign": "^3.2.0" + "lodash.assign": "^3.2.0", + "mocha": "^2.3.4" }, "peerDependencies": { "ember-inflector": "^1.9.4" From a15cbf3ca6edd7781a06b743bcfae879c6775a95 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Wed, 16 Dec 2015 03:10:03 -0500 Subject: [PATCH 7/7] Update to use ember-cli-blueprint-test-helpers@0.6.0. --- .npmignore | 1 + .../fixtures/addon/package/package.json | 51 +++++++++++++ node-tests/fixtures/app/package/package.json | 43 +++++++++++ node-tests/nodetest-runner.js | 74 +++++++++++++++++++ package.json | 10 ++- 5 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 node-tests/fixtures/addon/package/package.json create mode 100644 node-tests/fixtures/app/package/package.json create mode 100644 node-tests/nodetest-runner.js diff --git a/.npmignore b/.npmignore index c3a18d19b6e..dac217ccf9d 100644 --- a/.npmignore +++ b/.npmignore @@ -13,3 +13,4 @@ bower.json Brocfile.js testem.json *.gem +node-tests/ diff --git a/node-tests/fixtures/addon/package/package.json b/node-tests/fixtures/addon/package/package.json new file mode 100644 index 00000000000..5aaa25001a6 --- /dev/null +++ b/node-tests/fixtures/addon/package/package.json @@ -0,0 +1,51 @@ +{ + "name": "my-addon", + "version": "0.0.0", + "description": "The default blueprint for ember-cli addons.", + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember try:testall" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.1.2", + "ember-ajax": "0.6.2", + "ember-cli": "1.13.12", + "ember-cli-app-version": "^1.0.0", + "ember-cli-content-security-policy": "0.4.0", + "ember-cli-dependency-checker": "^1.1.0", + "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-inject-live-reload": "^1.3.1", + "ember-cli-qunit": "^1.0.1", + "ember-cli-release": "0.2.3", + "ember-cli-sri": "^1.0.3", + "ember-cli-uglify": "^1.2.0", + "ember-data": "2.0.0", + "ember-disable-proxy-controllers": "^1.0.0", + "ember-export-application-global": "^1.0.4", + "ember-resolver": "^2.0.2", + "ember-disable-prototype-extensions": "^1.0.0", + "ember-try": "~0.0.8", + "ember-data": "*" + }, + "keywords": [ + "ember-addon" + ], + "dependencies": { + "ember-cli-htmlbars": "^1.0.0", + "ember-cli-babel": "^5.1.3" + }, + "ember-addon": { + "configPath": "tests/dummy/config" + } +} diff --git a/node-tests/fixtures/app/package/package.json b/node-tests/fixtures/app/package/package.json new file mode 100644 index 00000000000..a97d1c6e103 --- /dev/null +++ b/node-tests/fixtures/app/package/package.json @@ -0,0 +1,43 @@ +{ + "name": "my-app", + "version": "0.0.0", + "description": "Small description for nested-project goes here", + "private": true, + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember test" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.1.2", + "ember-ajax": "0.6.2", + "ember-cli": "1.13.8", + "ember-cli-app-version": "^1.0.0", + "ember-cli-babel": "^5.1.3", + "ember-cli-content-security-policy": "0.4.0", + "ember-cli-dependency-checker": "^1.1.0", + "ember-cli-htmlbars": "^1.0.0", + "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-inject-live-reload": "^1.3.1", + "ember-cli-legacy-blueprints": "*", + "ember-cli-qunit": "^1.0.1", + "ember-cli-release": "0.2.3", + "ember-cli-sri": "^1.0.3", + "ember-cli-uglify": "^1.2.0", + "ember-data": "2.0.0", + "ember-disable-proxy-controllers": "^1.0.0", + "ember-export-application-global": "^1.0.4", + "ember-resolver": "^2.0.2", + "ember-data": "*" + } +} diff --git a/node-tests/nodetest-runner.js b/node-tests/nodetest-runner.js new file mode 100644 index 00000000000..0cdde7a897f --- /dev/null +++ b/node-tests/nodetest-runner.js @@ -0,0 +1,74 @@ +'use strict'; + +var glob = require('glob'); +var Mocha = require('mocha'); +var Promise = require('ember-cli/lib/ext/promise'); +var rimraf = require('rimraf'); +var mochaOnlyDetector = require('mocha-only-detector'); + +if (process.env.EOLNEWLINE) { + require('os').EOL = '\n'; +} + +rimraf.sync('.node_modules-tmp'); +rimraf.sync('.bower_components-tmp'); + +var root = 'node-tests/{blueprints,acceptance,unit}'; +var _checkOnlyInTests = Promise.denodeify(mochaOnlyDetector.checkFolder.bind(null, root + '/**/*{-test}.js')); +var optionOrFile = process.argv[2]; +var mocha = new Mocha({ + timeout: 5000, + reporter: 'spec' +}); +var testFiles = glob.sync(root + '**/*-test.js'); +/*var jshintPosition = testFiles.indexOf('tests/unit/jshint-test.js'); +var jshint = testFiles.splice(jshintPosition, 1); + +testFiles = jshint.concat(testFiles); +*/ +if (optionOrFile === 'all') { + addFiles(mocha, testFiles); + addFiles(mocha, 'node-tests/**/*-test.js'); + addFiles(mocha, '/**/*-test-slow.js'); +} else if (process.argv.length > 2) { + addFiles(mocha, process.argv.slice(2)); +} else { + addFiles(mocha, testFiles); +} + +function addFiles(mocha, files) { + files = (typeof files === 'string') ? glob.sync(root + files) : files; + files.forEach(mocha.addFile.bind(mocha)); +} + +function checkOnlyInTests() { + console.log('Verifing `.only` in tests'); + return _checkOnlyInTests().then(function() { + console.log('No `.only` found'); + }); +} + +function runMocha() { + mocha.run(function(failures) { + process.on('exit', function() { + process.exit(failures); + }); + }); +} + +function ciVerificationStep() { + if (process.env.CI === 'true') { + return checkOnlyInTests(); + } else { + return Promise.resolve(); + } +} + +ciVerificationStep() + .then(function() { + runMocha(); + }) + .catch(function(error) { + console.error(error); + process.exit(1); + }); diff --git a/package.json b/package.json index d3e7f5f1ae6..32081531e83 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "ember build", "start": "ember server", "test": "ember try:testall", - "node-tests": "mocha node-tests/blueprints/*-test.js", + "node-tests": "node node-tests/nodetest-runner.js", "test:optional-features": "ember test --environment=test-optional-features", "bower": "bower install", "production": "ember build --environment=production" @@ -48,13 +48,14 @@ "broccoli-yuidoc": "^2.1.0", "ember-cli": "1.13.12", "ember-cli-app-version": "0.5.0", - "ember-cli-blueprint-test-helpers": "^0.5.0", + "ember-cli-blueprint-test-helpers": "^0.6.0", "ember-cli-content-security-policy": "0.4.0", "ember-cli-dependency-checker": "^1.0.1", "ember-cli-htmlbars": "0.7.9", "ember-cli-htmlbars-inline-precompile": "^0.2.0", "ember-cli-ic-ajax": "0.2.1", "ember-cli-inject-live-reload": "^1.3.1", + "ember-cli-internal-test-helpers": "^0.5.0", "ember-cli-qunit": "^1.0.0", "ember-cli-release": "0.2.3", "ember-cli-uglify": "^1.2.0", @@ -65,8 +66,11 @@ "ember-try": "0.0.6", "ember-watson": "^0.7.0", "git-repo-version": "^0.3.0", + "glob": "^5.0.13", "lodash.assign": "^3.2.0", - "mocha": "^2.3.4" + "mocha": "^2.3.4", + "mocha-only-detector": "0.0.2", + "rimraf": "^2.3.2" }, "peerDependencies": { "ember-inflector": "^1.9.4"