ember-data-factory-guy 0.7.0 → 0.7.1

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