ember-data-factory-guy 0.1.2 → 0.1.3
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.
- data/Gruntfile.js +2 -0
- data/README.md +11 -8
- data/bower.json +1 -1
- data/dist/ember-data-factory-guy.js +2 -2
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/ember-data-factory-guy.gemspec +1 -1
- data/package.json +1 -1
- data/src/factory_guy.js +2 -2
- data/tests/factory_guy_test.js +3 -2
- data/vendor/assets/javascripts/ember_data_factory_guy.js +117 -2
- metadata +1 -1
data/Gruntfile.js
CHANGED
data/README.md
CHANGED
@@ -42,11 +42,12 @@ Add fixtures to the store using the:
|
|
42
42
|
* DS.ActiveModelAdapter
|
43
43
|
|
44
44
|
NOTE: The benefit of using FactoryGuy is that you can run your tests with the
|
45
|
-
default adapter that
|
46
|
-
to use the DS.FixtureAdapter. But if you do choose to use the Fixture adapter,
|
47
|
-
which does not run any faster, and does not handle associations as elegantly
|
45
|
+
default adapter that your application's store normally uses. In other words:
|
46
|
+
You do not have to use the DS.FixtureAdapter. But if you do choose to use the Fixture adapter,
|
47
|
+
which does not run any faster, and does not handle associations as elegantly
|
48
|
+
( and in some cases not at all ),
|
48
49
|
you may run into problems with accessing associations.
|
49
|
-
If you do get these errors try requiring the factory_guy_has_many.js file
|
50
|
+
If you do get these types of errors try requiring the factory_guy_has_many.js file
|
50
51
|
( located in dist dir and vendor dir ) AFTER you require ember-data,
|
51
52
|
but BEFORE you require your models.
|
52
53
|
|
@@ -78,12 +79,13 @@ but BEFORE you require your models.
|
|
78
79
|
|
79
80
|
// default values for 'user' attributes
|
80
81
|
default: {
|
81
|
-
type: 'normal'
|
82
|
-
|
82
|
+
type: 'normal',
|
83
|
+
// use the 'userName' sequence for this attribute
|
84
|
+
name: FactoryGuy.generate('userName')
|
83
85
|
},
|
84
86
|
// named 'user' type with custom attributes
|
85
87
|
admin: {
|
86
|
-
type: 'superuser'
|
88
|
+
type: 'superuser',
|
87
89
|
name: 'Admin'
|
88
90
|
}
|
89
91
|
});
|
@@ -155,6 +157,7 @@ but BEFORE you require your models.
|
|
155
157
|
// start asking for data, as soon as you get the model
|
156
158
|
//
|
157
159
|
var user = store.makeFixture('user'); // user.toJSON() = {id: 1, name: 'User1', type: 'normal'}
|
160
|
+
// note that the user name is a sequence
|
158
161
|
var user = store.makeFixture('user'); // user.toJSON() = {id: 2, name: 'User2', type: 'normal'}
|
159
162
|
var user = store.makeFixture('user', {name: 'bob'}); // user.toJSON() = {id: 3, name: 'bob', type: 'normal'}
|
160
163
|
var user = store.makeFixture('admin'); // user.toJSON() = {id: 4, name: 'Admin', type: 'superuser'}
|
@@ -169,7 +172,7 @@ but BEFORE you require your models.
|
|
169
172
|
user.get('projects.firstObject.user') == user;
|
170
173
|
|
171
174
|
// and to create lists
|
172
|
-
var users = store.makeList('user');
|
175
|
+
var users = store.makeList('user', 3);
|
173
176
|
|
174
177
|
```
|
175
178
|
|
data/bower.json
CHANGED
@@ -113,7 +113,7 @@ ModelDefinition = function (model, config) {
|
|
113
113
|
// initialize
|
114
114
|
parseConfig(config);
|
115
115
|
}
|
116
|
-
FactoryGuy =
|
116
|
+
FactoryGuy = {
|
117
117
|
modelDefinitions: {},
|
118
118
|
|
119
119
|
/**
|
@@ -280,7 +280,7 @@ FactoryGuy = Ember.Object.reopenClass({
|
|
280
280
|
modelClass['FIXTURES'].push(fixture);
|
281
281
|
return fixture;
|
282
282
|
}
|
283
|
-
}
|
283
|
+
}
|
284
284
|
DS.Store.reopen({
|
285
285
|
|
286
286
|
usingFixtureAdapter: function() {
|
@@ -1 +1 @@
|
|
1
|
-
Sequence=function(fn){var index=1;var fn=fn;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){if(!sequences[sequenceName]){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequences[sequenceName].next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attr in fixture){if(typeof fixture[attr]=="function"){fixture[attr]=fixture[attr].call(this)}}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};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=
|
1
|
+
Sequence=function(fn){var index=1;var fn=fn;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){if(!sequences[sequenceName]){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequences[sequenceName].next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attr in fixture){if(typeof fixture[attr]=="function"){fixture[attr]=fixture[attr].call(this)}}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};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(sequenceName){return function(){return this.generate(sequenceName)}},lookupModelForName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition.model}}},lookupDefinitionForName: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.lookupDefinitionForName(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.lookupDefinitionForName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){var typeMaps=store.typeMaps;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}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setBelongsToFixturesAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var self=this;var model;Em.run(function(){model=self.push(modelName,fixture);self.setBelongsToRESTAdapter(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},setBelongsToFixturesAdapter:function(modelType,modelName,parentFixture){var store=this;var adapter=this.adapterFor("application");var relationShips=Ember.get(modelType,"relationshipNames");if(relationShips.hasMany){relationShips.hasMany.forEach(function(relationship){var hasManyModel=store.modelFor(Em.String.singularize(relationship));if(parentFixture[relationship]){parentFixture[relationship].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(hasManyModel);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=parentFixture.id})}})}},setBelongsToRESTAdapter:function(modelType,modelName,parent){var relationShips=Ember.get(modelType,"relationshipNames");if(relationShips.hasMany){relationShips.hasMany.forEach(function(name){var children=parent.get(name);if(children.get("length")>0){children.forEach(function(child){child.set(modelName,parent)})}})}},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);return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},handleCreate:function(name,opts){var model=FactoryGuy.lookupModelForName(name);this.stubEndpointForHttpRequest("/"+Em.String.pluralize(model),this.buildAjaxResponse(name,opts),{type:"POST"})},buildAjaxResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var model=FactoryGuy.lookupModelForName(name);var hash={};hash[model]=fixture;return hash},handleUpdate:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT"})},handleDelete:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE"})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "ember-data-factory-guy"
|
4
|
-
s.version = "0.1.
|
4
|
+
s.version = "0.1.3"
|
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
data/src/factory_guy.js
CHANGED
data/tests/factory_guy_test.js
CHANGED
@@ -45,8 +45,9 @@ test("Using sequences in definitions", function() {
|
|
45
45
|
deepEqual(json, {id: 2, name: 'person #2', type: 'person type #1'}, 'in named attributes');
|
46
46
|
|
47
47
|
throws( function() {
|
48
|
-
|
49
|
-
},
|
48
|
+
FactoryGuy.build('bro')
|
49
|
+
},
|
50
|
+
MissingSequenceError,
|
50
51
|
"throws error when sequence name not found"
|
51
52
|
)
|
52
53
|
});
|
@@ -1,4 +1,119 @@
|
|
1
|
-
|
1
|
+
Sequence = function (fn) {
|
2
|
+
var index = 1;
|
3
|
+
var fn = fn;
|
4
|
+
|
5
|
+
this.next = function () {
|
6
|
+
return fn.call(this, index++);
|
7
|
+
}
|
8
|
+
|
9
|
+
this.reset = function () {
|
10
|
+
index = 1;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
function MissingSequenceError(message) {
|
15
|
+
this.toString = function() { return message }
|
16
|
+
}
|
17
|
+
|
18
|
+
ModelDefinition = function (model, config) {
|
19
|
+
var sequences = {};
|
20
|
+
var defaultAttributes = {};
|
21
|
+
var namedModels = {};
|
22
|
+
var modelId = 1;
|
23
|
+
this.model = model;
|
24
|
+
|
25
|
+
/**
|
26
|
+
@param name model name like 'user' or named type like 'admin'
|
27
|
+
@return boolean true if name is this definitions model or this definition
|
28
|
+
contains a named model with that name
|
29
|
+
*/
|
30
|
+
this.matchesName = function (name) {
|
31
|
+
return model == name || namedModels[name];
|
32
|
+
}
|
33
|
+
|
34
|
+
this.merge = function (config) {
|
35
|
+
}
|
36
|
+
|
37
|
+
/**
|
38
|
+
@param sequenceName
|
39
|
+
@returns output of sequence function
|
40
|
+
*/
|
41
|
+
this.generate = function (sequenceName) {
|
42
|
+
if (!sequences[sequenceName]) {
|
43
|
+
throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+ model+"' definition")
|
44
|
+
}
|
45
|
+
return sequences[sequenceName].next();
|
46
|
+
}
|
47
|
+
|
48
|
+
this.build = function (name, opts) {
|
49
|
+
var modelAttributes = namedModels[name] || {};
|
50
|
+
var fixture = $.extend({}, defaultAttributes, modelAttributes, opts);
|
51
|
+
for (attr in fixture) {
|
52
|
+
if (typeof fixture[attr] == 'function') {
|
53
|
+
fixture[attr] = fixture[attr].call(this)
|
54
|
+
}
|
55
|
+
}
|
56
|
+
if (!fixture.id) {
|
57
|
+
fixture.id = modelId++;
|
58
|
+
}
|
59
|
+
return fixture;
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
Build a list of fixtures
|
64
|
+
|
65
|
+
@param name model name or named model type
|
66
|
+
@param number of fixtures to build
|
67
|
+
@param opts attribute options
|
68
|
+
@returns array of fixtures
|
69
|
+
*/
|
70
|
+
this.buildList = function (name, number, opts) {
|
71
|
+
var arr = [];
|
72
|
+
for (var i = 0; i < number; i++) {
|
73
|
+
arr.push(this.build(name, opts))
|
74
|
+
}
|
75
|
+
return arr;
|
76
|
+
}
|
77
|
+
|
78
|
+
this.reset = function () {
|
79
|
+
modelId = 1;
|
80
|
+
}
|
81
|
+
|
82
|
+
var parseDefault = function (object) {
|
83
|
+
if (!object) {
|
84
|
+
return
|
85
|
+
}
|
86
|
+
defaultAttributes = object;
|
87
|
+
}
|
88
|
+
|
89
|
+
var parseSequences = function (object) {
|
90
|
+
if (!object) {
|
91
|
+
return
|
92
|
+
}
|
93
|
+
for (sequenceName in object) {
|
94
|
+
var sequenceFn = object[sequenceName];
|
95
|
+
if (typeof sequenceFn != 'function') {
|
96
|
+
throw new Error('Problem with [' + sequenceName + '] sequence definition. Sequences must be functions')
|
97
|
+
}
|
98
|
+
object[sequenceName] = new Sequence(sequenceFn);
|
99
|
+
}
|
100
|
+
sequences = object;
|
101
|
+
}
|
102
|
+
|
103
|
+
var parseConfig = function (config) {
|
104
|
+
parseSequences(config.sequences);
|
105
|
+
delete config.sequences;
|
106
|
+
|
107
|
+
parseDefault(config.default);
|
108
|
+
delete config.default;
|
109
|
+
|
110
|
+
namedModels = config;
|
111
|
+
}
|
112
|
+
|
113
|
+
// initialize
|
114
|
+
parseConfig(config);
|
115
|
+
}
|
116
|
+
FactoryGuy = {
|
2
117
|
modelDefinitions: {},
|
3
118
|
|
4
119
|
/**
|
@@ -165,7 +280,7 @@ FactoryGuy = Ember.Object.reopenClass({
|
|
165
280
|
modelClass['FIXTURES'].push(fixture);
|
166
281
|
return fixture;
|
167
282
|
}
|
168
|
-
}
|
283
|
+
}
|
169
284
|
DS.Store.reopen({
|
170
285
|
|
171
286
|
usingFixtureAdapter: function() {
|