factory-js
Version:
Building JavaScript objects inspired by rosie and factory_girl
90 lines (70 loc) • 3 kB
text/coffeescript
class Factory
= class Adapter
constructor: (factory) -> = factory
build: (name, attrs) -> attrs
create: (name, attrs) -> attrs
push: (name, object) -> @[name].push object
: {}
= Factory.Adapter
: ->
= {}
= Factory.Adapter
: ->
for name,factory of
factory.sequences = {}
: (name, block) ->
definition = new FactoryDefinition(name)
if typeof block is 'function'
block.call(definition)
else
for k of block
definition.attr(k, block[k])
[name] = definition
: (name) ->
factory = [name]
factory ? factory : throw new Error("undefined factory \"#{name}\"")
: (factory, name) ->
trait = factory.traits[name]
trait ? trait : throw new Error("undefined trait \"#{name}\" for factory \"#{@name}\"")
: (buildType, names, attrs) ->
names = names.split /\s+/
name = names[0]
factory = (name)
traits = names[1..names.length].map (name) => factory, name
attributes = factory.attributes(attrs, traits)
result = factory.build(buildType, name, attributes.withoutIgnored)
traits.unshift(factory)
traits.map (factory) -> factory.applyCallbacks result, attributes.withIgnored
result
: (buildType, names, list, attrs) ->
if typeof list is 'number'
[0...list].map => buildType, names, attrs
else if list instanceof Array
list.map (listItem) =>
if typeof listItem is 'string'
buildType, "#{names} #{listItem}", attrs
else if listItem.constructor == Object
buildType, names, .merge({}, attrs, listItem)
else
listItem
: (names, attrs) -> 'attributes', names, attrs
: (names, attrs) -> 'build', names, attrs
: (names, attrs) -> 'create', names, attrs
: (names, list, attrs) -> 'build', names, list, attrs
: (names, list, attrs) -> 'create', names, list, attrs
: (namespace) ->
unless namespace? then throw new Error("undefined \"#{namespace}\"")
class Factory.EmberDataAdapter extends Factory.Adapter
build: (name, attrs) -> Ember.run -> namespace.__container__.lookup('store:main').createRecord name, attrs
create: (name, attrs) -> name, attrs
push: (name, object) -> Ember.run => (name).addObject object
Factory.adapter = Factory.EmberDataAdapter
:
merge: (dest, objs...) ->
for obj in objs
dest[k] = v for k, v of obj
dest
evaluate: (obj) ->
for k of obj
obj[k] = if typeof obj[k] is 'function' then obj[k]() else obj[k]
if module?.exports then module.exports = Factory else window.Factory = Factory