ember-data-factory-guy 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5bdae9f46c1972abb834e6dbc097e0c078d8e97
4
- data.tar.gz: 6587a2575c0b315ebf1e03a1157e219f051e4e72
3
+ metadata.gz: 723e4f4e01224440a3e7cd0712f0db55a470ba1c
4
+ data.tar.gz: 280d62404418dfdafbf9b3c32ca5854e94522bce
5
5
  SHA512:
6
- metadata.gz: 287ae58b03af66d6fde0256d692ce1b8ed7609487c5fa619f4fed997b980fe41eae3205aa1e97144bc643dc15f2e74b6a250721e1c097107d97af7b13fd67930
7
- data.tar.gz: 29510c92fc6965cf66059895635de26153e14b818c9fd52f0974d06802091367ddb5cd625808632b70faac1578408a51901dd5ead3cedda9e846ec018eef9971
6
+ metadata.gz: 1e048aefde5b3bad5d160ea20781bfe83a9a8324df0b25990dec2d74a1a1b91e95dcd402a12bddc0c479fc20285df24d71e8783c9872889408abd2040f5e4383
7
+ data.tar.gz: 6a46a70429e37ff619f4427ff90c2cbdc7820bf4ea62926b797cb729cd2a2e07428738d511308e6246a632f63b463f1fc8bb78de36d7d75a07b296d3f3abfa54
data/.gitignore CHANGED
@@ -5,4 +5,6 @@ factory_guy_presents/
5
5
  stats/
6
6
  *.gem
7
7
  *.ruby*
8
- .idea/*
8
+ .idea/*
9
+ *.iml
10
+ .vagrant/*
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -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
- if (relationship.options && relationship.options.inverse) {
564
- belongsToName = relationship.options.inverse;
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
- var relationShips = Ember.get(type, 'relationshipNames');
720
- if (relationShips.belongsTo) {
721
- relationShips.belongsTo.forEach(function (relationship) {
722
- var belongsToRecord = record.get(relationship);
723
- if (belongsToRecord) {
724
- var hasManyName = store.findRelationshipName(
725
- 'hasMany',
726
- belongsToRecord.constructor,
727
- record
728
- );
729
- belongsToRecord.get(hasManyName).addObject(record);
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.1"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -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
- if (relationship.options && relationship.options.inverse) {
190
- belongsToName = relationship.options.inverse;
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
- var relationShips = Ember.get(type, 'relationshipNames');
346
- if (relationShips.belongsTo) {
347
- relationShips.belongsTo.forEach(function (relationship) {
348
- var belongsToRecord = record.get(relationship);
349
- if (belongsToRecord) {
350
- var hasManyName = store.findRelationshipName(
351
- 'hasMany',
352
- belongsToRecord.constructor,
353
- record
354
- );
355
- belongsToRecord.get(hasManyName).addObject(record);
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 mockjax handles camelCase attributes", function() {
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
- equal(user.get('projects.length'), 1);
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 company = store.makeFixture('company');
134
- var user1 = store.makeFixture('user', {company: company});
135
- var user2 = store.makeFixture('user', {company: company});
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
 
@@ -0,0 +1,5 @@
1
+ FactoryGuy.define('property', {
2
+ default: {
3
+ name: 'Silly property'
4
+ }
5
+ })
@@ -1,5 +1,5 @@
1
1
  Company = DS.Model.extend({
2
2
  name: DS.attr('string'),
3
3
  profile: DS.belongsTo('profile'),
4
- users: DS.hasMany('user', {async: true})
4
+ users: DS.hasMany('user', {async: true, inverse: 'company'})
5
5
  });
@@ -0,0 +1,5 @@
1
+ Property = DS.Model.extend({
2
+ name: DS.attr('string'),
3
+ company: DS.belongsTo('company', {async: true}),
4
+ owners: DS.hasMany('user', {async: true, inverse: 'properties'})
5
+ });
@@ -1,7 +1,8 @@
1
1
  User = DS.Model.extend({
2
2
  name: DS.attr('string'),
3
- company: DS.belongsTo('company', {async: true}),
4
- projects: DS.hasMany('project'),
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
- User = DS.Model.extend({
102
+ Property = DS.Model.extend({
98
103
  name: DS.attr('string'),
99
104
  company: DS.belongsTo('company', {async: true}),
100
- projects: DS.hasMany('project'),
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
- if (relationship.options && relationship.options.inverse) {
564
- belongsToName = relationship.options.inverse;
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
- var relationShips = Ember.get(type, 'relationshipNames');
720
- if (relationShips.belongsTo) {
721
- relationShips.belongsTo.forEach(function (relationship) {
722
- var belongsToRecord = record.get(relationship);
723
- if (belongsToRecord) {
724
- var hasManyName = store.findRelationshipName(
725
- 'hasMany',
726
- belongsToRecord.constructor,
727
- record
728
- );
729
- belongsToRecord.get(hasManyName).addObject(record);
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.1
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-11 00:00:00.000000000 Z
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