ember-data-factory-guy 0.3.6 → 0.3.7

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: 48d0f7da6694aabe215b16806d8924e7309faa32
4
- data.tar.gz: ebbbd5dd37fd458feb67ab3d15428d729aa201ed
3
+ metadata.gz: ee062dcdf9d9bc4fb670a1fc9bdf0828fd5b3e02
4
+ data.tar.gz: 708c6fc94c00e38a1713e96430eaab7b5d78eaa7
5
5
  SHA512:
6
- metadata.gz: f63cbaedb8e9e6b09f3d4b58ed393be3d3e865a05470cfe4bbf6f5c47780479526178f4d7b32e670886fa482af2e137c880c171d1a066ec1e29e5bd8d23bd758
7
- data.tar.gz: 09185a49e347fcd4c4e96d19d5f5e0958a2dc55483977157fb7ddc0714f3b4db420a063009e50ba66f9824e901fb43fbc3b7b3cf07087bd83300d3f7ef75cde6
6
+ metadata.gz: 7e5132bf51410a64650cca36188fa02c92658a12e14b0e6192e29b957274f4cb01a2363058f1b589984fd2bbc8ce6834ea6efb67112d1374d12ff7de05983a0f
7
+ data.tar.gz: a4a26146f2374e475915b6c1a4bbdae9e9caaf35dff62f6ea3591704ff3af5dbd1f752efd8ba37b3f71b41e442962d296a442af9df5e04e07f8e6eba684fbcdc
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -527,42 +527,55 @@ DS.Store.reopen({
527
527
  var self = this;
528
528
  Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
529
529
  if (relationship.kind == 'hasMany') {
530
+ var belongsToName = modelName;
531
+ if (relationship.options && relationship.options.inverse) {
532
+ belongsToName = relationship.options.inverse;
533
+ }
530
534
  var children = model.get(name) || [];
531
535
  children.forEach(function (child) {
532
- child.set(modelName, model)
536
+ child.set(belongsToName, model);
533
537
  })
534
538
  }
535
539
 
536
540
  if (relationship.kind == 'belongsTo') {
537
541
  var belongsToRecord = model.get(name);
538
- var setAssociation = function() {
539
- var hasManyName = self.findHasManyRelationshipName(
540
- belongsToRecord.constructor,
541
- model
542
- )
543
- if (hasManyName) {
544
- belongsToRecord.get(hasManyName).addObject(model);
545
- }
546
- }
547
542
  if (belongsToRecord) {
543
+ var setAssociations = function() {
544
+ var hasManyName = self.findRelationshipName(
545
+ 'hasMany',
546
+ belongsToRecord.constructor,
547
+ model
548
+ )
549
+ if (hasManyName) {
550
+ belongsToRecord.get(hasManyName).addObject(model);
551
+ }
552
+ var oneToOneName = self.findRelationshipName(
553
+ 'belongsTo',
554
+ belongsToRecord.constructor,
555
+ model
556
+ )
557
+ if (oneToOneName) {
558
+ belongsToRecord.set(oneToOneName, model);
559
+ }
560
+ }
548
561
  if (belongsToRecord.then) {
549
562
  belongsToRecord.then(function(record) {
550
563
  belongsToRecord = record;
551
- setAssociation();
564
+ setAssociations();
552
565
  })
553
566
  } else {
554
- setAssociation();
567
+ setAssociations();
555
568
  }
556
569
  }
557
570
  }
558
571
  })
559
572
  },
560
573
 
561
- findHasManyRelationshipName: function (belongToModelType, childModel) {
574
+ findRelationshipName: function (kind, belongToModelType, childModel) {
562
575
  var relationshipName;
563
576
  Ember.get(belongToModelType, 'relationshipsByName').forEach(
564
577
  function (name, relationship) {
565
- if (relationship.kind == 'hasMany' &&
578
+ if (relationship.kind == kind &&
566
579
  childModel instanceof relationship.type) {
567
580
  relationshipName = relationship.key;
568
581
  }
@@ -652,7 +665,8 @@ DS.FixtureAdapter.reopen({
652
665
  relationShips.belongsTo.forEach(function (relationship) {
653
666
  var belongsToRecord = record.get(relationship);
654
667
  if (belongsToRecord) {
655
- var hasManyName = store.findHasManyRelationshipName(
668
+ var hasManyName = store.findRelationshipName(
669
+ 'hasMany',
656
670
  belongsToRecord.constructor,
657
671
  record
658
672
  );
@@ -1 +1 @@
1
- Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){var sequence=sequences[sequenceName];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(sequenceName){return function(){return this.generate(sequenceName)}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore()}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){child.set(modelName,model)})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);var setAssociation=function(){var hasManyName=self.findHasManyRelationshipName(belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model)}};if(belongsToRecord){if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociation()})}else{setAssociation()}}}})},findHasManyRelationshipName:function(belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){var relationShips=Ember.get(type,"relationshipNames");if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){var belongsToRecord=record.get(relationship);if(belongsToRecord){var hasManyName=store.findHasManyRelationshipName(belongsToRecord.constructor,record);belongsToRecord.get(hasManyName).addObject(record)}})}});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},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)},handleCreate:function(name,opts){var model=FactoryGuy.lookupModelForFixtureName(name);this.stubEndpointForHttpRequest("/"+Em.String.pluralize(model),this.buildAjaxCreateResponse(name,opts),{type:"POST"})},buildAjaxCreateResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var model=FactoryGuy.lookupModelForFixtureName(name);var hash={};hash[model]=fixture;return hash},handleUpdate:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT"})},handleDelete:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE"})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
1
+ Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){var sequence=sequences[sequenceName];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(sequenceName){return function(){return this.generate(sequenceName)}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore()}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var belongsToName=modelName;if(relationship.options&&relationship.options.inverse){belongsToName=relationship.options.inverse}var children=model.get(name)||[];children.forEach(function(child){child.set(belongsToName,model)})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model)}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){var relationShips=Ember.get(type,"relationshipNames");if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){var belongsToRecord=record.get(relationship);if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.get(hasManyName).addObject(record)}})}});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},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)},handleCreate:function(name,opts){var model=FactoryGuy.lookupModelForFixtureName(name);this.stubEndpointForHttpRequest("/"+Em.String.pluralize(model),this.buildAjaxCreateResponse(name,opts),{type:"POST"})},buildAjaxCreateResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var model=FactoryGuy.lookupModelForFixtureName(name);var hash={};hash[model]=fixture;return hash},handleUpdate:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT"})},handleDelete:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE"})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "ember-data-factory-guy"
4
- s.version = "0.3.6"
4
+ s.version = "0.3.7"
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.3.6",
3
+ "version": "0.3.7",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
data/src/store.js CHANGED
@@ -169,42 +169,55 @@ DS.Store.reopen({
169
169
  var self = this;
170
170
  Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
171
171
  if (relationship.kind == 'hasMany') {
172
+ var belongsToName = modelName;
173
+ if (relationship.options && relationship.options.inverse) {
174
+ belongsToName = relationship.options.inverse;
175
+ }
172
176
  var children = model.get(name) || [];
173
177
  children.forEach(function (child) {
174
- child.set(modelName, model)
178
+ child.set(belongsToName, model);
175
179
  })
176
180
  }
177
181
 
178
182
  if (relationship.kind == 'belongsTo') {
179
183
  var belongsToRecord = model.get(name);
180
- var setAssociation = function() {
181
- var hasManyName = self.findHasManyRelationshipName(
182
- belongsToRecord.constructor,
183
- model
184
- )
185
- if (hasManyName) {
186
- belongsToRecord.get(hasManyName).addObject(model);
187
- }
188
- }
189
184
  if (belongsToRecord) {
185
+ var setAssociations = function() {
186
+ var hasManyName = self.findRelationshipName(
187
+ 'hasMany',
188
+ belongsToRecord.constructor,
189
+ model
190
+ )
191
+ if (hasManyName) {
192
+ belongsToRecord.get(hasManyName).addObject(model);
193
+ }
194
+ var oneToOneName = self.findRelationshipName(
195
+ 'belongsTo',
196
+ belongsToRecord.constructor,
197
+ model
198
+ )
199
+ if (oneToOneName) {
200
+ belongsToRecord.set(oneToOneName, model);
201
+ }
202
+ }
190
203
  if (belongsToRecord.then) {
191
204
  belongsToRecord.then(function(record) {
192
205
  belongsToRecord = record;
193
- setAssociation();
206
+ setAssociations();
194
207
  })
195
208
  } else {
196
- setAssociation();
209
+ setAssociations();
197
210
  }
198
211
  }
199
212
  }
200
213
  })
201
214
  },
202
215
 
203
- findHasManyRelationshipName: function (belongToModelType, childModel) {
216
+ findRelationshipName: function (kind, belongToModelType, childModel) {
204
217
  var relationshipName;
205
218
  Ember.get(belongToModelType, 'relationshipsByName').forEach(
206
219
  function (name, relationship) {
207
- if (relationship.kind == 'hasMany' &&
220
+ if (relationship.kind == kind &&
208
221
  childModel instanceof relationship.type) {
209
222
  relationshipName = relationship.key;
210
223
  }
@@ -294,7 +307,8 @@ DS.FixtureAdapter.reopen({
294
307
  relationShips.belongsTo.forEach(function (relationship) {
295
308
  var belongsToRecord = record.get(relationship);
296
309
  if (belongsToRecord) {
297
- var hasManyName = store.findHasManyRelationshipName(
310
+ var hasManyName = store.findRelationshipName(
311
+ 'hasMany',
298
312
  belongsToRecord.constructor,
299
313
  record
300
314
  );
@@ -59,6 +59,7 @@ asyncTest("creates records in the store", function() {
59
59
  });
60
60
  });
61
61
 
62
+
62
63
  test("when hasMany associations assigned, belongTo parent is assigned", function() {
63
64
  var project = store.makeFixture('project');
64
65
  var user = store.makeFixture('user', {projects: [project]})
@@ -92,6 +93,13 @@ test("when polymorphic hasMany associations are assigned, belongTo parent is ass
92
93
  });
93
94
 
94
95
 
96
+ test("when hasMany associations are assigned, belongsTo parent is assigned using inverse", function() {
97
+ var project = store.makeFixture('project');
98
+ var project2 = store.makeFixture('project', {children: [project]});
99
+ deepEqual(project.get('parent').toJSON(), project2.toJSON());
100
+ });
101
+
102
+
95
103
  test("when belongTo parent is assigned, parent adds to hasMany records", function() {
96
104
  var user = store.makeFixture('user');
97
105
  var project1 = store.makeFixture('project', {user: user});
@@ -126,6 +134,21 @@ asyncTest("when async belongsTo parent is assigned, parent adds to hasMany recor
126
134
  });
127
135
 
128
136
 
137
+ test("when belongTo parent is assigned, parent adds to hasMany record using inverse", function() {
138
+ var project = store.makeFixture('project');
139
+ var project2 = store.makeFixture('project', {parent: project});
140
+ equal(project.get('children.length'), 1);
141
+ deepEqual(project.get('children.firstObject').toJSON(), project2.toJSON());
142
+ });
143
+
144
+
145
+ test("when belongTo parent is assigned, parent adds to belongsTo record", function() {
146
+ var company = store.makeFixture('company');
147
+ var profile = store.makeFixture('profile', {company: company});
148
+ deepEqual(company.get('profile').toJSON(), profile.toJSON());
149
+ });
150
+
151
+
129
152
  test("belongsTo associations defined as attributes in fixture", function() {
130
153
  var project = store.makeFixture('project_with_user');
131
154
  equal(project.get('user') instanceof User, true)
@@ -82,13 +82,13 @@ test("Referring to other attributes in attribute definition", function() {
82
82
 
83
83
  test("Using associations in attribute definition", function() {
84
84
  var json = FactoryGuy.build('project_with_user');
85
- deepEqual(json, {id: 1, title: 'Project', user: {id: 1, name: 'User1'}}, 'creates default user for "user" belongsTo attribute');
85
+ deepEqual(json, {id: 1, title: 'Project1', user: {id: 1, name: 'User1'}}, 'creates default user for "user" belongsTo attribute');
86
86
 
87
87
  var json = FactoryGuy.build('project_with_dude');
88
- deepEqual(json, {id: 2, title: 'Project', user: {id: 2, name: 'Dude'}}, 'creates user with optional attributes for "user" belongsTo attribute');
88
+ deepEqual(json, {id: 2, title: 'Project2', user: {id: 2, name: 'Dude'}}, 'creates user with optional attributes for "user" belongsTo attribute');
89
89
 
90
90
  var json = FactoryGuy.build('project_with_admin');
91
- deepEqual(json, {id: 3, title: 'Project', user: {id: 3, name: 'Admin'}}, 'creates named user for "user" belongsTo attribute');
91
+ deepEqual(json, {id: 3, title: 'Project3', user: {id: 3, name: 'Admin'}}, 'creates named user for "user" belongsTo attribute');
92
92
  });
93
93
 
94
94
 
@@ -59,6 +59,7 @@ asyncTest("creates records in the store", function() {
59
59
  });
60
60
  });
61
61
 
62
+
62
63
  test("when hasMany associations assigned, belongTo parent is assigned", function() {
63
64
  var project = store.makeFixture('project');
64
65
  var user = store.makeFixture('user', {projects: [project]})
@@ -92,6 +93,13 @@ test("when polymorphic hasMany associations are assigned, belongTo parent is ass
92
93
  });
93
94
 
94
95
 
96
+ test("when hasMany associations are assigned, belongsTo parent is assigned using inverse", function() {
97
+ var project = store.makeFixture('project');
98
+ var project2 = store.makeFixture('project', {children: [project]});
99
+ deepEqual(project.get('parent').toJSON(), project2.toJSON());
100
+ });
101
+
102
+
95
103
  test("when belongTo parent is assigned, parent adds to hasMany records", function() {
96
104
  var user = store.makeFixture('user');
97
105
  var project1 = store.makeFixture('project', {user: user});
@@ -126,6 +134,21 @@ asyncTest("when async belongsTo parent is assigned, parent adds to hasMany recor
126
134
  });
127
135
 
128
136
 
137
+ test("when belongTo parent is assigned, parent adds to hasMany record using inverse", function() {
138
+ var project = store.makeFixture('project');
139
+ var project2 = store.makeFixture('project', {parent: project});
140
+ equal(project.get('children.length'), 1);
141
+ deepEqual(project.get('children.firstObject').toJSON(), project2.toJSON());
142
+ });
143
+
144
+
145
+ test("when belongTo parent is assigned, parent adds to belongsTo record", function() {
146
+ var company = store.makeFixture('company');
147
+ var profile = store.makeFixture('profile', {company: company});
148
+ deepEqual(company.get('profile').toJSON(), profile.toJSON());
149
+ });
150
+
151
+
129
152
  test("belongsTo associations defined as attributes in fixture", function() {
130
153
  var project = store.makeFixture('project_with_user');
131
154
  equal(project.get('user') instanceof User, true)
@@ -0,0 +1,5 @@
1
+ FactoryGuy.define('profile', {
2
+ default: {
3
+ description: 'Text goes here'
4
+ }
5
+ })
@@ -1,6 +1,9 @@
1
1
  FactoryGuy.define('project', {
2
+ sequences: {
3
+ title: function(num) {return 'Project' + num}
4
+ },
2
5
  default: {
3
- title: 'Project'
6
+ title: FactoryGuy.generate('title')
4
7
  },
5
8
  project_with_user: {
6
9
  // user model with default attributes
@@ -1,4 +1,5 @@
1
1
  Company = DS.Model.extend({
2
- name: DS.attr('string'),
3
- users: DS.hasMany('user', {async: true})
4
- })
2
+ name: DS.attr('string'),
3
+ profile: DS.belongsTo('profile'),
4
+ users: DS.hasMany('user', {async: true})
5
+ });
@@ -1,10 +1,10 @@
1
1
  Hat = DS.Model.extend({
2
2
  type: DS.attr('string'),
3
3
  user: DS.belongsTo('user'),
4
- hat: DS.belongsTo('hat', {inverse: 'hats',polymorphic: true}),
4
+ hat: DS.belongsTo('hat', {inverse: 'hats', polymorphic: true}),
5
5
  hats: DS.hasMany('hat', {inverse: 'hat', polymorphic: true})
6
- })
6
+ });
7
7
 
8
- BigHat = Hat.extend()
9
- SmallHat = Hat.extend()
8
+ BigHat = Hat.extend();
9
+ SmallHat = Hat.extend();
10
10
 
@@ -0,0 +1,4 @@
1
+ Profile = DS.Model.extend({
2
+ description: DS.attr('string'),
3
+ company: DS.belongsTo('company')
4
+ });
@@ -1,4 +1,6 @@
1
1
  Project = DS.Model.extend({
2
- title: DS.attr('string'),
3
- user: DS.belongsTo('user')
4
- })
2
+ title: DS.attr('string'),
3
+ user: DS.belongsTo('user'),
4
+ parent: DS.belongsTo('project', {inverse: 'children'}),
5
+ children: DS.hasMany('project', {inverse: 'parent'})
6
+ });
@@ -1,6 +1,6 @@
1
1
  User = DS.Model.extend({
2
2
  name: DS.attr('string'),
3
- company: DS.belongsTo('company', {async: true}),
3
+ company: DS.belongsTo('company', {async: true}),
4
4
  projects: DS.hasMany('project'),
5
- hats: DS.hasMany('hat', {polymorphic: true})
6
- })
5
+ hats: DS.hasMany('hat', {polymorphic: true})
6
+ });
@@ -13,6 +13,7 @@ TestHelper = Ember.Object.createWithMixins(FactoryGuyTestMixin,{
13
13
  container.register("model:small_hat", SmallHat);
14
14
  container.register("model:big_hat", BigHat);
15
15
  container.register("model:user", User);
16
+ container.register("model:profile", Profile);
16
17
  container.register("model:company", Company);
17
18
  container.register("model:project", Project);
18
19
  container.register("store:main", DS.Store.extend({adapter: adapter}));
data/tests/test_setup.js CHANGED
@@ -12,9 +12,17 @@ FactoryGuy.define('hat', {
12
12
  type: 'BigHat'
13
13
  }
14
14
  })
15
+ FactoryGuy.define('profile', {
16
+ default: {
17
+ description: 'Text goes here'
18
+ }
19
+ })
15
20
  FactoryGuy.define('project', {
21
+ sequences: {
22
+ title: function(num) {return 'Project' + num}
23
+ },
16
24
  default: {
17
- title: 'Project'
25
+ title: FactoryGuy.generate('title')
18
26
  },
19
27
  project_with_user: {
20
28
  // user model with default attributes
@@ -40,32 +48,40 @@ FactoryGuy.define('user', {
40
48
  }
41
49
  });
42
50
  Company = DS.Model.extend({
43
- name: DS.attr('string'),
44
- users: DS.hasMany('user', {async: true})
45
- })
51
+ name: DS.attr('string'),
52
+ profile: DS.belongsTo('profile'),
53
+ users: DS.hasMany('user', {async: true})
54
+ });
46
55
 
47
56
  Hat = DS.Model.extend({
48
57
  type: DS.attr('string'),
49
58
  user: DS.belongsTo('user'),
50
- hat: DS.belongsTo('hat', {inverse: 'hats',polymorphic: true}),
59
+ hat: DS.belongsTo('hat', {inverse: 'hats', polymorphic: true}),
51
60
  hats: DS.hasMany('hat', {inverse: 'hat', polymorphic: true})
52
- })
61
+ });
62
+
63
+ BigHat = Hat.extend();
64
+ SmallHat = Hat.extend();
53
65
 
54
- BigHat = Hat.extend()
55
- SmallHat = Hat.extend()
56
66
 
67
+ Profile = DS.Model.extend({
68
+ description: DS.attr('string'),
69
+ company: DS.belongsTo('company')
70
+ });
57
71
 
58
72
  Project = DS.Model.extend({
59
- title: DS.attr('string'),
60
- user: DS.belongsTo('user')
61
- })
73
+ title: DS.attr('string'),
74
+ user: DS.belongsTo('user'),
75
+ parent: DS.belongsTo('project', {inverse: 'children'}),
76
+ children: DS.hasMany('project', {inverse: 'parent'})
77
+ });
62
78
 
63
79
  User = DS.Model.extend({
64
80
  name: DS.attr('string'),
65
- company: DS.belongsTo('company', {async: true}),
81
+ company: DS.belongsTo('company', {async: true}),
66
82
  projects: DS.hasMany('project'),
67
- hats: DS.hasMany('hat', {polymorphic: true})
68
- })
83
+ hats: DS.hasMany('hat', {polymorphic: true})
84
+ });
69
85
  /**
70
86
  * Sinon.JS 1.6.0, 2013/02/18
71
87
  *
@@ -527,42 +527,55 @@ DS.Store.reopen({
527
527
  var self = this;
528
528
  Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
529
529
  if (relationship.kind == 'hasMany') {
530
+ var belongsToName = modelName;
531
+ if (relationship.options && relationship.options.inverse) {
532
+ belongsToName = relationship.options.inverse;
533
+ }
530
534
  var children = model.get(name) || [];
531
535
  children.forEach(function (child) {
532
- child.set(modelName, model)
536
+ child.set(belongsToName, model);
533
537
  })
534
538
  }
535
539
 
536
540
  if (relationship.kind == 'belongsTo') {
537
541
  var belongsToRecord = model.get(name);
538
- var setAssociation = function() {
539
- var hasManyName = self.findHasManyRelationshipName(
540
- belongsToRecord.constructor,
541
- model
542
- )
543
- if (hasManyName) {
544
- belongsToRecord.get(hasManyName).addObject(model);
545
- }
546
- }
547
542
  if (belongsToRecord) {
543
+ var setAssociations = function() {
544
+ var hasManyName = self.findRelationshipName(
545
+ 'hasMany',
546
+ belongsToRecord.constructor,
547
+ model
548
+ )
549
+ if (hasManyName) {
550
+ belongsToRecord.get(hasManyName).addObject(model);
551
+ }
552
+ var oneToOneName = self.findRelationshipName(
553
+ 'belongsTo',
554
+ belongsToRecord.constructor,
555
+ model
556
+ )
557
+ if (oneToOneName) {
558
+ belongsToRecord.set(oneToOneName, model);
559
+ }
560
+ }
548
561
  if (belongsToRecord.then) {
549
562
  belongsToRecord.then(function(record) {
550
563
  belongsToRecord = record;
551
- setAssociation();
564
+ setAssociations();
552
565
  })
553
566
  } else {
554
- setAssociation();
567
+ setAssociations();
555
568
  }
556
569
  }
557
570
  }
558
571
  })
559
572
  },
560
573
 
561
- findHasManyRelationshipName: function (belongToModelType, childModel) {
574
+ findRelationshipName: function (kind, belongToModelType, childModel) {
562
575
  var relationshipName;
563
576
  Ember.get(belongToModelType, 'relationshipsByName').forEach(
564
577
  function (name, relationship) {
565
- if (relationship.kind == 'hasMany' &&
578
+ if (relationship.kind == kind &&
566
579
  childModel instanceof relationship.type) {
567
580
  relationshipName = relationship.key;
568
581
  }
@@ -652,7 +665,8 @@ DS.FixtureAdapter.reopen({
652
665
  relationShips.belongsTo.forEach(function (relationship) {
653
666
  var belongsToRecord = record.get(relationship);
654
667
  if (belongsToRecord) {
655
- var hasManyName = store.findHasManyRelationshipName(
668
+ var hasManyName = store.findRelationshipName(
669
+ 'hasMany',
656
670
  belongsToRecord.constructor,
657
671
  record
658
672
  );
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ember-data-factory-guy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Sudol
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-30 00:00:00.000000000 Z
12
+ date: 2014-06-02 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easily create Fixtures for Ember Data
15
15
  email:
@@ -44,11 +44,13 @@ files:
44
44
  - tests/store_test.js
45
45
  - tests/support/factories/company_factory.js
46
46
  - tests/support/factories/hat_factory.js
47
+ - tests/support/factories/profile_factory.js
47
48
  - tests/support/factories/project_factory.js
48
49
  - tests/support/factories/user_factory.js
49
50
  - tests/support/libs/sinon.js
50
51
  - tests/support/models/company.js
51
52
  - tests/support/models/hat.js
53
+ - tests/support/models/profile.js
52
54
  - tests/support/models/project.js
53
55
  - tests/support/models/user.js
54
56
  - tests/support/test_helper.js