ember-data-factory-guy 0.4.2 → 0.5.0

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