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 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