diff --git a/bower.json b/bower.json index aeda0dd..05d1e41 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,9 @@ { "name": "ember-model", - "version": "0.0.18", + "version": "0.0.22-intercom", "main": "ember-model.js", "dependencies": { - "ember": "2.0.3" + "ember": "2.8.3" }, "devDependencies": { "qunit": "~1.11" @@ -14,6 +14,6 @@ "components" ], "resolutions": { - "ember": "2.0.3" + "ember": "2.8.3" } } diff --git a/ember-model.js b/ember-model.js index abb9424..aed3c79 100644 --- a/ember-model.js +++ b/ember-model.js @@ -1,6 +1,6 @@ (function() { -var VERSION = '0.0.17'; +var VERSION = '0.0.22-intercom'; if (Ember.libraries) { Ember.libraries.register('Ember Model', VERSION); @@ -191,7 +191,7 @@ Ember.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, { var modelClass = this.get('modelClass'), self = this, promises; - + set(this, 'isLoaded', false); if (modelClass._findAllRecordArray === this) { return modelClass.adapter.findAll(modelClass, this); @@ -249,7 +249,7 @@ Ember.FilteredRecordArray = Ember.RecordArray.extend({ updateFilterForRecord: function(record) { var results = get(this, 'content'); - if (this.filterFunction(record) && !results.contains(record)) { + if (this.filterFunction(record) && !results.includes(record)) { results.pushObject(record); } }, @@ -271,6 +271,7 @@ Ember.FilteredRecordArray = Ember.RecordArray.extend({ } }); + })(); (function() { @@ -303,7 +304,7 @@ Ember.ManyArray = Ember.RecordArray.extend({ var isDirty = false; for (var i = 0, l = contentLength; i < l; i++) { - if (!originalContent.contains(content[i])) { + if (!originalContent.includes(content[i])) { isDirty = true; break; } @@ -315,7 +316,7 @@ Ember.ManyArray = Ember.RecordArray.extend({ objectAtContent: function(idx) { var content = get(this, 'content'); - if (!content.length) { return; } + if (!content.length || idx >= content.length) { return; } // need to add observer if it wasn't materialized before var observerNeeded = (content[idx].record) ? false : true; @@ -1418,9 +1419,9 @@ function getType(record) { this.type = get(Ember.lookup, this.type); if (!this.type) { - var store = record.container.lookup('store:main'); - this.type = store.modelFor(type); - this.type.reopenClass({ adapter: store.adapterFor(type) }); + var emstore = record.container.lookup('emstore:main'); + this.type = emstore.modelFor(type); + this.type.reopenClass({ adapter: emstore.adapterFor(type) }); } } @@ -1480,7 +1481,7 @@ var get = Ember.get, function storeFor(record) { if (record.container) { - return record.container.lookup('store:main'); + return record.container.lookup('emstore:main'); } return null; @@ -1493,9 +1494,9 @@ function getType(record) { type = Ember.get(Ember.lookup, this.type); if (!type) { - var store = storeFor(record); - type = store.modelFor(this.type); - type.reopenClass({ adapter: store.adapterFor(this.type) }); + var emstore = storeFor(record); + type = emstore.modelFor(this.type); + type.reopenClass({ adapter: emstore.adapterFor(this.type) }); } } @@ -1523,8 +1524,8 @@ Ember.belongsTo = function(type, options) { } }; - var store = storeFor(this), - value = this.getBelongsTo(key, type, meta, store); + var emstore = storeFor(this), + value = this.getBelongsTo(key, type, meta, emstore); this._registerBelongsTo(meta); if (value !== null && meta.options.embedded) { value.get('isDirty'); // getter must be called before adding observer @@ -1583,7 +1584,7 @@ Ember.belongsTo = function(type, options) { }; Ember.Model.reopen({ - getBelongsTo: function(key, type, meta, store) { + getBelongsTo: function(key, type, meta, emstore) { var idOrAttrs = get(this, '_data.' + key), record; @@ -1597,8 +1598,8 @@ Ember.Model.reopen({ record = type.create({ isLoaded: false, id: id, container: this.container }); record.load(id, idOrAttrs); } else { - if (store) { - record = store._findSync(meta.type, idOrAttrs); + if (emstore) { + record = emstore._findSync(meta.type, idOrAttrs); } else { record = type.find(idOrAttrs); } @@ -2036,11 +2037,11 @@ var DebugAdapter = Ember.DataAdapter.extend({ Ember.onLoad('Ember.Application', function(Application) { Application.initializer({ - name: "data-adapter", + name: "em-data-adapter", initialize: function() { var application = arguments[1] || arguments[0]; - application.register('data-adapter:main', DebugAdapter); + application.register('em-data-adapter:main', DebugAdapter); } }); }); @@ -2111,20 +2112,20 @@ Ember.Model.Store = Ember.Object.extend({ Ember.onLoad('Ember.Application', function(Application) { Application.initializer({ - name: "store", + name: "emstore", initialize: function() { var application = arguments[1] || arguments[0]; - var store = application.Store || Ember.Model.Store; - application.register('store:application', store); - application.register('store:main', store); + var emstore = application.Store || Ember.Model.Store; + application.register('emstore:application', emstore); + application.register('emstore:main', emstore); - application.inject('route', 'store', 'store:main'); - application.inject('controller', 'store', 'store:main'); + application.inject('route', 'emstore', 'emstore:main'); + application.inject('controller', 'emstore', 'emstore:main'); } }); }); -})(); \ No newline at end of file +})(); diff --git a/package.json b/package.json index 98e37e5..59bfc92 100644 --- a/package.json +++ b/package.json @@ -32,5 +32,5 @@ "grunt-contrib-watch": "~0.4.4", "grunt-ember-s3": "~1.0.2" }, - "version": "0.0.18" + "version": "0.0.22-intercom" } diff --git a/packages/ember-model/lib/belongs_to.js b/packages/ember-model/lib/belongs_to.js index 36e4751..013553a 100644 --- a/packages/ember-model/lib/belongs_to.js +++ b/packages/ember-model/lib/belongs_to.js @@ -4,7 +4,7 @@ var get = Ember.get, function storeFor(record) { if (record.container) { - return record.container.lookup('store:main'); + return record.container.lookup('emstore:main'); } return null; @@ -17,9 +17,9 @@ function getType(record) { type = Ember.get(Ember.lookup, this.type); if (!type) { - var store = storeFor(record); - type = store.modelFor(this.type); - type.reopenClass({ adapter: store.adapterFor(this.type) }); + var emstore = storeFor(record); + type = emstore.modelFor(this.type); + type.reopenClass({ adapter: emstore.adapterFor(this.type) }); } } @@ -47,8 +47,8 @@ Ember.belongsTo = function(type, options) { } }; - var store = storeFor(this), - value = this.getBelongsTo(key, type, meta, store); + var emstore = storeFor(this), + value = this.getBelongsTo(key, type, meta, emstore); this._registerBelongsTo(meta); if (value !== null && meta.options.embedded) { value.get('isDirty'); // getter must be called before adding observer @@ -107,7 +107,7 @@ Ember.belongsTo = function(type, options) { }; Ember.Model.reopen({ - getBelongsTo: function(key, type, meta, store) { + getBelongsTo: function(key, type, meta, emstore) { var idOrAttrs = get(this, '_data.' + key), record; @@ -121,8 +121,8 @@ Ember.Model.reopen({ record = type.create({ isLoaded: false, id: id, container: this.container }); record.load(id, idOrAttrs); } else { - if (store) { - record = store._findSync(meta.type, idOrAttrs); + if (emstore) { + record = emstore._findSync(meta.type, idOrAttrs); } else { record = type.find(idOrAttrs); } diff --git a/packages/ember-model/lib/debug_adapter.js b/packages/ember-model/lib/debug_adapter.js index 57384cf..cc82bc2 100644 --- a/packages/ember-model/lib/debug_adapter.js +++ b/packages/ember-model/lib/debug_adapter.js @@ -105,11 +105,11 @@ var DebugAdapter = Ember.DataAdapter.extend({ Ember.onLoad('Ember.Application', function(Application) { Application.initializer({ - name: "data-adapter", + name: "em-data-adapter", initialize: function() { var application = arguments[1] || arguments[0]; - application.register('data-adapter:main', DebugAdapter); + application.register('em-data-adapter:main', DebugAdapter); } }); }); diff --git a/packages/ember-model/lib/filtered_record_array.js b/packages/ember-model/lib/filtered_record_array.js index ca2c7c3..2977ae9 100644 --- a/packages/ember-model/lib/filtered_record_array.js +++ b/packages/ember-model/lib/filtered_record_array.js @@ -36,7 +36,7 @@ Ember.FilteredRecordArray = Ember.RecordArray.extend({ updateFilterForRecord: function(record) { var results = get(this, 'content'); - if (this.filterFunction(record) && !results.contains(record)) { + if (this.filterFunction(record) && !results.includes(record)) { results.pushObject(record); } }, @@ -56,4 +56,4 @@ Ember.FilteredRecordArray = Ember.RecordArray.extend({ record.addObserver(filterProperties[i], self, 'updateFilterForRecord'); } } -}); \ No newline at end of file +}); diff --git a/packages/ember-model/lib/has_many.js b/packages/ember-model/lib/has_many.js index aa5652c..a2ee68c 100644 --- a/packages/ember-model/lib/has_many.js +++ b/packages/ember-model/lib/has_many.js @@ -8,9 +8,9 @@ function getType(record) { this.type = get(Ember.lookup, this.type); if (!this.type) { - var store = record.container.lookup('store:main'); - this.type = store.modelFor(type); - this.type.reopenClass({ adapter: store.adapterFor(type) }); + var emstore = record.container.lookup('emstore:main'); + this.type = emstore.modelFor(type); + this.type.reopenClass({ adapter: emstore.adapterFor(type) }); } } diff --git a/packages/ember-model/lib/has_many_array.js b/packages/ember-model/lib/has_many_array.js index c4ead7d..876f0f9 100644 --- a/packages/ember-model/lib/has_many_array.js +++ b/packages/ember-model/lib/has_many_array.js @@ -26,7 +26,7 @@ Ember.ManyArray = Ember.RecordArray.extend({ var isDirty = false; for (var i = 0, l = contentLength; i < l; i++) { - if (!originalContent.contains(content[i])) { + if (!originalContent.includes(content[i])) { isDirty = true; break; } @@ -38,7 +38,7 @@ Ember.ManyArray = Ember.RecordArray.extend({ objectAtContent: function(idx) { var content = get(this, 'content'); - if (!content.length) { return; } + if (!content.length || idx >= content.length) { return; } // need to add observer if it wasn't materialized before var observerNeeded = (content[idx].record) ? false : true; diff --git a/packages/ember-model/lib/rest_adapter.js b/packages/ember-model/lib/rest_adapter.js index 133da60..c133c48 100644 --- a/packages/ember-model/lib/rest_adapter.js +++ b/packages/ember-model/lib/rest_adapter.js @@ -154,7 +154,7 @@ Ember.RESTAdapter = Ember.Adapter.extend({ Ember.$.ajax(settings); - }); + }, 'ember-model: RESTAdapter#ajax ' + method + ' to ' + url); }, _handleRejections: function(method, jqXHR, resolve, reject) { diff --git a/packages/ember-model/lib/store.js b/packages/ember-model/lib/store.js index f273129..0a9d57b 100644 --- a/packages/ember-model/lib/store.js +++ b/packages/ember-model/lib/store.js @@ -1,7 +1,7 @@ function NIL() {} Ember.Model.Store = Ember.Object.extend({ - container: null, + //container: null, //NOTE: GJ: see https://github.com/emberjs/ember.js/issues/15322#issuecomment-334132107 modelFor: function(type) { return this.container.lookupFactory('model:'+type); @@ -59,16 +59,16 @@ Ember.Model.Store = Ember.Object.extend({ Ember.onLoad('Ember.Application', function(Application) { Application.initializer({ - name: "store", + name: "emstore", initialize: function() { var application = arguments[1] || arguments[0]; var store = application.Store || Ember.Model.Store; - application.register('store:application', store); - application.register('store:main', store); + application.register('emstore:application', store); + application.register('emstore:main', store); - application.inject('route', 'store', 'store:main'); - application.inject('controller', 'store', 'store:main'); + application.inject('route', 'emstore', 'emstore:main'); + application.inject('controller', 'emstore', 'emstore:main'); } }); diff --git a/packages/ember-model/lib/version.js b/packages/ember-model/lib/version.js index bf48e06..11963d9 100644 --- a/packages/ember-model/lib/version.js +++ b/packages/ember-model/lib/version.js @@ -1,4 +1,4 @@ -var VERSION = '0.0.17'; +var VERSION = '0.0.22-intercom'; if (Ember.libraries) { Ember.libraries.register('Ember Model', VERSION); diff --git a/packages/ember-model/tests/adapter/find_query_test.js b/packages/ember-model/tests/adapter/find_query_test.js index 3198002..237287e 100644 --- a/packages/ember-model/tests/adapter/find_query_test.js +++ b/packages/ember-model/tests/adapter/find_query_test.js @@ -19,7 +19,7 @@ test(".find({}) delegates to the adapter's findQuery method", function() { var records = Model.find({query: "derp"}); ok(records instanceof Ember.RecordArray, "RecordArray is returned"); ok(!records.get('isLoaded'), "RecordArray isn't initially loaded"); - ok(!(Model.recordArrays || Ember.A()).contains(records), "The RecordArray created by a findQuery should not be registered"); + ok(!(Model.recordArrays || Ember.A()).includes(records), "The RecordArray created by a findQuery should not be registered"); stop(); records.one('didLoad', function() { @@ -27,4 +27,3 @@ test(".find({}) delegates to the adapter's findQuery method", function() { ok(records.get('isLoaded'), "RecordArray is loaded after resolved"); }); }); - diff --git a/packages/ember-model/tests/belongs_to_test.js b/packages/ember-model/tests/belongs_to_test.js index d7a56f2..19a6549 100644 --- a/packages/ember-model/tests/belongs_to_test.js +++ b/packages/ember-model/tests/belongs_to_test.js @@ -335,7 +335,7 @@ test("should be able to set nonembedded relationship to null", function() { }); equal(post.get('author'), null); - deepEqual(post.toJSON(), {id: 1, author_id: null}); + deepEqual(post.toJSON(), {id: 1, author_id: undefined}); }); test("materializing the relationship should should not dirty the record", function() { @@ -721,4 +721,4 @@ test("non embedded belongsTo should return a record with a container", function( var article = Ember.run(comment, comment.get, 'article'); ok(article.get('container')); Ember.run(App, 'destroy'); -}); \ No newline at end of file +}); diff --git a/packages/ember-model/tests/has_many/manipulation_test.js b/packages/ember-model/tests/has_many/manipulation_test.js index 51e6339..97c2640 100644 --- a/packages/ember-model/tests/has_many/manipulation_test.js +++ b/packages/ember-model/tests/has_many/manipulation_test.js @@ -2,6 +2,91 @@ var attr = Ember.attr; module("Ember.HasManyArray - manipulation"); +test('objectAtContent returns the element in the given index', function() { + var json = { + id: 1, + title: 'foo', + comments: [1, 2] + }; + + var Comment = Ember.Model.extend({ + text: attr() + }); + + var Article = Ember.Model.extend({ + title: attr(), + + comments: Ember.hasMany(Comment, { key: 'comments' }) + }); + + Comment.adapter = Ember.FixtureAdapter.create(); + Comment.FIXTURES = [ + {id: 1, text: 'uno'}, + {id: 2, text: 'dos'}, + ]; + + var article = Article.create(); + Ember.run(article, article.load, json.id, json); + + equal(article.get('comments.length'), 2, 'has two elements'); + equal(article.get('comments').objectAt(1).get('id'), 2, 'returns the right element'); +}); + + +test('objectAtContent returns undefined when there\'s no content', function() { + var json = { + id: 1, + title: 'foo', + comments: [] + }; + + var Comment = Ember.Model.extend({ + text: attr() + }); + + var Article = Ember.Model.extend({ + title: attr(), + + comments: Ember.hasMany(Comment, { key: 'comments' }) + }); + + var article = Article.create(); + Ember.run(article, article.load, json.id, json); + + equal(article.get('comments.length'), 0, 'has no elements'); + equal(article.get('comments').objectAt(1), undefined, 'returns undefined'); +}); + + +test('objectAtContent returns undefined for an out of bounds index', function() { + var json = { + id: 1, + title: 'foo', + comments: [1] + }; + + var Comment = Ember.Model.extend({ + text: attr() + }); + + var Article = Ember.Model.extend({ + title: attr(), + + comments: Ember.hasMany(Comment, { key: 'comments' }) + }); + + Comment.adapter = Ember.FixtureAdapter.create(); + Comment.FIXTURES = [ + {id: 1, text: 'uno'} + ]; + + var article = Article.create(); + Ember.run(article, article.load, json.id, json); + + equal(article.get('comments.length'), 1, 'has one element'); + equal(article.get('comments').objectAt(1), undefined, 'returns undefined'); +}); + test("pushing record without an id adds a reference to the content", function() { var json = { id: 1, diff --git a/packages/ember-model/tests/store_test.js b/packages/ember-model/tests/store_test.js index 2072a2e..4809487 100644 --- a/packages/ember-model/tests/store_test.js +++ b/packages/ember-model/tests/store_test.js @@ -1,11 +1,11 @@ -var TestModel, EmbeddedModel, UUIDModel, store, registry, container, App; +var TestModel, EmbeddedModel, UUIDModel, emstore, registry, container, App; module("Ember.Model.Store", { setup: function() { registry = new Ember.Registry(); container = registry.container(); - store = Ember.Model.Store.create({container: container}); + emstore = Ember.Model.Store.create({container: container}); TestModel = Ember.Model.extend({ token: Ember.attr(), name: Ember.attr(), @@ -64,26 +64,26 @@ module("Ember.Model.Store", { registry.register('model:test', TestModel); registry.register('model:embedded', EmbeddedModel); registry.register('model:uuid', UUIDModel); - registry.register('store:main', Ember.Model.Store); + registry.register('emstore:main', Ember.Model.Store); } }); -test("store.createRecord(type) returns a record with a container", function() { - var record = Ember.run(store, store.createRecord, 'test'); +test("emstore.createRecord(type) returns a record with a container", function() { + var record = Ember.run(emstore, emstore.createRecord, 'test'); equal(record.container, container); equal(record.container, container); }); -test("store.createRecord(type) with properties", function() { +test("emstore.createRecord(type) with properties", function() { expect(2); - var record = Ember.run(store, store.createRecord, 'test', {token: 'c', name: 'Andrew'}); + var record = Ember.run(emstore, emstore.createRecord, 'test', {token: 'c', name: 'Andrew'}); equal(record.get('token'), 'c'); equal(record.get('name'), 'Andrew'); }); test("model.load(hashes) returns a existing record with correct container", function() { - var model = store.modelFor('uuid'), - record = Ember.run(store, store.createRecord, 'uuid'); + var model = emstore.modelFor('uuid'), + record = Ember.run(emstore, emstore.createRecord, 'uuid'); equal(model, UUIDModel); equal(record.container, container); @@ -108,9 +108,9 @@ test("model.load(hashes) returns a existing record with correct container", func equal(record.get('container'), container); }); -test("store.find(type) returns a record with hasMany and belongsTo that should all have a container", function() { +test("emstore.find(type) returns a record with hasMany and belongsTo that should all have a container", function() { expect(4); - var promise = Ember.run(store, store.find, 'test', 'a'); + var promise = Ember.run(emstore, emstore.find, 'test', 'a'); promise.then(function(record) { start(); ok(record.get('container')); @@ -123,10 +123,10 @@ test("store.find(type) returns a record with hasMany and belongsTo that should a stop(); }); -test("store.find(type, id) returns a promise and loads a container for the record", function() { +test("emstore.find(type, id) returns a promise and loads a container for the record", function() { expect(2); - var promise = Ember.run(store, store.find, 'test','a'); + var promise = Ember.run(emstore, emstore.find, 'test','a'); promise.then(function(record) { start(); ok(record.get('isLoaded')); @@ -135,10 +135,10 @@ test("store.find(type, id) returns a promise and loads a container for the recor stop(); }); -test("store.find(type) returns a promise and loads a container for each record", function() { +test("emstore.find(type) returns a promise and loads a container for each record", function() { expect(5); - var promise = Ember.run(store, store.find, 'test'); + var promise = Ember.run(emstore, emstore.find, 'test'); promise.then(function(records) { start(); equal(records.content.length, 2); @@ -150,10 +150,10 @@ test("store.find(type) returns a promise and loads a container for each record", stop(); }); -test("store.find(type, Array) returns a promise and loads a container for each record", function() { +test("emstore.find(type, Array) returns a promise and loads a container for each record", function() { expect(5); - var promise = Ember.run(store, store.find, 'test', ['a','b']); + var promise = Ember.run(emstore, emstore.find, 'test', ['a','b']); promise.then(function(records) { start(); equal(records.content.length, 2); @@ -165,45 +165,45 @@ test("store.find(type, Array) returns a promise and loads a container for each r stop(); }); -test("store.adapterFor(type) returns klass.adapter first", function() { - var adapter = Ember.run(store, store.adapterFor, 'test'); +test("emstore.adapterFor(type) returns klass.adapter first", function() { + var adapter = Ember.run(emstore, emstore.adapterFor, 'test'); equal(adapter.constructor, Ember.FixtureAdapter); }); -test("store.adapterFor(type) returns type adapter if no klass.adapter", function() { +test("emstore.adapterFor(type) returns type adapter if no klass.adapter", function() { TestModel.adapter = undefined; registry.register('adapter:test', Ember.FixtureAdapter); registry.register('adapter:application', null); - var adapter = Ember.run(store, store.adapterFor, 'test'); + var adapter = Ember.run(emstore, emstore.adapterFor, 'test'); ok(adapter instanceof Ember.FixtureAdapter); }); -test("store.adapterFor(type) returns application adapter if no klass.adapter or type adapter", function() { +test("emstore.adapterFor(type) returns application adapter if no klass.adapter or type adapter", function() { TestModel.adapter = undefined; registry.register('adapter:test', null); registry.register('adapter:application', Ember.FixtureAdapter); - var adapter = Ember.run(store, store.adapterFor, 'test'); + var adapter = Ember.run(emstore, emstore.adapterFor, 'test'); ok(adapter instanceof Ember.FixtureAdapter); }); -test("store.adapterFor(type) defaults to RESTAdapter if no adapter specified", function() { +test("emstore.adapterFor(type) defaults to RESTAdapter if no adapter specified", function() { TestModel.adapter = undefined; registry.register('adapter:test', null); registry.register('adapter:application', null); registry.register('adapter:REST', Ember.RESTAdapter); - var adapter = Ember.run(store, store.adapterFor, 'test'); + var adapter = Ember.run(emstore, emstore.adapterFor, 'test'); ok(adapter instanceof Ember.RESTAdapter); }); -test("store.find(type) records use application adapter if no klass.adapter or type adapter", function() { +test("emstore.find(type) records use application adapter if no klass.adapter or type adapter", function() { expect(3); TestModel.adapter = undefined; EmbeddedModel.adapter = undefined; registry.register('adapter:test', null); registry.register('adapter:application', Ember.FixtureAdapter); - var promise = Ember.run(store, store.find, 'test','a'); + var promise = Ember.run(emstore, emstore.find, 'test','a'); promise.then(function(record) { start(); @@ -225,11 +225,11 @@ test("Registering a custom store on application works", function() { }); container = App.__container__; - ok(container.lookup('store:application')); - ok(container.lookup('store:main').get('custom')); + ok(container.lookup('emstore:application')); + ok(container.lookup('emstore:main').get('custom')); var testRoute = container.lookup('route:test'); - ok(testRoute.get('store.custom')); + ok(testRoute.get('emstore.custom')); Ember.run(App, 'destroy'); });