Comparing version 0.3.1 to 0.4.0
{ | ||
"name": "rosie", | ||
"version": "0.3.1", | ||
"version": "0.4.0", | ||
"main": "src/rosie.js", | ||
@@ -5,0 +5,0 @@ "ignore": [ |
{ | ||
"name": "rosie", | ||
"version": "0.3.1", | ||
"version": "0.4.0", | ||
"main": "src/rosie.js", | ||
@@ -5,0 +5,0 @@ "ignore": [ |
{ | ||
"name": "rosie", | ||
"version": "0.3.1", | ||
"version": "0.4.0", | ||
"description": "factory for building JavaScript objects, mostly useful for setting up test data. Inspired by factory_girl", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
106
README.md
@@ -11,67 +11,77 @@ # Rosie | ||
Factory.define('game', Game) | ||
.sequence('id') | ||
.attr('is_over', false) | ||
.attr('created_at', function() { return new Date(); }) | ||
.attr('random_seed', function() { return Math.random(); }) | ||
```js | ||
Factory.define('game', Game) | ||
.sequence('id') | ||
.attr('is_over', false) | ||
.attr('created_at', function() { return new Date(); }) | ||
.attr('random_seed', function() { return Math.random(); }) | ||
// Default to two players. If players were given, fill in | ||
// whatever attributes might be missing. | ||
.attr('players', ['players'], function(players) { | ||
if (!players) { players = [{}, {}]; } | ||
return players.map(function(data) { | ||
return Factory.attributes('player', data); | ||
}); | ||
}); | ||
// Default to two players. If players were given, fill in | ||
// whatever attributes might be missing. | ||
.attr('players', ['players'], function(players) { | ||
if (!players) { players = [{}, {}]; } | ||
return players.map(function(data) { | ||
return Factory.attributes('player', data); | ||
}); | ||
}); | ||
Factory.define('player') | ||
.sequence('id') | ||
.sequence('name', function(i) { return 'player' + i; }) | ||
Factory.define('player') | ||
.sequence('id') | ||
.sequence('name', function(i) { return 'player' + i; }) | ||
// Define `position` to depend on `id`. | ||
.attr('position', ['id'], function(id) { | ||
var positions = ['pitcher', '1st base', '2nd base', '3rd base']; | ||
return positions[id % positions.length]; | ||
}); | ||
// Define `position` to depend on `id`. | ||
.attr('position', ['id'], function(id) { | ||
var positions = ['pitcher', '1st base', '2nd base', '3rd base']; | ||
return positions[id % positions.length]; | ||
}); | ||
Factory.define('disabled-player').extend('player').attr('state', 'disabled') | ||
Factory.define('disabled-player').extend('player').attr('state', 'disabled') | ||
``` | ||
Now you can build an object, passing in attributes that you want to override: | ||
var game = Factory.build('game', {is_over:true}); | ||
```js | ||
var game = Factory.build('game', {is_over:true}); | ||
``` | ||
Which returns an object that looks roughly like: | ||
{ | ||
id: 1, | ||
is_over: true, // overriden when building | ||
created_at: Fri Apr 15 2011 12:02:25 GMT-0400 (EDT), | ||
random_seed: 0.8999513240996748, | ||
players: [ | ||
{id: 1, name:'Player 1'}, | ||
{id: 2, name:'Player 2'} | ||
] | ||
} | ||
```js | ||
{ | ||
id: 1, | ||
is_over: true, // overriden when building | ||
created_at: Fri Apr 15 2011 12:02:25 GMT-0400 (EDT), | ||
random_seed: 0.8999513240996748, | ||
players: [ | ||
{id: 1, name:'Player 1'}, | ||
{id: 2, name:'Player 2'} | ||
] | ||
} | ||
```` | ||
For a factory with a constructor, if you want just the attributes: | ||
Factory.attributes('game') // return just the attributes | ||
```js | ||
Factory.attributes('game') // return just the attributes | ||
``` | ||
You can also define a callback function to be run after building an object: | ||
Factory.define('coach') | ||
.option('buildPlayer', false) | ||
.sequence('id') | ||
.attr('players', ['id', 'buildPlayer'], function(id, buildPlayer) { | ||
if (buildPlayer) { | ||
return [Factory.build('player', {coach_id: id})]; | ||
} | ||
}) | ||
.after(function(coach, options) { | ||
if (options.buildPlayer) { | ||
console.log('built player:', coach.players[0]); | ||
} | ||
}); | ||
```js | ||
Factory.define('coach') | ||
.option('buildPlayer', false) | ||
.sequence('id') | ||
.attr('players', ['id', 'buildPlayer'], function(id, buildPlayer) { | ||
if (buildPlayer) { | ||
return [Factory.build('player', {coach_id: id})]; | ||
} | ||
}) | ||
.after(function(coach, options) { | ||
if (options.buildPlayer) { | ||
console.log('built player:', coach.players[0]); | ||
} | ||
}); | ||
Factory.build('coach', {}, {buildPlayer: true}); | ||
Factory.build('coach', {}, {buildPlayer: true}); | ||
``` | ||
@@ -78,0 +88,0 @@ ## Contributing |
@@ -302,2 +302,43 @@ describe('Factory', function() { | ||
}); | ||
it('should be able to depend on one option', function() { | ||
var startTime = 5; | ||
factory.option('startTime', startTime).sequence('time', ['startTime'], function(i, startTime) { | ||
return startTime + i; | ||
}); | ||
expect(factory.attributes()).toEqual({time: startTime + 1}); | ||
expect(factory.attributes()).toEqual({time: startTime + 2}); | ||
expect(factory.attributes()).toEqual({time: startTime + 3}); | ||
}); | ||
it('should be able to depend on one attribute', function() { | ||
var startTime = 5; | ||
factory.attr('startTime', startTime).sequence('time', ['startTime'], function(i, startTime) { | ||
return startTime + i; | ||
}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, time: startTime + 1}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, time: startTime + 2}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, time: startTime + 3}); | ||
}); | ||
it('should be able to depend on several attributes and options', function() { | ||
var startTime = 5; | ||
var endTime = 7; | ||
factory | ||
.attr('startTime', startTime) | ||
.attr('endTime', endTime) | ||
.option('checkEndTime', true) | ||
.sequence('time', ['startTime', 'endTime', 'checkEndTime'], function(i, startTime, endTime, checkEndTime) { | ||
return checkEndTime ? Math.min(startTime + i, endTime) : startTime + i; | ||
}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, endTime: endTime, time: startTime + 1}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, endTime: endTime, time: startTime + 2}); | ||
expect(factory.attributes()).toEqual({startTime: startTime, endTime: endTime, time: startTime + 2}); | ||
}); | ||
}); | ||
@@ -304,0 +345,0 @@ |
@@ -6,3 +6,3 @@ /** | ||
* | ||
* @param {?Function} constructor | ||
* @param {Function=} constructor | ||
* @class | ||
@@ -54,3 +54,3 @@ */ | ||
* @param {string} attr | ||
* @param {?Array.<string>} dependencies | ||
* @param {Array.<string>=} dependencies | ||
* @param {*} value | ||
@@ -95,4 +95,4 @@ * @return {Factory} | ||
* @param {string} attr | ||
* @param {?Array.<string>} dependencies | ||
* @param {?*} value | ||
* @param {Array.<string>=} dependencies | ||
* @param {*=} value | ||
* @return {Factory} | ||
@@ -126,11 +126,19 @@ */ | ||
* @param {string} attr | ||
* @param {?function(number): *} builder | ||
* @param {function(number): *=} builder | ||
* @return {Factory} | ||
*/ | ||
sequence: function(attr, builder) { | ||
sequence: function(attr, dependencies, builder) { | ||
var factory = this; | ||
if (arguments.length === 2) { | ||
builder = dependencies; | ||
dependencies = null; | ||
} | ||
builder = builder || function(i) { return i; }; | ||
return this.attr(attr, function() { | ||
return this.attr(attr, dependencies, function() { | ||
var args = [].slice.call(arguments); | ||
factory.sequences[attr] = factory.sequences[attr] || 0; | ||
return builder(++factory.sequences[attr]); | ||
args.unshift(++factory.sequences[attr]); | ||
return builder.apply(null, args); | ||
}); | ||
@@ -171,4 +179,4 @@ }, | ||
* | ||
* @param {?object} attributes | ||
* @param {?object} options | ||
* @param {object=} attributes | ||
* @param {object=} options | ||
* @return {object} | ||
@@ -356,3 +364,3 @@ */ | ||
* @param {object} dest | ||
* @param {?object} source | ||
* @param {object=} source | ||
* @return {object} | ||
@@ -379,4 +387,4 @@ */ | ||
* | ||
* @param {string} name | ||
* @param {?function(object): *} constructor | ||
* @param {!string} name | ||
* @param {function(object): *=} constructor | ||
* @return {Factory} | ||
@@ -383,0 +391,0 @@ */ |
205911
5145
100