ember-data-factory-guy 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/bower.json +1 -1
- data/dist/ember-data-factory-guy.js +56 -49
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/ember-data-factory-guy.gemspec +1 -1
- data/package.json +1 -1
- data/src/factory_guy_test_mixin.js +9 -2
- data/src/store.js +47 -48
- data/tests/active_model_adapter_factory_test.js +17 -5
- data/tests/fixture_adapter_factory_test.js +25 -2
- data/tests/rest_adapter_factory_test.js +18 -6
- data/tests/support/factories/property_factory.js +5 -0
- data/tests/support/models/company.js +1 -1
- data/tests/support/models/property.js +5 -0
- data/tests/support/models/user.js +3 -2
- data/tests/support/test_helper.js +1 -0
- data/tests/test_setup.js +14 -3
- data/vendor/assets/javascripts/ember_data_factory_guy.js +56 -49
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 723e4f4e01224440a3e7cd0712f0db55a470ba1c
|
4
|
+
data.tar.gz: 280d62404418dfdafbf9b3c32ca5854e94522bce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e048aefde5b3bad5d160ea20781bfe83a9a8324df0b25990dec2d74a1a1b91e95dcd402a12bddc0c479fc20285df24d71e8783c9872889408abd2040f5e4383
|
7
|
+
data.tar.gz: 6a46a70429e37ff619f4427ff90c2cbdc7820bf4ea62926b797cb729cd2a2e07428738d511308e6246a632f63b463f1fc8bb78de36d7d75a07b296d3f3abfa54
|
data/.gitignore
CHANGED
data/bower.json
CHANGED
@@ -381,12 +381,6 @@ DS.Store.reopen({
|
|
381
381
|
return adapter instanceof DS.FixtureAdapter;
|
382
382
|
},
|
383
383
|
|
384
|
-
usingActiveModelSerializer: function () {
|
385
|
-
var adapter = this.adapterFor('application');
|
386
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
387
|
-
return adapter.defaultSerializer == 'active-model';
|
388
|
-
},
|
389
|
-
|
390
384
|
/**
|
391
385
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
392
386
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -560,11 +554,17 @@ DS.Store.reopen({
|
|
560
554
|
child.constructor,
|
561
555
|
model
|
562
556
|
);
|
563
|
-
|
564
|
-
|
565
|
-
|
557
|
+
var hasManyName = self.findRelationshipName(
|
558
|
+
'hasMany',
|
559
|
+
child.constructor,
|
560
|
+
model
|
561
|
+
);
|
562
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
566
563
|
if (belongsToName) {
|
567
|
-
child.set(belongsToName, model);
|
564
|
+
child.set(belongsToName || inverseName, model);
|
565
|
+
} else if (hasManyName) {
|
566
|
+
relation = child.get(hasManyName || inverseName) || [];
|
567
|
+
relation.pushObject(model)
|
568
568
|
}
|
569
569
|
})
|
570
570
|
}
|
@@ -577,7 +577,7 @@ DS.Store.reopen({
|
|
577
577
|
'hasMany',
|
578
578
|
belongsToRecord.constructor,
|
579
579
|
model
|
580
|
-
)
|
580
|
+
);
|
581
581
|
if (hasManyName) {
|
582
582
|
belongsToRecord.get(hasManyName).addObject(model);
|
583
583
|
return;
|
@@ -586,7 +586,7 @@ DS.Store.reopen({
|
|
586
586
|
'belongsTo',
|
587
587
|
belongsToRecord.constructor,
|
588
588
|
model
|
589
|
-
)
|
589
|
+
);
|
590
590
|
// Guard against a situation where a model can belong to itself.
|
591
591
|
// Do not want to set the belongsTo on this case.
|
592
592
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -632,26 +632,6 @@ DS.Store.reopen({
|
|
632
632
|
return relationshipName;
|
633
633
|
},
|
634
634
|
|
635
|
-
// /**
|
636
|
-
// Adding the ability to check the serializer and convert the json before
|
637
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
638
|
-
// for example.
|
639
|
-
//
|
640
|
-
// @method push
|
641
|
-
// @param {String or subclass of DS.Model} type
|
642
|
-
// @param {Object} data
|
643
|
-
// @return {DS.Model} the record that was created or updated.
|
644
|
-
// */
|
645
|
-
// push: function(type, data, _partial) {
|
646
|
-
// var type = this.modelFor(type);
|
647
|
-
// var serializer = this.serializerFor(type.typeKey);
|
648
|
-
// console.log('serializer',serializer, serializer+'')
|
649
|
-
//// if (this.usingActiveModelSerializer()) {
|
650
|
-
//// var model = this.modelFor(modelName);
|
651
|
-
//// FactoryGuy.pushFixture(model, payload);
|
652
|
-
//// }
|
653
|
-
// this._super(type, data, _partial);
|
654
|
-
// },
|
655
635
|
|
656
636
|
/**
|
657
637
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -714,27 +694,47 @@ DS.FixtureAdapter.reopen({
|
|
714
694
|
*/
|
715
695
|
createRecord: function (store, type, record) {
|
716
696
|
var promise = this._super(store, type, record);
|
717
|
-
|
718
697
|
promise.then(function () {
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
698
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
699
|
+
if (relationShips.belongsTo) {
|
700
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
701
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
702
|
+
if (belongsToRecord) {
|
703
|
+
var hasManyName = store.findRelationshipName(
|
704
|
+
'hasMany',
|
705
|
+
belongsToRecord.constructor,
|
706
|
+
record
|
707
|
+
);
|
708
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
709
|
+
relationship.addObject(record);
|
710
|
+
});
|
711
|
+
}
|
712
|
+
});
|
713
|
+
});
|
714
|
+
}
|
715
|
+
if (relationShips.hasMany) {
|
716
|
+
relationShips.hasMany.forEach(function (relationship) {
|
717
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
718
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
719
|
+
var hasManyName = store.findRelationshipName(
|
720
|
+
'hasMany',
|
721
|
+
belongsToRecord.constructor,
|
722
|
+
record
|
723
|
+
);
|
724
|
+
belongsToRecord.forEach(function (child){
|
725
|
+
child.get(hasManyName).addObject(record)
|
726
|
+
});
|
727
|
+
}
|
728
|
+
});
|
729
|
+
})
|
730
|
+
}
|
731
|
+
});
|
733
732
|
});
|
734
733
|
|
735
734
|
return promise;
|
736
735
|
}
|
737
736
|
})
|
737
|
+
|
738
738
|
FactoryGuyTestMixin = Em.Mixin.create({
|
739
739
|
|
740
740
|
// Pass in the app root, which typically is App.
|
@@ -770,6 +770,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
770
770
|
return this.getStore().find(type, id);
|
771
771
|
},
|
772
772
|
|
773
|
+
/**
|
774
|
+
Proxy to store's makeFixture method
|
775
|
+
|
776
|
+
@param {String} name name of fixture
|
777
|
+
@param {Object} options fixture options
|
778
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
779
|
+
*/
|
773
780
|
make: function (name, opts) {
|
774
781
|
return this.getStore().makeFixture(name, opts);
|
775
782
|
},
|
@@ -811,9 +818,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
811
818
|
},
|
812
819
|
|
813
820
|
/**
|
814
|
-
Build the json used for creating record
|
821
|
+
Build the json used for creating or finding a record.
|
815
822
|
|
816
|
-
@param {String} name of the fixture ( or model ) to create
|
823
|
+
@param {String} name of the fixture ( or model ) to create/find
|
817
824
|
@param {Object} opts fixture options
|
818
825
|
*/
|
819
826
|
buildAjaxHttpResponse: function (name, opts) {
|
@@ -1 +1 @@
|
|
1
|
-
Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},usingActiveModelSerializer:function(){var adapter=this.adapterFor("application");console.log("adapter.defaultSerializer",adapter.defaultSerializer);return adapter.defaultSerializer=="active-model"},makeFixture:function(name,options){var store=this;var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(relationship.options&&relationship.options.inverse){belongsToName=relationship.options.inverse}if(belongsToName){child.set(belongsToName,model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){var relationShips=Ember.get(type,"relationshipNames");if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){var belongsToRecord=record.get(relationship);if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.get(hasManyName).addObject(record)}})}});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
|
1
|
+
Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var store=this;var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);var hasManyName=self.findRelationshipName("hasMany",child.constructor,model);var inverseName=relationship.options&&relationship.options.inverse;if(belongsToName){child.set(belongsToName||inverseName,model)}else if(hasManyName){relation=child.get(hasManyName||inverseName)||[];relation.pushObject(model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){Em.RSVP.Promise.resolve(Ember.get(type,"relationshipNames")).then(function(relationShips){if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then(function(relationship){relationship.addObject(record)})}})})}if(relationShips.hasMany){relationShips.hasMany.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord&&belongsToRecord.get("length")>0){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.forEach(function(child){child.get(hasManyName).addObject(record)})}})})}})});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "ember-data-factory-guy"
|
4
|
-
s.version = "0.4.
|
4
|
+
s.version = "0.4.2"
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ["Daniel Sudol", "Alex Opak"]
|
7
7
|
s.email = ["dansudol@yahoo.com", "opak.alexandr@gmail.com"]
|
data/package.json
CHANGED
@@ -33,6 +33,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
33
33
|
return this.getStore().find(type, id);
|
34
34
|
},
|
35
35
|
|
36
|
+
/**
|
37
|
+
Proxy to store's makeFixture method
|
38
|
+
|
39
|
+
@param {String} name name of fixture
|
40
|
+
@param {Object} options fixture options
|
41
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
42
|
+
*/
|
36
43
|
make: function (name, opts) {
|
37
44
|
return this.getStore().makeFixture(name, opts);
|
38
45
|
},
|
@@ -74,9 +81,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
74
81
|
},
|
75
82
|
|
76
83
|
/**
|
77
|
-
Build the json used for creating record
|
84
|
+
Build the json used for creating or finding a record.
|
78
85
|
|
79
|
-
@param {String} name of the fixture ( or model ) to create
|
86
|
+
@param {String} name of the fixture ( or model ) to create/find
|
80
87
|
@param {Object} opts fixture options
|
81
88
|
*/
|
82
89
|
buildAjaxHttpResponse: function (name, opts) {
|
data/src/store.js
CHANGED
@@ -7,12 +7,6 @@ DS.Store.reopen({
|
|
7
7
|
return adapter instanceof DS.FixtureAdapter;
|
8
8
|
},
|
9
9
|
|
10
|
-
usingActiveModelSerializer: function () {
|
11
|
-
var adapter = this.adapterFor('application');
|
12
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
13
|
-
return adapter.defaultSerializer == 'active-model';
|
14
|
-
},
|
15
|
-
|
16
10
|
/**
|
17
11
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
18
12
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -186,11 +180,17 @@ DS.Store.reopen({
|
|
186
180
|
child.constructor,
|
187
181
|
model
|
188
182
|
);
|
189
|
-
|
190
|
-
|
191
|
-
|
183
|
+
var hasManyName = self.findRelationshipName(
|
184
|
+
'hasMany',
|
185
|
+
child.constructor,
|
186
|
+
model
|
187
|
+
);
|
188
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
192
189
|
if (belongsToName) {
|
193
|
-
child.set(belongsToName, model);
|
190
|
+
child.set(belongsToName || inverseName, model);
|
191
|
+
} else if (hasManyName) {
|
192
|
+
relation = child.get(hasManyName || inverseName) || [];
|
193
|
+
relation.pushObject(model)
|
194
194
|
}
|
195
195
|
})
|
196
196
|
}
|
@@ -203,7 +203,7 @@ DS.Store.reopen({
|
|
203
203
|
'hasMany',
|
204
204
|
belongsToRecord.constructor,
|
205
205
|
model
|
206
|
-
)
|
206
|
+
);
|
207
207
|
if (hasManyName) {
|
208
208
|
belongsToRecord.get(hasManyName).addObject(model);
|
209
209
|
return;
|
@@ -212,7 +212,7 @@ DS.Store.reopen({
|
|
212
212
|
'belongsTo',
|
213
213
|
belongsToRecord.constructor,
|
214
214
|
model
|
215
|
-
)
|
215
|
+
);
|
216
216
|
// Guard against a situation where a model can belong to itself.
|
217
217
|
// Do not want to set the belongsTo on this case.
|
218
218
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -258,26 +258,6 @@ DS.Store.reopen({
|
|
258
258
|
return relationshipName;
|
259
259
|
},
|
260
260
|
|
261
|
-
// /**
|
262
|
-
// Adding the ability to check the serializer and convert the json before
|
263
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
264
|
-
// for example.
|
265
|
-
//
|
266
|
-
// @method push
|
267
|
-
// @param {String or subclass of DS.Model} type
|
268
|
-
// @param {Object} data
|
269
|
-
// @return {DS.Model} the record that was created or updated.
|
270
|
-
// */
|
271
|
-
// push: function(type, data, _partial) {
|
272
|
-
// var type = this.modelFor(type);
|
273
|
-
// var serializer = this.serializerFor(type.typeKey);
|
274
|
-
// console.log('serializer',serializer, serializer+'')
|
275
|
-
//// if (this.usingActiveModelSerializer()) {
|
276
|
-
//// var model = this.modelFor(modelName);
|
277
|
-
//// FactoryGuy.pushFixture(model, payload);
|
278
|
-
//// }
|
279
|
-
// this._super(type, data, _partial);
|
280
|
-
// },
|
281
261
|
|
282
262
|
/**
|
283
263
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -340,24 +320,43 @@ DS.FixtureAdapter.reopen({
|
|
340
320
|
*/
|
341
321
|
createRecord: function (store, type, record) {
|
342
322
|
var promise = this._super(store, type, record);
|
343
|
-
|
344
323
|
promise.then(function () {
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
324
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
325
|
+
if (relationShips.belongsTo) {
|
326
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
327
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
328
|
+
if (belongsToRecord) {
|
329
|
+
var hasManyName = store.findRelationshipName(
|
330
|
+
'hasMany',
|
331
|
+
belongsToRecord.constructor,
|
332
|
+
record
|
333
|
+
);
|
334
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
335
|
+
relationship.addObject(record);
|
336
|
+
});
|
337
|
+
}
|
338
|
+
});
|
339
|
+
});
|
340
|
+
}
|
341
|
+
if (relationShips.hasMany) {
|
342
|
+
relationShips.hasMany.forEach(function (relationship) {
|
343
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
344
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
345
|
+
var hasManyName = store.findRelationshipName(
|
346
|
+
'hasMany',
|
347
|
+
belongsToRecord.constructor,
|
348
|
+
record
|
349
|
+
);
|
350
|
+
belongsToRecord.forEach(function (child){
|
351
|
+
child.get(hasManyName).addObject(record)
|
352
|
+
});
|
353
|
+
}
|
354
|
+
});
|
355
|
+
})
|
356
|
+
}
|
357
|
+
});
|
359
358
|
});
|
360
359
|
|
361
360
|
return promise;
|
362
361
|
}
|
363
|
-
})
|
362
|
+
})
|
@@ -134,6 +134,18 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
134
134
|
});
|
135
135
|
|
136
136
|
|
137
|
+
asyncTest("when async hasMany relationship is assigned, model relationship is synced on both sides", function() {
|
138
|
+
var property = store.makeFixture('property');
|
139
|
+
var user1 = store.makeFixture('user', {properties: [property]});
|
140
|
+
var user2 = store.makeFixture('user', {properties: [property]});
|
141
|
+
|
142
|
+
equal(property.get('owners.length'), 2);
|
143
|
+
deepEqual(property.get('owners.firstObject').toJSON(), user1.toJSON());
|
144
|
+
deepEqual(property.get('owners.lastObject').toJSON(), user2.toJSON());
|
145
|
+
start();
|
146
|
+
});
|
147
|
+
|
148
|
+
|
137
149
|
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
138
150
|
var company = store.makeFixture('company');
|
139
151
|
var user1 = store.makeFixture('user', {company: company});
|
@@ -178,13 +190,13 @@ test("when belongTo parent is assigned, parent adds to belongsTo record", functi
|
|
178
190
|
test("belongsTo associations defined as attributes in fixture", function() {
|
179
191
|
var project = store.makeFixture('project_with_user');
|
180
192
|
equal(project.get('user') instanceof User, true)
|
181
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
193
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null, properties: []})
|
182
194
|
|
183
195
|
var project = store.makeFixture('project_with_dude');
|
184
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
196
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null, properties: []})
|
185
197
|
|
186
198
|
var project = store.makeFixture('project_with_admin');
|
187
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
199
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null, properties: []})
|
188
200
|
});
|
189
201
|
|
190
202
|
|
@@ -227,7 +239,7 @@ module('DS.Store with ActiveModelAdapter', {
|
|
227
239
|
});
|
228
240
|
|
229
241
|
|
230
|
-
asyncTest("#createRecord with mockjax handles model's camelCase attributes", function() {
|
242
|
+
asyncTest("#createRecord (with mockjax) handles model's camelCase attributes", function() {
|
231
243
|
testHelper.handleCreate('profile', {camelCaseDescription: 'description'})
|
232
244
|
|
233
245
|
store.createRecord('profile').save().then(function(profile) {
|
@@ -237,7 +249,7 @@ asyncTest("#createRecord with mockjax handles model's camelCase attributes", fun
|
|
237
249
|
});
|
238
250
|
|
239
251
|
|
240
|
-
asyncTest("#find with
|
252
|
+
asyncTest("#find (with mockajax) handles model's camelCase attributes", function() {
|
241
253
|
var responseJson = testHelper.handleFind('profile', {camelCaseDescription: 'description'})
|
242
254
|
var id = responseJson.profile.id
|
243
255
|
|
@@ -138,9 +138,32 @@ asyncTest("#createRecord adds belongsTo association to records it hasMany of", f
|
|
138
138
|
var projectJson = {title:'project', user: user};
|
139
139
|
|
140
140
|
store.createRecord('project', projectJson).save()
|
141
|
-
.then( function() {
|
142
|
-
|
141
|
+
.then( function(project) {
|
142
|
+
return Ember.RSVP.all([project.get('user'), user.get('projects')]);
|
143
|
+
}).then( function(promises) {
|
144
|
+
var projectUser = promises[0], projects = promises[1];
|
145
|
+
equal(projectUser.get('id'), user.get('id'));
|
146
|
+
equal(projects.get('length'), 1);
|
143
147
|
start();
|
144
148
|
});
|
145
149
|
})
|
146
150
|
})
|
151
|
+
|
152
|
+
asyncTest("#createRecord adds hasMany association to records it hasMany of ", function() {
|
153
|
+
var usersJson = store.makeList('user', 3);
|
154
|
+
|
155
|
+
Em.RSVP.all([store.find('user', usersJson[0].id),store.find('user', usersJson[1].id),store.find('user', usersJson[2].id)]).then(function(users) {
|
156
|
+
|
157
|
+
var propertyJson = {name:'beach front property'};
|
158
|
+
|
159
|
+
property = store.createRecord('property', propertyJson);
|
160
|
+
property.get('owners').then(function(owners){
|
161
|
+
owners.addObjects(users);
|
162
|
+
}).then( function() {
|
163
|
+
return property.get('owners');
|
164
|
+
}).then( function(users) {
|
165
|
+
equal(users.get('length'), usersJson.length);
|
166
|
+
start();
|
167
|
+
});
|
168
|
+
})
|
169
|
+
})
|
@@ -129,10 +129,22 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
129
129
|
});
|
130
130
|
|
131
131
|
|
132
|
+
asyncTest("when async hasMany relationship is assigned, model relationship is synced on both sides", function() {
|
133
|
+
var property = store.makeFixture('property');
|
134
|
+
var user1 = store.makeFixture('user', {properties: [property]});
|
135
|
+
var user2 = store.makeFixture('user', {properties: [property]});
|
136
|
+
|
137
|
+
equal(property.get('owners.length'), 2);
|
138
|
+
deepEqual(property.get('owners.firstObject').toJSON(), user1.toJSON());
|
139
|
+
deepEqual(property.get('owners.lastObject').toJSON(), user2.toJSON());
|
140
|
+
start();
|
141
|
+
});
|
142
|
+
|
143
|
+
|
132
144
|
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
133
|
-
var
|
134
|
-
var
|
135
|
-
var
|
145
|
+
var user1 = store.makeFixture('user');
|
146
|
+
var user2 = store.makeFixture('user');
|
147
|
+
var company = store.makeFixture('company', {users: [user1, user2]});
|
136
148
|
|
137
149
|
equal(company.get('users.length'), 2);
|
138
150
|
deepEqual(company.get('users.firstObject').toJSON(), user1.toJSON());
|
@@ -173,13 +185,13 @@ test("when belongTo parent is assigned, parent adds to belongsTo record", functi
|
|
173
185
|
test("belongsTo associations defined as attributes in fixture", function() {
|
174
186
|
var project = store.makeFixture('project_with_user');
|
175
187
|
equal(project.get('user') instanceof User, true)
|
176
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
188
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null, properties: []})
|
177
189
|
|
178
190
|
var project = store.makeFixture('project_with_dude');
|
179
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
191
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null, properties: []})
|
180
192
|
|
181
193
|
var project = store.makeFixture('project_with_admin');
|
182
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
194
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null, properties: []})
|
183
195
|
});
|
184
196
|
|
185
197
|
|
@@ -1,7 +1,8 @@
|
|
1
1
|
User = DS.Model.extend({
|
2
2
|
name: DS.attr('string'),
|
3
|
-
company: DS.belongsTo('company', {async: true}),
|
4
|
-
|
3
|
+
company: DS.belongsTo('company', {async: true, inverse: 'users'}),
|
4
|
+
properties: DS.hasMany('property', {async: true, inverse: 'owners'}),
|
5
|
+
projects: DS.hasMany('project'),
|
5
6
|
hats: DS.hasMany('hat', {polymorphic: true})
|
6
7
|
});
|
7
8
|
|
@@ -18,6 +18,7 @@ TestHelper = Ember.Object.createWithMixins(FactoryGuyTestMixin,{
|
|
18
18
|
container.register("model:user", User);
|
19
19
|
container.register("model:profile", Profile);
|
20
20
|
container.register("model:company", Company);
|
21
|
+
container.register("model:property", Property);
|
21
22
|
container.register("model:project", Project);
|
22
23
|
container.register("store:main", DS.Store.extend({adapter: adapter}));
|
23
24
|
if (adapter == DS.ActiveModelAdapter) {
|
data/tests/test_setup.js
CHANGED
@@ -45,6 +45,11 @@ FactoryGuy.define('project', {
|
|
45
45
|
user: FactoryGuy.association('admin')
|
46
46
|
}
|
47
47
|
});
|
48
|
+
FactoryGuy.define('property', {
|
49
|
+
default: {
|
50
|
+
name: 'Silly property'
|
51
|
+
}
|
52
|
+
})
|
48
53
|
FactoryGuy.define('user', {
|
49
54
|
// default values for 'user' attributes
|
50
55
|
default: {
|
@@ -58,7 +63,7 @@ FactoryGuy.define('user', {
|
|
58
63
|
Company = DS.Model.extend({
|
59
64
|
name: DS.attr('string'),
|
60
65
|
profile: DS.belongsTo('profile'),
|
61
|
-
users: DS.hasMany('user', {async: true})
|
66
|
+
users: DS.hasMany('user', {async: true, inverse: 'company'})
|
62
67
|
});
|
63
68
|
|
64
69
|
Hat = DS.Model.extend({
|
@@ -94,10 +99,16 @@ Project = DS.Model.extend({
|
|
94
99
|
children: DS.hasMany('project', {inverse: 'parent'})
|
95
100
|
});
|
96
101
|
|
97
|
-
|
102
|
+
Property = DS.Model.extend({
|
98
103
|
name: DS.attr('string'),
|
99
104
|
company: DS.belongsTo('company', {async: true}),
|
100
|
-
|
105
|
+
owners: DS.hasMany('user', {async: true, inverse: 'properties'})
|
106
|
+
});
|
107
|
+
User = DS.Model.extend({
|
108
|
+
name: DS.attr('string'),
|
109
|
+
company: DS.belongsTo('company', {async: true, inverse: 'users'}),
|
110
|
+
properties: DS.hasMany('property', {async: true, inverse: 'owners'}),
|
111
|
+
projects: DS.hasMany('project'),
|
101
112
|
hats: DS.hasMany('hat', {polymorphic: true})
|
102
113
|
});
|
103
114
|
|
@@ -381,12 +381,6 @@ DS.Store.reopen({
|
|
381
381
|
return adapter instanceof DS.FixtureAdapter;
|
382
382
|
},
|
383
383
|
|
384
|
-
usingActiveModelSerializer: function () {
|
385
|
-
var adapter = this.adapterFor('application');
|
386
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
387
|
-
return adapter.defaultSerializer == 'active-model';
|
388
|
-
},
|
389
|
-
|
390
384
|
/**
|
391
385
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
392
386
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -560,11 +554,17 @@ DS.Store.reopen({
|
|
560
554
|
child.constructor,
|
561
555
|
model
|
562
556
|
);
|
563
|
-
|
564
|
-
|
565
|
-
|
557
|
+
var hasManyName = self.findRelationshipName(
|
558
|
+
'hasMany',
|
559
|
+
child.constructor,
|
560
|
+
model
|
561
|
+
);
|
562
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
566
563
|
if (belongsToName) {
|
567
|
-
child.set(belongsToName, model);
|
564
|
+
child.set(belongsToName || inverseName, model);
|
565
|
+
} else if (hasManyName) {
|
566
|
+
relation = child.get(hasManyName || inverseName) || [];
|
567
|
+
relation.pushObject(model)
|
568
568
|
}
|
569
569
|
})
|
570
570
|
}
|
@@ -577,7 +577,7 @@ DS.Store.reopen({
|
|
577
577
|
'hasMany',
|
578
578
|
belongsToRecord.constructor,
|
579
579
|
model
|
580
|
-
)
|
580
|
+
);
|
581
581
|
if (hasManyName) {
|
582
582
|
belongsToRecord.get(hasManyName).addObject(model);
|
583
583
|
return;
|
@@ -586,7 +586,7 @@ DS.Store.reopen({
|
|
586
586
|
'belongsTo',
|
587
587
|
belongsToRecord.constructor,
|
588
588
|
model
|
589
|
-
)
|
589
|
+
);
|
590
590
|
// Guard against a situation where a model can belong to itself.
|
591
591
|
// Do not want to set the belongsTo on this case.
|
592
592
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -632,26 +632,6 @@ DS.Store.reopen({
|
|
632
632
|
return relationshipName;
|
633
633
|
},
|
634
634
|
|
635
|
-
// /**
|
636
|
-
// Adding the ability to check the serializer and convert the json before
|
637
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
638
|
-
// for example.
|
639
|
-
//
|
640
|
-
// @method push
|
641
|
-
// @param {String or subclass of DS.Model} type
|
642
|
-
// @param {Object} data
|
643
|
-
// @return {DS.Model} the record that was created or updated.
|
644
|
-
// */
|
645
|
-
// push: function(type, data, _partial) {
|
646
|
-
// var type = this.modelFor(type);
|
647
|
-
// var serializer = this.serializerFor(type.typeKey);
|
648
|
-
// console.log('serializer',serializer, serializer+'')
|
649
|
-
//// if (this.usingActiveModelSerializer()) {
|
650
|
-
//// var model = this.modelFor(modelName);
|
651
|
-
//// FactoryGuy.pushFixture(model, payload);
|
652
|
-
//// }
|
653
|
-
// this._super(type, data, _partial);
|
654
|
-
// },
|
655
635
|
|
656
636
|
/**
|
657
637
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -714,27 +694,47 @@ DS.FixtureAdapter.reopen({
|
|
714
694
|
*/
|
715
695
|
createRecord: function (store, type, record) {
|
716
696
|
var promise = this._super(store, type, record);
|
717
|
-
|
718
697
|
promise.then(function () {
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
698
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
699
|
+
if (relationShips.belongsTo) {
|
700
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
701
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
702
|
+
if (belongsToRecord) {
|
703
|
+
var hasManyName = store.findRelationshipName(
|
704
|
+
'hasMany',
|
705
|
+
belongsToRecord.constructor,
|
706
|
+
record
|
707
|
+
);
|
708
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
709
|
+
relationship.addObject(record);
|
710
|
+
});
|
711
|
+
}
|
712
|
+
});
|
713
|
+
});
|
714
|
+
}
|
715
|
+
if (relationShips.hasMany) {
|
716
|
+
relationShips.hasMany.forEach(function (relationship) {
|
717
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
718
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
719
|
+
var hasManyName = store.findRelationshipName(
|
720
|
+
'hasMany',
|
721
|
+
belongsToRecord.constructor,
|
722
|
+
record
|
723
|
+
);
|
724
|
+
belongsToRecord.forEach(function (child){
|
725
|
+
child.get(hasManyName).addObject(record)
|
726
|
+
});
|
727
|
+
}
|
728
|
+
});
|
729
|
+
})
|
730
|
+
}
|
731
|
+
});
|
733
732
|
});
|
734
733
|
|
735
734
|
return promise;
|
736
735
|
}
|
737
736
|
})
|
737
|
+
|
738
738
|
FactoryGuyTestMixin = Em.Mixin.create({
|
739
739
|
|
740
740
|
// Pass in the app root, which typically is App.
|
@@ -770,6 +770,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
770
770
|
return this.getStore().find(type, id);
|
771
771
|
},
|
772
772
|
|
773
|
+
/**
|
774
|
+
Proxy to store's makeFixture method
|
775
|
+
|
776
|
+
@param {String} name name of fixture
|
777
|
+
@param {Object} options fixture options
|
778
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
779
|
+
*/
|
773
780
|
make: function (name, opts) {
|
774
781
|
return this.getStore().makeFixture(name, opts);
|
775
782
|
},
|
@@ -811,9 +818,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
811
818
|
},
|
812
819
|
|
813
820
|
/**
|
814
|
-
Build the json used for creating record
|
821
|
+
Build the json used for creating or finding a record.
|
815
822
|
|
816
|
-
@param {String} name of the fixture ( or model ) to create
|
823
|
+
@param {String} name of the fixture ( or model ) to create/find
|
817
824
|
@param {Object} opts fixture options
|
818
825
|
*/
|
819
826
|
buildAjaxHttpResponse: function (name, opts) {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ember-data-factory-guy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Sudol
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Easily create Fixtures for Ember Data
|
15
15
|
email:
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- tests/support/factories/material_factory.js
|
48
48
|
- tests/support/factories/profile_factory.js
|
49
49
|
- tests/support/factories/project_factory.js
|
50
|
+
- tests/support/factories/property_factory.js
|
50
51
|
- tests/support/factories/user_factory.js
|
51
52
|
- tests/support/libs/mockjax.js
|
52
53
|
- tests/support/libs/sinon.js
|
@@ -55,6 +56,7 @@ files:
|
|
55
56
|
- tests/support/models/material.js
|
56
57
|
- tests/support/models/profile.js
|
57
58
|
- tests/support/models/project.js
|
59
|
+
- tests/support/models/property.js
|
58
60
|
- tests/support/models/user.js
|
59
61
|
- tests/support/test_helper.js
|
60
62
|
- tests/test_setup.js
|