ember-data-factory-guy 0.4.2 → 0.5.0

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: 723e4f4e01224440a3e7cd0712f0db55a470ba1c
4
- data.tar.gz: 280d62404418dfdafbf9b3c32ca5854e94522bce
3
+ metadata.gz: 10cce63c16d71075b39d7d4b3134fc97687dd359
4
+ data.tar.gz: f8273a32c925bf4c2791e946435b89d7271fa71a
5
5
  SHA512:
6
- metadata.gz: 1e048aefde5b3bad5d160ea20781bfe83a9a8324df0b25990dec2d74a1a1b91e95dcd402a12bddc0c479fc20285df24d71e8783c9872889408abd2040f5e4383
7
- data.tar.gz: 6a46a70429e37ff619f4427ff90c2cbdc7820bf4ea62926b797cb729cd2a2e07428738d511308e6246a632f63b463f1fc8bb78de36d7d75a07b296d3f3abfa54
6
+ metadata.gz: 60cb0d5dcaf087c7bc4996306c11b1775eab501cac9f1434fc77dcc9019eaf453f4a41303c802f9dea1f02f21237769b8e32191da5525c2caa5e632cbdc4e856
7
+ data.tar.gz: 79591c97aa1841f941cb4298524269286282b50f7510da8a154d784e4ddcf8afabc2bd8430a05d82f54886fa7a4e6f324a3377b557898f1d2f77c797ea095bee
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -23,6 +23,7 @@ function MissingSequenceError(message) {
23
23
  */
24
24
  ModelDefinition = function (model, config) {
25
25
  var sequences = {};
26
+ var traits = {};
26
27
  var defaultAttributes = {};
27
28
  var namedModels = {};
28
29
  var modelId = 1;
@@ -69,12 +70,17 @@ ModelDefinition = function (model, config) {
69
70
 
70
71
  @param {String} name fixture name
71
72
  @param {Object} opts attributes to override
73
+ @param {String} traits array of traits
72
74
  @returns {Object} json
73
75
  */
74
- this.build = function (name, opts) {
76
+ this.build = function (name, opts, traitArgs) {
77
+ var traitsObj = {}
78
+ traitArgs.forEach(function(trait) {
79
+ $.extend(traitsObj, traits[trait]);
80
+ })
75
81
  var modelAttributes = namedModels[name] || {};
76
- // merge default, modelAttributes and opts to get the rough fixture
77
- var fixture = $.extend({}, defaultAttributes, modelAttributes, opts);
82
+ // merge default, modelAttributes, traits and opts to get the rough fixture
83
+ var fixture = $.extend({}, defaultAttributes, modelAttributes, traitsObj, opts);
78
84
  // deal with attributes that are functions or objects
79
85
  for (attribute in fixture) {
80
86
  if (Ember.typeOf(fixture[attribute]) == 'function') {
@@ -98,13 +104,14 @@ ModelDefinition = function (model, config) {
98
104
 
99
105
  @param {String} name model name or named model type
100
106
  @param {Integer} number of fixtures to build
107
+ @param {Array} array of traits to build with
101
108
  @param {Object} opts attribute options
102
109
  @returns array of fixtures
103
110
  */
104
- this.buildList = function (name, number, opts) {
111
+ this.buildList = function (name, number, traits, opts) {
105
112
  var arr = [];
106
113
  for (var i = 0; i < number; i++) {
107
- arr.push(this.build(name, opts))
114
+ arr.push(this.build(name, opts, traits))
108
115
  }
109
116
  return arr;
110
117
  }
@@ -124,13 +131,25 @@ ModelDefinition = function (model, config) {
124
131
  defaultAttributes = object;
125
132
  }
126
133
 
134
+ var parseTraits = function (object) {
135
+ if (!object) {
136
+ return
137
+ }
138
+ // for (trait in object) {
139
+ // var trait = object[trait];
140
+ // if (Ember.typeOf(trait) == 'function') {}
141
+ // object[trait] = new Trait(trait);
142
+ // }
143
+ traits = object;
144
+ }
145
+
127
146
  var parseSequences = function (object) {
128
147
  if (!object) {
129
148
  return
130
149
  }
131
150
  for (sequenceName in object) {
132
151
  var sequenceFn = object[sequenceName];
133
- if (typeof sequenceFn != 'function') {
152
+ if (Ember.typeOf(sequenceFn) != 'function') {
134
153
  throw new Error('Problem with [' + sequenceName + '] sequence definition. Sequences must be functions')
135
154
  }
136
155
  object[sequenceName] = new Sequence(sequenceFn);
@@ -142,6 +161,9 @@ ModelDefinition = function (model, config) {
142
161
  parseSequences(config.sequences);
143
162
  delete config.sequences;
144
163
 
164
+ parseTraits(config.traits);
165
+ delete config.traits;
166
+
145
167
  parseDefault(config.default);
146
168
  delete config.default;
147
169
 
@@ -293,18 +315,32 @@ FactoryGuy = {
293
315
  Build fixtures for model or specific fixture name. For example:
294
316
 
295
317
  FactoryGuy.build('user') for User model
296
- FactoryGuy.build('bob') for User model with bob attributes
318
+ FactoryGuy.build('bob') for a 'bob' User
319
+ FactoryGuy.build('bob', 'dude') for a 'bob' User with dude traits
320
+ FactoryGuy.build('bob', 'dude', 'funny') for a 'bob' User with dude and funny traits
321
+ FactoryGuy.build('bob', 'dude', name: 'wombat') for a 'bob' User with dude trait and custom attribute name of 'wombat'
297
322
 
298
323
  @param {String} name Fixture name
324
+ @param {String} trait trait name ( can be more than one )
299
325
  @param {Object} opts Options that will override default fixture values
300
326
  @returns {Object} json fixture
301
327
  */
302
- build: function (name, opts) {
328
+ build: function () {
329
+ var args = Array.prototype.slice.call(arguments);
330
+ var opts = {}
331
+ var name = args.shift();
332
+ if (!name) {
333
+ throw new Error("Build needs a factory name to build");
334
+ }
335
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
336
+ opts = args.pop();
337
+ }
338
+ var traits = args; // whatever is left are traits
303
339
  var definition = this.lookupDefinitionForFixtureName(name);
304
340
  if (!definition) {
305
341
  throw new Error("Can't find that factory named [" + name + "]");
306
342
  }
307
- return definition.build(name, opts);
343
+ return definition.build(name, opts, traits);
308
344
  },
309
345
 
310
346
  /**
@@ -315,15 +351,28 @@ FactoryGuy = {
315
351
 
316
352
  @param {String} name fixture name
317
353
  @param {Number} number number of fixtures to create
354
+ @param {String} trait (one or more)
318
355
  @param {Object} opts options that will override default fixture values
319
356
  @returns {Array} list of fixtures
320
357
  */
321
- buildList: function (name, number, opts) {
358
+ buildList: function () {
359
+ var args = Array.prototype.slice.call(arguments);
360
+ var name = args.shift();
361
+ var number = args.shift();
362
+ if (!name || !number) {
363
+ throw new Error("buildList needs a name and a number ( at least ) to build with");
364
+ }
365
+ var opts = {}
366
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
367
+ opts = args.pop();
368
+ }
369
+ var traits = args; // whatever is left are traits
370
+ console.log(name, number, traits+'', opts)
322
371
  var definition = this.lookupDefinitionForFixtureName(name);
323
372
  if (!definition) {
324
373
  throw new Error("Can't find that factory named [" + name + "]");
325
374
  }
326
- return definition.buildList(name, number, opts);
375
+ return definition.buildList(name, number, traits, opts);
327
376
  },
328
377
 
329
378
  /**
@@ -1 +1 @@
1
- Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var store=this;var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);var hasManyName=self.findRelationshipName("hasMany",child.constructor,model);var inverseName=relationship.options&&relationship.options.inverse;if(belongsToName){child.set(belongsToName||inverseName,model)}else if(hasManyName){relation=child.get(hasManyName||inverseName)||[];relation.pushObject(model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){Em.RSVP.Promise.resolve(Ember.get(type,"relationshipNames")).then(function(relationShips){if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then(function(relationship){relationship.addObject(record)})}})})}if(relationShips.hasMany){relationShips.hasMany.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord&&belongsToRecord.get("length")>0){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.forEach(function(child){child.get(hasManyName).addObject(record)})}})})}})});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
1
+ 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)}}},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(){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;console.log(name,number,traits+"",opts);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.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);var hasManyName=self.findRelationshipName("hasMany",child.constructor,model);var inverseName=relationship.options&&relationship.options.inverse;if(belongsToName){child.set(belongsToName||inverseName,model)}else if(hasManyName){relation=child.get(hasManyName||inverseName)||[];relation.pushObject(model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){Em.RSVP.Promise.resolve(Ember.get(type,"relationshipNames")).then(function(relationShips){if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then(function(relationship){relationship.addObject(record)})}})})}if(relationShips.hasMany){relationShips.hasMany.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord&&belongsToRecord.get("length")>0){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.forEach(function(child){child.get(hasManyName).addObject(record)})}})})}})});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "ember-data-factory-guy"
4
- s.version = "0.4.2"
4
+ s.version = "0.5.0"
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = ["Daniel Sudol", "Alex Opak"]
7
7
  s.email = ["dansudol@yahoo.com", "opak.alexandr@gmail.com"]
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
data/src/factory_guy.js CHANGED
@@ -140,18 +140,32 @@ FactoryGuy = {
140
140
  Build fixtures for model or specific fixture name. For example:
141
141
 
142
142
  FactoryGuy.build('user') for User model
143
- FactoryGuy.build('bob') for User model with bob attributes
143
+ FactoryGuy.build('bob') for a 'bob' User
144
+ FactoryGuy.build('bob', 'dude') for a 'bob' User with dude traits
145
+ FactoryGuy.build('bob', 'dude', 'funny') for a 'bob' User with dude and funny traits
146
+ FactoryGuy.build('bob', 'dude', name: 'wombat') for a 'bob' User with dude trait and custom attribute name of 'wombat'
144
147
 
145
148
  @param {String} name Fixture name
149
+ @param {String} trait trait name ( can be more than one )
146
150
  @param {Object} opts Options that will override default fixture values
147
151
  @returns {Object} json fixture
148
152
  */
149
- build: function (name, opts) {
153
+ build: function () {
154
+ var args = Array.prototype.slice.call(arguments);
155
+ var opts = {}
156
+ var name = args.shift();
157
+ if (!name) {
158
+ throw new Error("Build needs a factory name to build");
159
+ }
160
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
161
+ opts = args.pop();
162
+ }
163
+ var traits = args; // whatever is left are traits
150
164
  var definition = this.lookupDefinitionForFixtureName(name);
151
165
  if (!definition) {
152
166
  throw new Error("Can't find that factory named [" + name + "]");
153
167
  }
154
- return definition.build(name, opts);
168
+ return definition.build(name, opts, traits);
155
169
  },
156
170
 
157
171
  /**
@@ -162,15 +176,28 @@ FactoryGuy = {
162
176
 
163
177
  @param {String} name fixture name
164
178
  @param {Number} number number of fixtures to create
179
+ @param {String} trait (one or more)
165
180
  @param {Object} opts options that will override default fixture values
166
181
  @returns {Array} list of fixtures
167
182
  */
168
- buildList: function (name, number, opts) {
183
+ buildList: function () {
184
+ var args = Array.prototype.slice.call(arguments);
185
+ var name = args.shift();
186
+ var number = args.shift();
187
+ if (!name || !number) {
188
+ throw new Error("buildList needs a name and a number ( at least ) to build with");
189
+ }
190
+ var opts = {}
191
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
192
+ opts = args.pop();
193
+ }
194
+ var traits = args; // whatever is left are traits
195
+ console.log(name, number, traits+'', opts)
169
196
  var definition = this.lookupDefinitionForFixtureName(name);
170
197
  if (!definition) {
171
198
  throw new Error("Can't find that factory named [" + name + "]");
172
199
  }
173
- return definition.buildList(name, number, opts);
200
+ return definition.buildList(name, number, traits, opts);
174
201
  },
175
202
 
176
203
  /**
@@ -7,6 +7,7 @@
7
7
  */
8
8
  ModelDefinition = function (model, config) {
9
9
  var sequences = {};
10
+ var traits = {};
10
11
  var defaultAttributes = {};
11
12
  var namedModels = {};
12
13
  var modelId = 1;
@@ -53,12 +54,17 @@ ModelDefinition = function (model, config) {
53
54
 
54
55
  @param {String} name fixture name
55
56
  @param {Object} opts attributes to override
57
+ @param {String} traits array of traits
56
58
  @returns {Object} json
57
59
  */
58
- this.build = function (name, opts) {
60
+ this.build = function (name, opts, traitArgs) {
61
+ var traitsObj = {}
62
+ traitArgs.forEach(function(trait) {
63
+ $.extend(traitsObj, traits[trait]);
64
+ })
59
65
  var modelAttributes = namedModels[name] || {};
60
- // merge default, modelAttributes and opts to get the rough fixture
61
- var fixture = $.extend({}, defaultAttributes, modelAttributes, opts);
66
+ // merge default, modelAttributes, traits and opts to get the rough fixture
67
+ var fixture = $.extend({}, defaultAttributes, modelAttributes, traitsObj, opts);
62
68
  // deal with attributes that are functions or objects
63
69
  for (attribute in fixture) {
64
70
  if (Ember.typeOf(fixture[attribute]) == 'function') {
@@ -82,13 +88,14 @@ ModelDefinition = function (model, config) {
82
88
 
83
89
  @param {String} name model name or named model type
84
90
  @param {Integer} number of fixtures to build
91
+ @param {Array} array of traits to build with
85
92
  @param {Object} opts attribute options
86
93
  @returns array of fixtures
87
94
  */
88
- this.buildList = function (name, number, opts) {
95
+ this.buildList = function (name, number, traits, opts) {
89
96
  var arr = [];
90
97
  for (var i = 0; i < number; i++) {
91
- arr.push(this.build(name, opts))
98
+ arr.push(this.build(name, opts, traits));
92
99
  }
93
100
  return arr;
94
101
  }
@@ -108,13 +115,25 @@ ModelDefinition = function (model, config) {
108
115
  defaultAttributes = object;
109
116
  }
110
117
 
118
+ var parseTraits = function (object) {
119
+ if (!object) {
120
+ return
121
+ }
122
+ // for (trait in object) {
123
+ // var trait = object[trait];
124
+ // if (Ember.typeOf(trait) == 'function') {}
125
+ // object[trait] = new Trait(trait);
126
+ // }
127
+ traits = object;
128
+ }
129
+
111
130
  var parseSequences = function (object) {
112
131
  if (!object) {
113
132
  return
114
133
  }
115
134
  for (sequenceName in object) {
116
135
  var sequenceFn = object[sequenceName];
117
- if (typeof sequenceFn != 'function') {
136
+ if (Ember.typeOf(sequenceFn) != 'function') {
118
137
  throw new Error('Problem with [' + sequenceName + '] sequence definition. Sequences must be functions')
119
138
  }
120
139
  object[sequenceName] = new Sequence(sequenceFn);
@@ -126,6 +145,9 @@ ModelDefinition = function (model, config) {
126
145
  parseSequences(config.sequences);
127
146
  delete config.sequences;
128
147
 
148
+ parseTraits(config.traits);
149
+ delete config.traits;
150
+
129
151
  parseDefault(config.default);
130
152
  delete config.default;
131
153
 
@@ -100,6 +100,30 @@ test("Using associations in attribute definition", function() {
100
100
  });
101
101
 
102
102
 
103
+ test("#build with traits", function() {
104
+ var json = FactoryGuy.build('project', 'big');
105
+ deepEqual(json, {id: 1, title: 'Big Project'}, 'trait with model attributes');
106
+
107
+ var json = FactoryGuy.build('project', 'with_user');
108
+ deepEqual(json, {id: 2, title: 'Project1', user: {id: 1, name: 'User1'}}, 'trait with belongsTo attributes');
109
+
110
+ var json = FactoryGuy.build('project', 'big', 'with_user');
111
+ deepEqual(json, {id: 3, title: 'Big Project', user: {id: 2, name: 'User1'}}, 'more than one trait used together');
112
+
113
+ var json = FactoryGuy.build('project', 'big', 'with_user', {title: 'Crazy Project'});
114
+ deepEqual(json, {id: 4, title: 'Crazy Project', user: {id: 3, name: 'User1'}}, 'more than one trait used together with custom attributes');
115
+
116
+ var json = FactoryGuy.build('project', 'big', 'with_dude');
117
+ deepEqual(json, {id: 5, title: 'Big Project', user: {id: 4, name: 'Dude'}}, 'trait with custom belongsTo association object');
118
+
119
+ var json = FactoryGuy.build('project', 'with_admin');
120
+ deepEqual(json, {id: 6, title: 'Project2', user: {id: 5, name: 'Admin'}}, 'trait with attribute using FactoryGuy.association method');
121
+
122
+ var json = FactoryGuy.build('project', 'with_title_sequence');
123
+ deepEqual(json, {id: 7, title: 'Project3'}, 'trait with attribute using sequence');
124
+ });
125
+
126
+
103
127
  test("#build creates default json for model", function() {
104
128
  var json = FactoryGuy.build('user');
105
129
  deepEqual(json, {id: 1, name: 'User1'});
@@ -138,6 +162,15 @@ test("#buildList creates list of fixtures", function() {
138
162
  var userList = FactoryGuy.buildList('user', 2);
139
163
  deepEqual(userList[0], {id: 1, name: 'User1'});
140
164
  deepEqual(userList[1], {id: 2, name: 'User1'});
165
+
166
+ var userList = FactoryGuy.buildList('user', 1, {name: 'Crazy'});
167
+ deepEqual(userList[0], {id: 3, name: 'Crazy'},'using custom attributes');
168
+
169
+ var projectList = FactoryGuy.buildList('project', 1, 'big');
170
+ deepEqual(projectList[0], {id: 1, title: 'Big Project'}, 'using traits');
171
+
172
+ var projectList = FactoryGuy.buildList('project', 1, 'big', {title: 'Really Big'});
173
+ deepEqual(projectList[0], {id: 2, title: 'Really Big'}, 'using traits and custom attributes');
141
174
  });
142
175
 
143
176
 
@@ -2,6 +2,13 @@ FactoryGuy.define('project', {
2
2
  sequences: {
3
3
  title: function(num) {return 'Project' + num}
4
4
  },
5
+ traits: {
6
+ big: { title: 'Big Project' },
7
+ with_title_sequence: { title: FactoryGuy.generate('title') },
8
+ with_user: { user: {} },
9
+ with_dude: { user: {name: 'Dude'} },
10
+ with_admin: { user: FactoryGuy.association('admin') }
11
+ },
5
12
  default: {
6
13
  title: FactoryGuy.generate('title')
7
14
  },
data/tests/test_setup.js CHANGED
@@ -29,6 +29,13 @@ FactoryGuy.define('project', {
29
29
  sequences: {
30
30
  title: function(num) {return 'Project' + num}
31
31
  },
32
+ traits: {
33
+ big: { title: 'Big Project' },
34
+ with_title_sequence: { title: FactoryGuy.generate('title') },
35
+ with_user: { user: {} },
36
+ with_dude: { user: {name: 'Dude'} },
37
+ with_admin: { user: FactoryGuy.association('admin') }
38
+ },
32
39
  default: {
33
40
  title: FactoryGuy.generate('title')
34
41
  },
@@ -23,6 +23,7 @@ function MissingSequenceError(message) {
23
23
  */
24
24
  ModelDefinition = function (model, config) {
25
25
  var sequences = {};
26
+ var traits = {};
26
27
  var defaultAttributes = {};
27
28
  var namedModels = {};
28
29
  var modelId = 1;
@@ -69,12 +70,17 @@ ModelDefinition = function (model, config) {
69
70
 
70
71
  @param {String} name fixture name
71
72
  @param {Object} opts attributes to override
73
+ @param {String} traits array of traits
72
74
  @returns {Object} json
73
75
  */
74
- this.build = function (name, opts) {
76
+ this.build = function (name, opts, traitArgs) {
77
+ var traitsObj = {}
78
+ traitArgs.forEach(function(trait) {
79
+ $.extend(traitsObj, traits[trait]);
80
+ })
75
81
  var modelAttributes = namedModels[name] || {};
76
- // merge default, modelAttributes and opts to get the rough fixture
77
- var fixture = $.extend({}, defaultAttributes, modelAttributes, opts);
82
+ // merge default, modelAttributes, traits and opts to get the rough fixture
83
+ var fixture = $.extend({}, defaultAttributes, modelAttributes, traitsObj, opts);
78
84
  // deal with attributes that are functions or objects
79
85
  for (attribute in fixture) {
80
86
  if (Ember.typeOf(fixture[attribute]) == 'function') {
@@ -98,13 +104,14 @@ ModelDefinition = function (model, config) {
98
104
 
99
105
  @param {String} name model name or named model type
100
106
  @param {Integer} number of fixtures to build
107
+ @param {Array} array of traits to build with
101
108
  @param {Object} opts attribute options
102
109
  @returns array of fixtures
103
110
  */
104
- this.buildList = function (name, number, opts) {
111
+ this.buildList = function (name, number, traits, opts) {
105
112
  var arr = [];
106
113
  for (var i = 0; i < number; i++) {
107
- arr.push(this.build(name, opts))
114
+ arr.push(this.build(name, opts, traits))
108
115
  }
109
116
  return arr;
110
117
  }
@@ -124,13 +131,25 @@ ModelDefinition = function (model, config) {
124
131
  defaultAttributes = object;
125
132
  }
126
133
 
134
+ var parseTraits = function (object) {
135
+ if (!object) {
136
+ return
137
+ }
138
+ // for (trait in object) {
139
+ // var trait = object[trait];
140
+ // if (Ember.typeOf(trait) == 'function') {}
141
+ // object[trait] = new Trait(trait);
142
+ // }
143
+ traits = object;
144
+ }
145
+
127
146
  var parseSequences = function (object) {
128
147
  if (!object) {
129
148
  return
130
149
  }
131
150
  for (sequenceName in object) {
132
151
  var sequenceFn = object[sequenceName];
133
- if (typeof sequenceFn != 'function') {
152
+ if (Ember.typeOf(sequenceFn) != 'function') {
134
153
  throw new Error('Problem with [' + sequenceName + '] sequence definition. Sequences must be functions')
135
154
  }
136
155
  object[sequenceName] = new Sequence(sequenceFn);
@@ -142,6 +161,9 @@ ModelDefinition = function (model, config) {
142
161
  parseSequences(config.sequences);
143
162
  delete config.sequences;
144
163
 
164
+ parseTraits(config.traits);
165
+ delete config.traits;
166
+
145
167
  parseDefault(config.default);
146
168
  delete config.default;
147
169
 
@@ -293,18 +315,32 @@ FactoryGuy = {
293
315
  Build fixtures for model or specific fixture name. For example:
294
316
 
295
317
  FactoryGuy.build('user') for User model
296
- FactoryGuy.build('bob') for User model with bob attributes
318
+ FactoryGuy.build('bob') for a 'bob' User
319
+ FactoryGuy.build('bob', 'dude') for a 'bob' User with dude traits
320
+ FactoryGuy.build('bob', 'dude', 'funny') for a 'bob' User with dude and funny traits
321
+ FactoryGuy.build('bob', 'dude', name: 'wombat') for a 'bob' User with dude trait and custom attribute name of 'wombat'
297
322
 
298
323
  @param {String} name Fixture name
324
+ @param {String} trait trait name ( can be more than one )
299
325
  @param {Object} opts Options that will override default fixture values
300
326
  @returns {Object} json fixture
301
327
  */
302
- build: function (name, opts) {
328
+ build: function () {
329
+ var args = Array.prototype.slice.call(arguments);
330
+ var opts = {}
331
+ var name = args.shift();
332
+ if (!name) {
333
+ throw new Error("Build needs a factory name to build");
334
+ }
335
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
336
+ opts = args.pop();
337
+ }
338
+ var traits = args; // whatever is left are traits
303
339
  var definition = this.lookupDefinitionForFixtureName(name);
304
340
  if (!definition) {
305
341
  throw new Error("Can't find that factory named [" + name + "]");
306
342
  }
307
- return definition.build(name, opts);
343
+ return definition.build(name, opts, traits);
308
344
  },
309
345
 
310
346
  /**
@@ -315,15 +351,28 @@ FactoryGuy = {
315
351
 
316
352
  @param {String} name fixture name
317
353
  @param {Number} number number of fixtures to create
354
+ @param {String} trait (one or more)
318
355
  @param {Object} opts options that will override default fixture values
319
356
  @returns {Array} list of fixtures
320
357
  */
321
- buildList: function (name, number, opts) {
358
+ buildList: function () {
359
+ var args = Array.prototype.slice.call(arguments);
360
+ var name = args.shift();
361
+ var number = args.shift();
362
+ if (!name || !number) {
363
+ throw new Error("buildList needs a name and a number ( at least ) to build with");
364
+ }
365
+ var opts = {}
366
+ if (Ember.typeOf(args[args.length-1]) == 'object') {
367
+ opts = args.pop();
368
+ }
369
+ var traits = args; // whatever is left are traits
370
+ console.log(name, number, traits+'', opts)
322
371
  var definition = this.lookupDefinitionForFixtureName(name);
323
372
  if (!definition) {
324
373
  throw new Error("Can't find that factory named [" + name + "]");
325
374
  }
326
- return definition.buildList(name, number, opts);
375
+ return definition.buildList(name, number, traits, opts);
327
376
  },
328
377
 
329
378
  /**
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ember-data-factory-guy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Sudol
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-16 00:00:00.000000000 Z
12
+ date: 2014-08-01 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easily create Fixtures for Ember Data
15
15
  email: