ember-data-factory-guy 0.8.4 → 0.8.5

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: a62de689fff74d16df3fb9b94729bc70cc8a6732
4
- data.tar.gz: 6efd7d089935309736957886b63d9b3494e4f02f
3
+ metadata.gz: e9608d21a251538039579b12d49d7250e3158766
4
+ data.tar.gz: f68ab6412e121fb7c52d0045494b2ab33f9afa6e
5
5
  SHA512:
6
- metadata.gz: 04df59360622690f76bc7980592b77262b32190d4420aad6d99084d579abaae5fa94e77e18f21767ed32c4537bd0ad35b07f484ada08b388e873e9ffb2c7386a
7
- data.tar.gz: b3ed6abf13aaf67a201a9d711defe20d3695f3cedcb9cb98f6a9d79190ac9125514f376a5773f95078798574add538a4ae2b968e4fe7a689eb5babafdd207106
6
+ metadata.gz: 707333b8c3a9cb12034cdc8140e36323d5d5b1a5fcd4a701efd256c0feb506965db976ef352ea1e9244b056bf568cc21fb34786351ffa9eb650dc98b0a6c6d94
7
+ data.tar.gz: 7056e2ed647ee8c525771d378e3c9dcbe0f127ce876d33568d4479922776fb943eb9462376ad52f98267c87be6edfaac92750730305985618fb14c6eb84fa02b
data/README.md CHANGED
@@ -9,12 +9,12 @@ of ember-data-factory-guy.
9
9
  - Versions:
10
10
  - 0.6.4 -> ember-data-1.0.0-beta.8 and under
11
11
  - 0.7.1.1 -> ember-data-1.0.0-beta.10
12
- - 0.8.3 -> ember-data-1.0.0-beta.11
13
- - 0.8.3 -> ember-data-1.0.0-beta.12
12
+ - 0.8.4 -> ember-data-1.0.0-beta.11
13
+ - 0.8.4 -> ember-data-1.0.0-beta.12
14
14
 
15
- **For versions ( 0.7.1 -> 0.8.3 ), support for the fixture adapter is currently broken.**
15
+ **For versions ( 0.7.1 -> 0.8.4 ), support for the fixture adapter is currently broken.**
16
16
 
17
- *Version 0.8.3 has many bug fixes and improvements that the earlier versions don't have, so
17
+ *Version 0.8.4 has many bug fixes and improvements that the earlier versions don't have, so
18
18
  hopefully you can switch to newer version of ember-data and therefore the best
19
19
  ember-data-factory-guy version, but if not, send me bug report and I will try and go back
20
20
  and fix the older version you are using.*
@@ -41,7 +41,7 @@ gem 'ember-data-factory-guy', group: test
41
41
  or for particular version:
42
42
 
43
43
  ```ruby
44
- gem 'ember-data-factory-guy', '0.8.3', group: test
44
+ gem 'ember-data-factory-guy', '0.8.4', group: test
45
45
  ```
46
46
 
47
47
  then:
@@ -76,7 +76,7 @@ or for particular version:
76
76
  "dependencies": {
77
77
  "foo-dependency": "latest",
78
78
  "other-foo-dependency": "latest",
79
- "ember-data-factory-guy": "0.8.3"
79
+ "ember-data-factory-guy": "0.8.4"
80
80
  }
81
81
  ```
82
82
 
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -441,12 +441,45 @@ var FactoryGuy = {
441
441
  @returns {Object} json fixture data
442
442
  */
443
443
  pushFixture: function (modelClass, fixture) {
444
+ var index;
444
445
  if (!modelClass.FIXTURES) {
445
446
  modelClass.FIXTURES = [];
446
447
  }
447
- modelClass.FIXTURES.push(fixture);
448
+
449
+ index = this.indexOfFixture(modelClass.FIXTURES, fixture);
450
+
451
+ if (index > -1) {
452
+ modelClass.FIXTURES[index] = fixture;
453
+ } else {
454
+ modelClass.FIXTURES.push(fixture);
455
+ }
456
+
448
457
  return fixture;
449
458
  },
459
+
460
+ /**
461
+ Used in compliment with pushFixture in order to
462
+ ensure we don't push duplicate fixtures
463
+
464
+ @private
465
+ @param {Array} fixtures
466
+ @param {String|Integer} id of fixture to find
467
+ @returns {Object} fixture
468
+ */
469
+ indexOfFixture: function(fixtures, fixture) {
470
+ var index = -1,
471
+ id = fixture.id + '';
472
+ Ember.A(fixtures).find(function(r, i) {
473
+ if ('' + Ember.get(r, 'id') === id) {
474
+ index = i;
475
+ return true;
476
+ } else {
477
+ return false;
478
+ }
479
+ });
480
+ return index;
481
+ },
482
+
450
483
  /**
451
484
  Clears all model definitions
452
485
  */
@@ -456,6 +489,7 @@ var FactoryGuy = {
456
489
  }
457
490
  }
458
491
  };
492
+
459
493
  (function () {
460
494
  DS.Store.reopen({
461
495
  /**
@@ -694,7 +728,7 @@ var FactoryGuy = {
694
728
  */
695
729
  pushPayload: function (type, payload) {
696
730
  if (this.usingFixtureAdapter()) {
697
- var model = this.modelFor(modelName);
731
+ var model = this.modelFor(type);
698
732
  FactoryGuy.pushFixture(model, payload);
699
733
  } else {
700
734
  this._super(type, payload);
@@ -702,6 +736,7 @@ var FactoryGuy = {
702
736
  }
703
737
  });
704
738
  })();
739
+
705
740
  var FactoryGuyTestMixin = Em.Mixin.create({
706
741
  // Pass in the app root, which typically is App.
707
742
  setup: function (app) {
@@ -436,12 +436,45 @@ var FactoryGuy = {
436
436
  @returns {Object} json fixture data
437
437
  */
438
438
  pushFixture: function (modelClass, fixture) {
439
+ var index;
439
440
  if (!modelClass.FIXTURES) {
440
441
  modelClass.FIXTURES = [];
441
442
  }
442
- modelClass.FIXTURES.push(fixture);
443
+
444
+ index = this.indexOfFixture(modelClass.FIXTURES, fixture);
445
+
446
+ if (index > -1) {
447
+ modelClass.FIXTURES[index] = fixture;
448
+ } else {
449
+ modelClass.FIXTURES.push(fixture);
450
+ }
451
+
443
452
  return fixture;
444
453
  },
454
+
455
+ /**
456
+ Used in compliment with pushFixture in order to
457
+ ensure we don't push duplicate fixtures
458
+
459
+ @private
460
+ @param {Array} fixtures
461
+ @param {String|Integer} id of fixture to find
462
+ @returns {Object} fixture
463
+ */
464
+ indexOfFixture: function(fixtures, fixture) {
465
+ var index = -1,
466
+ id = fixture.id + '';
467
+ Ember.A(fixtures).find(function(r, i) {
468
+ if ('' + Ember.get(r, 'id') === id) {
469
+ index = i;
470
+ return true;
471
+ } else {
472
+ return false;
473
+ }
474
+ });
475
+ return index;
476
+ },
477
+
445
478
  /**
446
479
  Clears all model definitions
447
480
  */
@@ -451,6 +484,7 @@ var FactoryGuy = {
451
484
  }
452
485
  }
453
486
  };
487
+
454
488
  (function () {
455
489
  DS.Store.reopen({
456
490
  /**
@@ -689,7 +723,7 @@ var FactoryGuy = {
689
723
  */
690
724
  pushPayload: function (type, payload) {
691
725
  if (this.usingFixtureAdapter()) {
692
- var model = this.modelFor(modelName);
726
+ var model = this.modelFor(type);
693
727
  FactoryGuy.pushFixture(model, payload);
694
728
  } else {
695
729
  this._super(type, payload);
@@ -697,6 +731,7 @@ var FactoryGuy = {
697
731
  }
698
732
  });
699
733
  })();
734
+
700
735
  var FactoryGuyTestMixin = Em.Mixin.create({
701
736
  // Pass in the app root, which typically is App.
702
737
  setup: function (app) {
@@ -1 +1 @@
1
- var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var 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=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.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;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var 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)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){console.log("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},resetModels:function(store){for(var 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){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}modelClass.FIXTURES.push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){var store=this;var fixture=FactoryGuy.build.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{return store.makeModel(modelType,fixture)}},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(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(){var arr=[];var number=arguments[1];for(var i=0;i<number;i++){arr.push(this.makeFixture.apply(this,arguments))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){id=object.id;hasManyRelation[index]=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)}}})},findEmbeddedAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,belongsToRecord);belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"){if(Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.map(function(object){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,object);var record=store.push(relationship.type,object);records.push(record);return record});fixture[relationship.key]=records}}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(belongsToName){child.set(belongsToName,model)}})}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){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(relationship,name){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)}}})})();var 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 modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){var store=this.getStore();return store.makeFixture.apply(store,arguments)},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)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindMany:function(){var store=this.getStore();store.makeList.apply(store,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};responseJson[modelName]=[];var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET"})},handleCreate:function(modelName,options){var opts=options===undefined?{}:options;var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};var url=this.buildURL(modelName);var definition=FactoryGuy.modelDefinitions[modelName];var httpOptions={type:"POST"};if(opts.match){var expectedRequest={};var record=this.getStore().createRecord(modelName,match);expectedRequest[modelName]=record.serialize();httpOptions.data=JSON.stringify(expectedRequest)}var modelType=this.getStore().modelFor(modelName);var responseJson={};if(succeed){if(options){responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},handleUpdate:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
1
+ var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var 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=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.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;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var 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)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){console.log("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},resetModels:function(store){for(var 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){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES[index]=fixture}else{modelClass.FIXTURES.push(fixture)}return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){var store=this;var fixture=FactoryGuy.build.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{return store.makeModel(modelType,fixture)}},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(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(){var arr=[];var number=arguments[1];for(var i=0;i<number;i++){arr.push(this.makeFixture.apply(this,arguments))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){id=object.id;hasManyRelation[index]=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)}}})},findEmbeddedAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,belongsToRecord);belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"){if(Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.map(function(object){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,object);var record=store.push(relationship.type,object);records.push(record);return record});fixture[relationship.key]=records}}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(belongsToName){child.set(belongsToName,model)}})}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){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(relationship,name){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(type);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}})})();var 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 modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){var store=this.getStore();return store.makeFixture.apply(store,arguments)},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)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindMany:function(){var store=this.getStore();store.makeList.apply(store,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};responseJson[modelName]=[];var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET"})},handleCreate:function(modelName,options){var opts=options===undefined?{}:options;var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};var url=this.buildURL(modelName);var definition=FactoryGuy.modelDefinitions[modelName];var httpOptions={type:"POST"};if(opts.match){var expectedRequest={};var record=this.getStore().createRecord(modelName,match);expectedRequest[modelName]=record.serialize();httpOptions.data=JSON.stringify(expectedRequest)}var modelType=this.getStore().modelFor(modelName);var responseJson={};if(succeed){if(options){responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},handleUpdate:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
@@ -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.8.4"
4
+ s.version = "0.8.5"
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.8.4",
3
+ "version": "0.8.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
data/src/factory_guy.js CHANGED
@@ -268,12 +268,45 @@ var FactoryGuy = {
268
268
  @returns {Object} json fixture data
269
269
  */
270
270
  pushFixture: function (modelClass, fixture) {
271
+ var index;
271
272
  if (!modelClass.FIXTURES) {
272
273
  modelClass.FIXTURES = [];
273
274
  }
274
- modelClass.FIXTURES.push(fixture);
275
+
276
+ index = this.indexOfFixture(modelClass.FIXTURES, fixture);
277
+
278
+ if (index > -1) {
279
+ modelClass.FIXTURES[index] = fixture;
280
+ } else {
281
+ modelClass.FIXTURES.push(fixture);
282
+ }
283
+
275
284
  return fixture;
276
285
  },
286
+
287
+ /**
288
+ Used in compliment with pushFixture in order to
289
+ ensure we don't push duplicate fixtures
290
+
291
+ @private
292
+ @param {Array} fixtures
293
+ @param {String|Integer} id of fixture to find
294
+ @returns {Object} fixture
295
+ */
296
+ indexOfFixture: function(fixtures, fixture) {
297
+ var index = -1,
298
+ id = fixture.id + '';
299
+ Ember.A(fixtures).find(function(r, i) {
300
+ if ('' + Ember.get(r, 'id') === id) {
301
+ index = i;
302
+ return true;
303
+ } else {
304
+ return false;
305
+ }
306
+ });
307
+ return index;
308
+ },
309
+
277
310
  /**
278
311
  Clears all model definitions
279
312
  */
@@ -282,4 +315,4 @@ var FactoryGuy = {
282
315
  this.modelDefinitions = {};
283
316
  }
284
317
  }
285
- };
318
+ };
data/src/store.js CHANGED
@@ -236,11 +236,11 @@
236
236
  */
237
237
  pushPayload: function (type, payload) {
238
238
  if (this.usingFixtureAdapter()) {
239
- var model = this.modelFor(modelName);
239
+ var model = this.modelFor(type);
240
240
  FactoryGuy.pushFixture(model, payload);
241
241
  } else {
242
242
  this._super(type, payload);
243
243
  }
244
244
  }
245
245
  });
246
- })();
246
+ })();
@@ -203,3 +203,26 @@ test("#lookupModelForFixtureName", function() {
203
203
  equal(FactoryGuy.lookupModelForFixtureName('fake'), undefined, "return nothing if can't find definition");
204
204
  });
205
205
 
206
+ asyncTest("#pushFixture", function() {
207
+ var User = store.modelFor('user'),
208
+ user = store.makeFixture('user'),
209
+ duplicateUser = FactoryGuy.build('user', { id: user.id, name: 'monkey' }),
210
+ differentUser = FactoryGuy.build('user'),
211
+ usersById = {};
212
+
213
+ usersById[duplicateUser.id] = duplicateUser;
214
+ usersById[differentUser.id] = differentUser;
215
+
216
+ FactoryGuy.pushFixture(User, duplicateUser);
217
+ FactoryGuy.pushFixture(User, differentUser);
218
+
219
+ store.find('user').then(function(users) {
220
+ ok(users.get('length') === 2);
221
+
222
+ users.forEach(function(user) {
223
+ equal(user.get('name'), usersById[user.get('id')].name, "Updates model fixture if duplicate id found");
224
+ });
225
+
226
+ start();
227
+ });
228
+ });
@@ -436,12 +436,45 @@ var FactoryGuy = {
436
436
  @returns {Object} json fixture data
437
437
  */
438
438
  pushFixture: function (modelClass, fixture) {
439
+ var index;
439
440
  if (!modelClass.FIXTURES) {
440
441
  modelClass.FIXTURES = [];
441
442
  }
442
- modelClass.FIXTURES.push(fixture);
443
+
444
+ index = this.indexOfFixture(modelClass.FIXTURES, fixture);
445
+
446
+ if (index > -1) {
447
+ modelClass.FIXTURES[index] = fixture;
448
+ } else {
449
+ modelClass.FIXTURES.push(fixture);
450
+ }
451
+
443
452
  return fixture;
444
453
  },
454
+
455
+ /**
456
+ Used in compliment with pushFixture in order to
457
+ ensure we don't push duplicate fixtures
458
+
459
+ @private
460
+ @param {Array} fixtures
461
+ @param {String|Integer} id of fixture to find
462
+ @returns {Object} fixture
463
+ */
464
+ indexOfFixture: function(fixtures, fixture) {
465
+ var index = -1,
466
+ id = fixture.id + '';
467
+ Ember.A(fixtures).find(function(r, i) {
468
+ if ('' + Ember.get(r, 'id') === id) {
469
+ index = i;
470
+ return true;
471
+ } else {
472
+ return false;
473
+ }
474
+ });
475
+ return index;
476
+ },
477
+
445
478
  /**
446
479
  Clears all model definitions
447
480
  */
@@ -451,6 +484,7 @@ var FactoryGuy = {
451
484
  }
452
485
  }
453
486
  };
487
+
454
488
  (function () {
455
489
  DS.Store.reopen({
456
490
  /**
@@ -689,7 +723,7 @@ var FactoryGuy = {
689
723
  */
690
724
  pushPayload: function (type, payload) {
691
725
  if (this.usingFixtureAdapter()) {
692
- var model = this.modelFor(modelName);
726
+ var model = this.modelFor(type);
693
727
  FactoryGuy.pushFixture(model, payload);
694
728
  } else {
695
729
  this._super(type, payload);
@@ -697,6 +731,7 @@ var FactoryGuy = {
697
731
  }
698
732
  });
699
733
  })();
734
+
700
735
  var FactoryGuyTestMixin = Em.Mixin.create({
701
736
  // Pass in the app root, which typically is App.
702
737
  setup: function (app) {
@@ -1026,7 +1061,7 @@ if (FactoryGuy !== undefined) {
1026
1061
  // console.log('request.data', requestSettings.data )
1027
1062
  // console.log('handler.data', handler.data )
1028
1063
  // console.log('data equal', isMockDataEqual(handler.data, requestSettings.data) )
1029
- if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
1064
+ if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
1030
1065
  // They're not identical, do not mock this request
1031
1066
  return null;
1032
1067
  }
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.8.4
4
+ version: 0.8.5
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-12-04 00:00:00.000000000 Z
12
+ date: 2014-12-06 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easily create Fixtures for Ember Data
15
15
  email: