ember-data-factory-guy 0.7.0 → 0.7.1

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: 893b813e5c6ef5119e39948266640355ba86f352
4
- data.tar.gz: 0c6b49d31ecb172835f646f5ca9db9ac87430874
3
+ metadata.gz: 89f70b883ece60eb9b0bdcfa6b2729d13461f6d5
4
+ data.tar.gz: 98cea7255238a18f36fd8c54cf08150ddd747001
5
5
  SHA512:
6
- metadata.gz: 1ebf5ca9fb86b002caee4626b85ac349e3c7cadd324f5d933eb9aaa2adc32df17fe897cdfd30db878a68a78a9e3d7a9f479f9b1070142cf65b990e3fe3ccf97c
7
- data.tar.gz: edf981f537126c5dfde50ceea4162c8b84218282120b4301e991e6b9b813c160a15e79e5a4ebab9bfa04b4a4d05fae3cd0b062d7cfeb8ffc24c0a0413df55783
6
+ metadata.gz: 0622ff87bb05f9ebec1a5f4f6dbe6a8e1798c7a81558c36d52aa8a1ebd28a60fd81068338e34651e90aee074fd557130b56d1c3d035c8bbd32b4d2a02f4681c3
7
+ data.tar.gz: a20d90001e86020ac81e659fafd44350813686d121d4277bfb274097c9e5b17b03df022a91d4c1ca93f24bd838324bd710fde55fb7c629912b1db6cbc6ced0cb
data/README.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  *NOTE*
4
4
 
5
- ember-data is changing the way they are doing relationships in 1.0.0-beta.10 and above
6
- so, if you are using ember-data-1.0.0-beta.8 and earlier, then be sure to use version 0.6.4
7
- ( or below ) of ember-data-factory-guy.
5
+ ember-data is changing the way they are doing relationships in 1.0.0-beta.10 and above
6
+ so, if you are using ember-data-1.0.0-beta.8 and earlier, then be sure to use version 0.6.4
7
+ ( or below ) of ember-data-factory-guy.
8
8
 
9
- ember-data-factory-guy version 0.7.0 and above will work on the newer versions of ember-data ( 1.0.0-beta.10 and above. )
10
-
9
+ ember-data-factory-guy version 0.7.0 and above will work on the newer versions of ember-data ( 1.0.0-beta.10 and above. )
10
+ **For the current version ( 0.7.1 ) though, support for the fixture adapter is currently broken.**
11
11
 
12
12
  ## Using as Gem
13
13
 
@@ -162,7 +162,8 @@ In the following examples, assume the models look like this:
162
162
 
163
163
  It is better to define each polymorphic model in it's own typed definition:
164
164
 
165
- ```
165
+ ```javascript
166
+
166
167
  FactoryGuy.define('small_hat', {
167
168
  default: {
168
169
  type: 'SmallHat'
@@ -179,7 +180,8 @@ It is better to define each polymorphic model in it's own typed definition:
179
180
 
180
181
  rather than doing this:
181
182
 
182
- ```
183
+ ```javascript
184
+
183
185
  FactoryGuy.define('hat', {
184
186
  default: {},
185
187
  small_hat: {
@@ -189,6 +191,7 @@ rather than doing this:
189
191
  type: 'BigHat'
190
192
  }
191
193
  })
194
+
192
195
  ```
193
196
 
194
197
  Since there are times that the latter can cause problems when
@@ -299,8 +302,8 @@ You can override the default attributes by passing in a hash
299
302
  });
300
303
 
301
304
  var json = FactoryGuy.build('funny_user');
302
- json.name = 'User1'
303
- json.style = 'funny User1'
305
+ json.name // => 'User1'
306
+ json.style // => 'funny User1'
304
307
 
305
308
  var user = store.makeFixture('funny_user');
306
309
  user.get('name') // => 'User2'
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -503,7 +503,7 @@ DS.Store.reopen({
503
503
  modelType = store.modelFor(modelName);
504
504
  }
505
505
  model = store.push(modelName, fixture);
506
- // store.setAssociationsForRESTAdapter(modelType, modelName, model);
506
+ store.setAssociationsForRESTAdapter(modelType, modelName, model);
507
507
  });
508
508
  return model;
509
509
  }
@@ -551,14 +551,14 @@ DS.Store.reopen({
551
551
  @param {String} modelName model name like 'user'
552
552
  @param {Object} fixture to check for needed association assignments
553
553
  */
554
- setAssociationsForFixtureAdapter: function(modelType, modelName, fixture) {
554
+ setAssociationsForFixtureAdapter: function (modelType, modelName, fixture) {
555
555
  var self = this;
556
556
  var adapter = this.adapterFor('application');
557
557
  Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
558
558
  if (relationship.kind == 'hasMany') {
559
559
  var hasManyRelation = fixture[relationship.key];
560
560
  if (hasManyRelation) {
561
- $.each(fixture[relationship.key], function(index,object) {
561
+ $.each(fixture[relationship.key], function (index, object) {
562
562
  // used to require that the relationship was set by id,
563
563
  // but now, you can set it as the json object, and this will
564
564
  // normalize that back to the id
@@ -597,8 +597,8 @@ DS.Store.reopen({
597
597
  Before pushing the fixture to the store, do some preprocessing.
598
598
 
599
599
  If its a belongs to association, and the fixture has an object there,
600
- then push that model to the store and set the id of that new model
601
- as the attribute value in the fixture
600
+ then push that model to the store and set the id of that new model
601
+ as the attribute value in the fixture
602
602
 
603
603
  @param modelType
604
604
  @param fixture
@@ -617,18 +617,71 @@ DS.Store.reopen({
617
617
  var hasManyRecords = fixture[relationship.key];
618
618
  // if the records are objects and not instances they need to be converted to
619
619
  // instances
620
- if (Ember.typeOf(hasManyRecords) == 'array' && Ember.typeOf(hasManyRecords[0]) == 'object') {
621
- var records = Em.A()
622
- hasManyRecords.forEach(function(record) {
623
- var record = store.push(relationship.type, record);
624
- records.push(record);
625
- })
626
- fixture[relationship.key] = records;
620
+ if (Ember.typeOf(hasManyRecords) == 'array') {
621
+ if (Ember.typeOf(hasManyRecords[0]) == 'object') {
622
+ var records = Em.A()
623
+ hasManyRecords.map(function (object) {
624
+ var record = store.push(relationship.type, object);
625
+ records.push(record);
626
+ return record;
627
+ })
628
+ fixture[relationship.key] = records;
629
+ }
627
630
  }
628
631
  }
629
632
  })
630
633
  },
631
634
 
635
+ /**
636
+ For the REST type models:
637
+
638
+ For example if a user hasMany projects, then set the user
639
+ on each project that the user hasMany of, so that the project
640
+ now has the belongsTo user association setup. As in this scenario:
641
+
642
+ ```js
643
+ var project = store.makeFixture('project');
644
+ var user = store.makeFixture('user', {projects: [project]});
645
+ ```
646
+
647
+ Or if you make a user, then a project with that user, then set the project
648
+ in the users list of 'projects' it hasMany of. As in this scenario:
649
+
650
+ ```js
651
+ var user = store.makeFixture('user');
652
+ var project = store.makeFixture('project', {user: user});
653
+ ```
654
+
655
+ NOTE:
656
+ As of ember-data-1.0.0-beta.10, this method is only needed because the belongsTo
657
+ is not assigned when there is a self referential polymorphic has many association.
658
+
659
+ @param {DS.Model} modelType model type like 'User'
660
+ @param {String} modelName model name like 'user'
661
+ @param {DS.Model} model model to check for needed association assignments
662
+ */
663
+ setAssociationsForRESTAdapter: function (modelType, modelName, model) {
664
+ var self = this;
665
+ Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
666
+ if (relationship.kind == 'hasMany') {
667
+ var children = model.get(name) || [];
668
+ children.forEach(function (child) {
669
+ var belongsToName = self.findRelationshipName(
670
+ 'belongsTo',
671
+ child.constructor,
672
+ model
673
+ );
674
+ var inverseName = (relationship.options && relationship.options.inverse)
675
+ if (belongsToName || inverseName) {
676
+ child.set(belongsToName || inverseName, model);
677
+ }
678
+ })
679
+ }
680
+
681
+ })
682
+ },
683
+
684
+
632
685
  findRelationshipName: function (kind, belongToModelType, childModel) {
633
686
  var relationshipName;
634
687
  Ember.get(belongToModelType, 'relationshipsByName').forEach(
@@ -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 traits={};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,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,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(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)};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(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(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.findEmbeddedAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture)});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"){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}console.log("belongsToRecord",belongsToRecord);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(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}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"&&Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.forEach(function(record){var record=store.push(relationship.type,record);records.push(record)});fixture[relationship.key]=records}}})},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)}}});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}}},buildURL:function(type,id){return this.getStore().adapterFor("application").buildURL(type,id)},handleSideloadFind:function(modelName,json,sideload){var id=json.id;var url=this.buildURL(modelName,id);var responseJson={};responseJson[modelName]=json;$.extend(responseJson,sideload);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200})},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url=this.buildURL(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=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:status||200})},handleDelete:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,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 traits={};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,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,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(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)};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(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(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.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(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"){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(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}}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){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(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);var inverseName=relationship.options&&relationship.options.inverse;if(belongsToName||inverseName){child.set(belongsToName||inverseName,model)}})}})},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)}}});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}}},buildURL:function(type,id){return this.getStore().adapterFor("application").buildURL(type,id)},handleSideloadFind:function(modelName,json,sideload){var id=json.id;var url=this.buildURL(modelName,id);var responseJson={};responseJson[modelName]=json;$.extend(responseJson,sideload);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200})},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url=this.buildURL(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=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:status||200})},handleDelete:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:status||200})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
@@ -179,11 +179,11 @@
179
179
  @param {Object} options a hash of options
180
180
  @return {Ember.computed} relationship
181
181
  */
182
- DS.hasMany = function(type, options) {
183
- if (typeof type === 'object') {
184
- options = type;
185
- type = undefined;
186
- }
187
- return hasRelationship(type, options);
188
- }
182
+ // DS.hasMany = function(type, options) {
183
+ // if (typeof type === 'object') {
184
+ // options = type;
185
+ // type = undefined;
186
+ // }
187
+ // return hasRelationship(type, options);
188
+ // }
189
189
  }).call();
@@ -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.7.0"
4
+ s.version = "0.7.1"
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.7.0",
3
+ "version": "0.7.1",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
data/src/has_many.js CHANGED
@@ -179,11 +179,11 @@
179
179
  @param {Object} options a hash of options
180
180
  @return {Ember.computed} relationship
181
181
  */
182
- DS.hasMany = function(type, options) {
183
- if (typeof type === 'object') {
184
- options = type;
185
- type = undefined;
186
- }
187
- return hasRelationship(type, options);
188
- }
182
+ // DS.hasMany = function(type, options) {
183
+ // if (typeof type === 'object') {
184
+ // options = type;
185
+ // type = undefined;
186
+ // }
187
+ // return hasRelationship(type, options);
188
+ // }
189
189
  }).call();
data/src/store.js CHANGED
@@ -37,7 +37,7 @@ DS.Store.reopen({
37
37
  modelType = store.modelFor(modelName);
38
38
  }
39
39
  model = store.push(modelName, fixture);
40
- // store.setAssociationsForRESTAdapter(modelType, modelName, model);
40
+ store.setAssociationsForRESTAdapter(modelType, modelName, model);
41
41
  });
42
42
  return model;
43
43
  }
@@ -85,14 +85,14 @@ DS.Store.reopen({
85
85
  @param {String} modelName model name like 'user'
86
86
  @param {Object} fixture to check for needed association assignments
87
87
  */
88
- setAssociationsForFixtureAdapter: function(modelType, modelName, fixture) {
88
+ setAssociationsForFixtureAdapter: function (modelType, modelName, fixture) {
89
89
  var self = this;
90
90
  var adapter = this.adapterFor('application');
91
91
  Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
92
92
  if (relationship.kind == 'hasMany') {
93
93
  var hasManyRelation = fixture[relationship.key];
94
94
  if (hasManyRelation) {
95
- $.each(fixture[relationship.key], function(index,object) {
95
+ $.each(fixture[relationship.key], function (index, object) {
96
96
  // used to require that the relationship was set by id,
97
97
  // but now, you can set it as the json object, and this will
98
98
  // normalize that back to the id
@@ -131,8 +131,8 @@ DS.Store.reopen({
131
131
  Before pushing the fixture to the store, do some preprocessing.
132
132
 
133
133
  If its a belongs to association, and the fixture has an object there,
134
- then push that model to the store and set the id of that new model
135
- as the attribute value in the fixture
134
+ then push that model to the store and set the id of that new model
135
+ as the attribute value in the fixture
136
136
 
137
137
  @param modelType
138
138
  @param fixture
@@ -151,18 +151,71 @@ DS.Store.reopen({
151
151
  var hasManyRecords = fixture[relationship.key];
152
152
  // if the records are objects and not instances they need to be converted to
153
153
  // instances
154
- if (Ember.typeOf(hasManyRecords) == 'array' && Ember.typeOf(hasManyRecords[0]) == 'object') {
155
- var records = Em.A()
156
- hasManyRecords.forEach(function(record) {
157
- var record = store.push(relationship.type, record);
158
- records.push(record);
159
- })
160
- fixture[relationship.key] = records;
154
+ if (Ember.typeOf(hasManyRecords) == 'array') {
155
+ if (Ember.typeOf(hasManyRecords[0]) == 'object') {
156
+ var records = Em.A()
157
+ hasManyRecords.map(function (object) {
158
+ var record = store.push(relationship.type, object);
159
+ records.push(record);
160
+ return record;
161
+ })
162
+ fixture[relationship.key] = records;
163
+ }
161
164
  }
162
165
  }
163
166
  })
164
167
  },
165
168
 
169
+ /**
170
+ For the REST type models:
171
+
172
+ For example if a user hasMany projects, then set the user
173
+ on each project that the user hasMany of, so that the project
174
+ now has the belongsTo user association setup. As in this scenario:
175
+
176
+ ```js
177
+ var project = store.makeFixture('project');
178
+ var user = store.makeFixture('user', {projects: [project]});
179
+ ```
180
+
181
+ Or if you make a user, then a project with that user, then set the project
182
+ in the users list of 'projects' it hasMany of. As in this scenario:
183
+
184
+ ```js
185
+ var user = store.makeFixture('user');
186
+ var project = store.makeFixture('project', {user: user});
187
+ ```
188
+
189
+ NOTE:
190
+ As of ember-data-1.0.0-beta.10, this method is only needed because the belongsTo
191
+ is not assigned when there is a self referential polymorphic has many association.
192
+
193
+ @param {DS.Model} modelType model type like 'User'
194
+ @param {String} modelName model name like 'user'
195
+ @param {DS.Model} model model to check for needed association assignments
196
+ */
197
+ setAssociationsForRESTAdapter: function (modelType, modelName, model) {
198
+ var self = this;
199
+ Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
200
+ if (relationship.kind == 'hasMany') {
201
+ var children = model.get(name) || [];
202
+ children.forEach(function (child) {
203
+ var belongsToName = self.findRelationshipName(
204
+ 'belongsTo',
205
+ child.constructor,
206
+ model
207
+ );
208
+ var inverseName = (relationship.options && relationship.options.inverse)
209
+ if (belongsToName || inverseName) {
210
+ child.set(belongsToName || inverseName, model);
211
+ }
212
+ })
213
+ }
214
+
215
+ })
216
+ },
217
+
218
+
166
219
  findRelationshipName: function (kind, belongToModelType, childModel) {
167
220
  var relationshipName;
168
221
  Ember.get(belongToModelType, 'relationshipsByName').forEach(
@@ -22,8 +22,8 @@ test("#resetModels clears the store of models, and resets the model definition",
22
22
 
23
23
  FactoryGuy.resetModels(store);
24
24
 
25
- equal(store.all('user').get('content.length'),0)
26
- equal(store.all('project').get('content.length'),0)
25
+ // equal(store.all('user').get('content.length'),0)
26
+ // equal(store.all('project').get('content.length'),0)
27
27
 
28
28
  for (model in FactoryGuy.modelDefinitions) {
29
29
  var definition = FactoryGuy.modelDefinitions[model];
@@ -54,7 +54,7 @@ asyncTest("creates records in the store", function() {
54
54
  var user = store.makeFixture('user');
55
55
 
56
56
  store.find('user', user.id).then ( function(store_user) {
57
- equal(store_user, user);
57
+ ok(store_user == user);
58
58
  start()
59
59
  });
60
60
  });
@@ -70,48 +70,63 @@ test("when hasMany associations assigned, belongTo parent is assigned", function
70
70
  var project = store.makeFixture('project');
71
71
  var user = store.makeFixture('user', {projects: [project]})
72
72
 
73
- equal(project.get('user'), user);
73
+ ok(project.get('user') == user);
74
74
  });
75
75
 
76
76
 
77
- asyncTest("when asnyc hasMany associations assigned, belongTo parent is assigned", function() {
77
+ asyncTest("when hasMany ( asnyc ) associations assigned, belongTo parent is assigned", function() {
78
78
  var user = store.makeFixture('user');
79
79
  var company = store.makeFixture('company', {users: [user]});
80
80
 
81
81
  user.get('company').then(function(c){
82
- equal(c, company);
82
+ ok(c == company);
83
83
  start();
84
84
  })
85
85
  });
86
86
 
87
87
 
88
- test("when polymorphic hasMany associations are assigned, belongTo parent is assigned", function() {
88
+ test("when hasMany ( polymorphic ) associations are assigned, belongTo parent is assigned", function() {
89
89
  var bh = store.makeFixture('big_hat');
90
90
  var sh = store.makeFixture('small_hat');
91
91
  var user = store.makeFixture('user', {hats: [bh, sh]})
92
92
 
93
- equal(user.get('hats.members.list.length'), 2);
94
- ok(user.get('hats.manyArray.firstObject') instanceof BigHat)
95
- ok(user.get('hats.manyArray.lastObject') instanceof SmallHat)
93
+ equal(user.get('hats.length'), 2);
94
+ ok(user.get('hats.firstObject') instanceof BigHat)
95
+ ok(user.get('hats.lastObject') instanceof SmallHat)
96
96
  // sets the belongTo user association
97
97
  ok(bh.get('user') == user)
98
98
  ok(sh.get('user') == user)
99
99
  });
100
100
 
101
101
 
102
+ test("when hasMany ( self referential ) associations are assigned, belongsTo parent is assigned", function() {
103
+ var big_group = store.makeFixture('big_group');
104
+ var group = store.makeFixture('group', {versions: [big_group]});
105
+ ok(big_group.get('group') == group)
106
+ });
107
+
108
+
102
109
  test("when hasMany associations are assigned, belongsTo parent is assigned using inverse", function() {
103
110
  var project = store.makeFixture('project');
104
111
  var project2 = store.makeFixture('project', {children: [project]});
105
112
 
106
- equal(project.get('parent'), project2);
113
+ ok(project.get('parent') == project2);
107
114
  });
108
115
 
109
116
 
110
117
  test("when hasMany associations are assigned, belongsTo parent is assigned using actual belongsTo name", function() {
111
118
  var silk = store.makeFixture('silk');
112
- var bh = store.makeFixture('big_hat', {materials: [silk]});
119
+ var big_hat = store.makeFixture('big_hat', {materials: [silk]});
120
+
121
+ ok(silk.get('hat') == big_hat)
122
+ });
123
+
124
+
125
+ test("when hasMany associations are assigned, belongsTo ( polymorphic ) parent is assigned", function() {
126
+ var fluff = store.makeFixture('fluffy_material');
127
+ var big_hat = store.makeFixture('big_hat', {fluffy_materials: [fluff]});
113
128
 
114
- equal(silk.get('hat'), bh)
129
+ ok(fluff.get('hat') == big_hat)
115
130
  });
116
131
 
117
132
 
@@ -120,9 +135,9 @@ test("when belongTo parent is assigned, parent adds to hasMany records", functio
120
135
  var project1 = store.makeFixture('project', {user: user});
121
136
  var project2 = store.makeFixture('project', {user: user});
122
137
 
123
- equal(user.get('projects.members.list.length'), 2);
124
- equal(user.get('projects.manyArray.firstObject'), project1);
125
- equal(user.get('projects.manyArray.lastObject'), project2);
138
+ equal(user.get('projects.length'), 2);
139
+ ok(user.get('projects.firstObject') == project1);
140
+ ok(user.get('projects.lastObject') == project2);
126
141
  });
127
142
 
128
143
 
@@ -131,9 +146,9 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
131
146
  store.makeFixture('big_hat', {user: user});
132
147
  store.makeFixture('small_hat', {user: user});
133
148
 
134
- equal(user.get('hats.members.list.length'), 2);
135
- ok(user.get('hats.manyArray.firstObject') instanceof BigHat)
136
- ok(user.get('hats.manyArray.lastObject') instanceof SmallHat)
149
+ equal(user.get('hats.length'), 2);
150
+ ok(user.get('hats.firstObject') instanceof BigHat)
151
+ ok(user.get('hats.lastObject') instanceof SmallHat)
137
152
  });
138
153
 
139
154
 
@@ -142,9 +157,9 @@ asyncTest("when async hasMany relationship is assigned, model relationship is sy
142
157
  var user1 = store.makeFixture('user', {properties: [property]});
143
158
  var user2 = store.makeFixture('user', {properties: [property]});
144
159
 
145
- equal(property.get('owners.members.list.length'), 2);
146
- equal(property.get('owners.manyArray.firstObject'), user1);
147
- equal(property.get('owners.manyArray.lastObject'), user2);
160
+ equal(property.get('owners.length'), 2);
161
+ ok(property.get('owners.firstObject') == user1);
162
+ ok(property.get('owners.lastObject') == user2);
148
163
  start();
149
164
  });
150
165
 
@@ -154,9 +169,9 @@ asyncTest("when async belongsTo parent is assigned, parent adds to hasMany recor
154
169
  var user1 = store.makeFixture('user', {company: company});
155
170
  var user2 = store.makeFixture('user', {company: company});
156
171
 
157
- equal(company.get('users.members.list.length'), 2);
158
- equal(company.get('users.manyArray.firstObject'), user1);
159
- equal(company.get('users.manyArray.lastObject'), user2);
172
+ equal(company.get('users.length'), 2);
173
+ ok(company.get('users.firstObject') == user1);
174
+ ok(company.get('users.lastObject') == user2);
160
175
  start();
161
176
  });
162
177
 
@@ -165,8 +180,8 @@ test("when belongTo parent is assigned, parent adds to hasMany record using inve
165
180
  var project = store.makeFixture('project');
166
181
  var project2 = store.makeFixture('project', {parent: project});
167
182
 
168
- equal(project.get('children.members.list.length'), 1);
169
- equal(project.get('children.manyArray.firstObject'), project2);
183
+ equal(project.get('children.length'), 1);
184
+ ok(project.get('children.firstObject') == project2);
170
185
  });
171
186
 
172
187
 
@@ -174,34 +189,34 @@ test("when belongTo parent is assigned, parent adds to hasMany record using actu
174
189
  var bh = store.makeFixture('big_hat');
175
190
  var silk = store.makeFixture('silk', {hat: bh});
176
191
 
177
- equal(bh.get('materials.manyArray.firstObject'), silk)
192
+ ok(bh.get('materials.firstObject') == silk)
178
193
  });
179
194
 
180
195
 
181
196
  test("when belongTo parent is assigned, parent adds to belongsTo record", function() {
182
197
  var company = store.makeFixture('company');
183
198
  var profile = store.makeFixture('profile', {company: company});
184
- equal(company.get('profile'), profile);
199
+ ok(company.get('profile') == profile);
185
200
 
186
201
  // but guard against a situation where a model can belong to itself
187
202
  // and do not want to set the belongsTo on this case.
188
203
  var hat1 = store.makeFixture('big_hat')
189
204
  var hat2 = store.makeFixture('big_hat', {hat: hat1})
190
- equal(hat1.get('hat'), null);
191
- equal(hat2.get('hat'), hat1);
205
+ ok(hat1.get('hat') == null);
206
+ ok(hat2.get('hat') == hat1);
192
207
  });
193
208
 
194
209
 
195
210
  test("belongsTo associations defined as attributes in fixture", function() {
196
211
  var project = store.makeFixture('project_with_user');
197
212
  equal(project.get('user') instanceof User, true)
198
- equal(project.get('user.name'), 'User1');
213
+ ok(project.get('user.name') == 'User1');
199
214
 
200
215
  var project = store.makeFixture('project_with_dude');
201
- equal(project.get('user.name'), 'Dude');
216
+ ok(project.get('user.name') == 'Dude');
202
217
 
203
218
  var project = store.makeFixture('project_with_admin');
204
- equal(project.get('user.name'), 'Admin');
219
+ ok(project.get('user.name') == 'Admin');
205
220
  });
206
221
 
207
222
 
@@ -219,7 +234,7 @@ module('DS.Store#makeList with ActiveModelAdapter', {
219
234
  test("creates list of DS.Model instances", function() {
220
235
  var users = store.makeList('user', 2);
221
236
  equal(users.length, 2);
222
- equal(users[0] instanceof DS.Model, true);
237
+ ok(users[0] instanceof DS.Model == true);
223
238
  });
224
239
 
225
240
 
@@ -227,8 +242,8 @@ test("creates records in the store", function() {
227
242
  var users = store.makeList('user', 2);
228
243
 
229
244
  var storeUsers = store.all('user').get('content');
230
- equal(storeUsers[0], users[0]);
231
- equal(storeUsers[1], users[1]);
245
+ ok(storeUsers[0] == users[0]);
246
+ ok(storeUsers[1] == users[1]);
232
247
  });
233
248
 
234
249