kojac 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +7 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +158 -0
- data/MIT-LICENSE +20 -0
- data/README.md +69 -0
- data/Rakefile +27 -0
- data/app/assets/javascripts/can_extensions.js +45 -0
- data/app/assets/javascripts/kojac.js +1230 -0
- data/app/assets/javascripts/kojac_canjs.js +191 -0
- data/app/assets/javascripts/kojac_ember.js +463 -0
- data/app/controllers/kojac_controller.rb +70 -0
- data/app/serializers/default_kojac_serializer.rb +10 -0
- data/diagram.odg +0 -0
- data/kojac.gemspec +36 -0
- data/lib/kojac/app_serialize.rb +29 -0
- data/lib/kojac/kojac_rails.rb +432 -0
- data/lib/kojac/ring_strong_parameters.rb +195 -0
- data/lib/kojac/version.rb +3 -0
- data/lib/kojac.rb +8 -0
- data/lib/tasks/kojac_tasks.rake +4 -0
- data/notes.txt +48 -0
- data/spec/.DS_Store +0 -0
- data/spec/can_cache_spec.js +87 -0
- data/spec/can_factory_spec.js +144 -0
- data/spec/can_model_spec.js +127 -0
- data/spec/demo/README.rdoc +261 -0
- data/spec/demo/Rakefile +7 -0
- data/spec/demo/app/assets/javascripts/application.js +15 -0
- data/spec/demo/app/assets/stylesheets/application.css +13 -0
- data/spec/demo/app/controllers/application_controller.rb +3 -0
- data/spec/demo/app/helpers/application_helper.rb +2 -0
- data/spec/demo/app/mailers/.gitkeep +0 -0
- data/spec/demo/app/models/.gitkeep +0 -0
- data/spec/demo/app/views/layouts/application.html.erb +14 -0
- data/spec/demo/config/application.rb +65 -0
- data/spec/demo/config/boot.rb +10 -0
- data/spec/demo/config/database.yml +25 -0
- data/spec/demo/config/environment.rb +5 -0
- data/spec/demo/config/environments/development.rb +37 -0
- data/spec/demo/config/environments/production.rb +67 -0
- data/spec/demo/config/environments/test.rb +37 -0
- data/spec/demo/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/demo/config/initializers/inflections.rb +15 -0
- data/spec/demo/config/initializers/mime_types.rb +5 -0
- data/spec/demo/config/initializers/secret_token.rb +7 -0
- data/spec/demo/config/initializers/session_store.rb +8 -0
- data/spec/demo/config/initializers/wrap_parameters.rb +14 -0
- data/spec/demo/config/locales/en.yml +5 -0
- data/spec/demo/config/routes.rb +58 -0
- data/spec/demo/config.ru +4 -0
- data/spec/demo/lib/assets/.gitkeep +0 -0
- data/spec/demo/log/.gitkeep +0 -0
- data/spec/demo/public/404.html +26 -0
- data/spec/demo/public/422.html +26 -0
- data/spec/demo/public/500.html +25 -0
- data/spec/demo/public/favicon.ico +0 -0
- data/spec/demo/script/rails +6 -0
- data/spec/ember_factory_spec.js +157 -0
- data/spec/ember_model_spec.js +179 -0
- data/spec/external/.DS_Store +0 -0
- data/spec/external/ember/.DS_Store +0 -0
- data/spec/external/ember/ember-1.0.0-rc.6.js +30970 -0
- data/spec/external/ember/handlebars-1.0.0-rc.4.js +2239 -0
- data/spec/external/jasmine/MIT.LICENSE +20 -0
- data/spec/external/jasmine/jasmine-html.js +616 -0
- data/spec/external/jasmine/jasmine.css +81 -0
- data/spec/external/jasmine/jasmine.js +2529 -0
- data/spec/external/jasmine.async.js +51 -0
- data/spec/external/jquery/jquery-1.7.2.js +9404 -0
- data/spec/external/jquery/jquery-1.7.2.min.js +4 -0
- data/spec/external/jquery/jquery-1.9.1.js +9597 -0
- data/spec/external/json2.js +480 -0
- data/spec/external/steal/steal-121115.js +2747 -0
- data/spec/external/steal/steal-3.2.3.js +2098 -0
- data/spec/external/steal/steal-3.2.3.min.js +27 -0
- data/spec/external/steal/steal.js +2466 -0
- data/spec/external/steal/steal.min.js +32 -0
- data/spec/external/steal/stealconfig.js +19 -0
- data/spec/external/underscore.js +1223 -0
- data/spec/external/underscore_plus.js +261 -0
- data/spec/external.zip +0 -0
- data/spec/handler_stack_spec.js +143 -0
- data/spec/helpers/SpecHelper.js +10 -0
- data/spec/kojac_caching_spec.js +105 -0
- data/spec/kojac_mock_spec.js +230 -0
- data/spec/kojac_model_spec.js +126 -0
- data/spec/kojac_object_spec.js +171 -0
- data/spec/kojac_operations_spec.js +41 -0
- data/spec/mockjson/order_item.js +37 -0
- data/spec/mockjson/order_item__49.js +15 -0
- data/spec/mockjson/order_item__50.js +15 -0
- data/spec/mockjson/order_item__51.js +15 -0
- data/spec/mockjson/product.js +82 -0
- data/spec/mockjson/product__3.js +22 -0
- data/spec/model_ring_spec.rb +52 -0
- data/spec/operation_include_spec.js +77 -0
- data/spec/run.html +81 -0
- data/spec/spec.js +2 -0
- data/spec/support/jasmine.yml +86 -0
- metadata +380 -0
@@ -0,0 +1,157 @@
|
|
1
|
+
describe("Ember Factory", function() {
|
2
|
+
|
3
|
+
var OrderItem = Ember.Object.extend({});
|
4
|
+
// id: Int,
|
5
|
+
// customer_id: Int,
|
6
|
+
// product_id: Int
|
7
|
+
// });
|
8
|
+
|
9
|
+
var Product = Ember.Object.extend({
|
10
|
+
|
11
|
+
});
|
12
|
+
|
13
|
+
it("create Ember.Object from plain object", function() {
|
14
|
+
var factory = new Kojac.EmberObjectFactory();
|
15
|
+
factory.register([
|
16
|
+
[/^order_item(__|$)/,OrderItem],
|
17
|
+
[/^product(__|$)/,Product]
|
18
|
+
]);
|
19
|
+
var source = {
|
20
|
+
id: 51,
|
21
|
+
name: 'Fred',
|
22
|
+
width: 100,
|
23
|
+
enabled: true,
|
24
|
+
details: {
|
25
|
+
message: 'some message'
|
26
|
+
},
|
27
|
+
nothing: null
|
28
|
+
};
|
29
|
+
|
30
|
+
var emberObject = factory.emberObjectFactory(source,'order_item__51');
|
31
|
+
expect(emberObject).toBeDefined();
|
32
|
+
expect(emberObject.constructor).toBe(OrderItem);
|
33
|
+
expect(emberObject.id).toBe(source.id);
|
34
|
+
expect(emberObject.name).toBe(source.name);
|
35
|
+
expect(emberObject.enabled).toBe(source.enabled);
|
36
|
+
expect(emberObject.details).toBe(source.details);
|
37
|
+
expect(emberObject.nothing).toBe(source.nothing);
|
38
|
+
expect(emberObject.get('id')).toBe(source.id);
|
39
|
+
expect(emberObject.get('name')).toBe(source.name);
|
40
|
+
expect(emberObject.get('enabled')).toBe(source.enabled);
|
41
|
+
expect(emberObject.get('details')).toBe(source.details);
|
42
|
+
expect(emberObject.get('nothing')).toBe(source.nothing);
|
43
|
+
});
|
44
|
+
|
45
|
+
it("create Ember.Objects from plain objects", function() {
|
46
|
+
var factory = new Kojac.EmberObjectFactory();
|
47
|
+
factory.register([
|
48
|
+
[/^order_item(__|$)/,OrderItem],
|
49
|
+
[/^product(__|$)/,Product]
|
50
|
+
]);
|
51
|
+
var source = [
|
52
|
+
{
|
53
|
+
id: 51,
|
54
|
+
name: 'Fred',
|
55
|
+
width: 100,
|
56
|
+
enabled: true,
|
57
|
+
details: {
|
58
|
+
message: 'some message'
|
59
|
+
},
|
60
|
+
nothing: null
|
61
|
+
},
|
62
|
+
{
|
63
|
+
id: 52,
|
64
|
+
name: 'John',
|
65
|
+
width: 102,
|
66
|
+
enabled: false,
|
67
|
+
details: {
|
68
|
+
message: 'another message'
|
69
|
+
},
|
70
|
+
nothing: null
|
71
|
+
}
|
72
|
+
];
|
73
|
+
|
74
|
+
var emberObjects = factory.emberObjectFactoryArray(source,'order_item');
|
75
|
+
var emberObject = emberObjects[0];
|
76
|
+
expect(emberObject).toBeDefined();
|
77
|
+
expect(emberObject.constructor).toBe(OrderItem);
|
78
|
+
expect(emberObject.id).toBe(source[0].id);
|
79
|
+
expect(emberObject.name).toBe(source[0].name);
|
80
|
+
expect(emberObject.enabled).toBe(source[0].enabled);
|
81
|
+
expect(emberObject.details).toBe(source[0].details);
|
82
|
+
expect(emberObject.nothing).toBe(source[0].nothing);
|
83
|
+
emberObject = emberObjects[1];
|
84
|
+
expect(emberObject).toBeDefined();
|
85
|
+
expect(emberObject.constructor).toBe(OrderItem);
|
86
|
+
expect(emberObject.id).toBe(source[1].id);
|
87
|
+
expect(emberObject.name).toBe(source[1].name);
|
88
|
+
expect(emberObject.enabled).toBe(source[1].enabled);
|
89
|
+
expect(emberObject.details).toBe(source[1].details);
|
90
|
+
expect(emberObject.nothing).toBe(source[1].nothing);
|
91
|
+
});
|
92
|
+
|
93
|
+
// TYPE declare null declare default null value
|
94
|
+
// string: String 'hello' null
|
95
|
+
// int: Int 1 null or NaN ?
|
96
|
+
// float: Number 0.9 null or NaN ?
|
97
|
+
// boolean: Boolean true null
|
98
|
+
// object: Object {blah: 67} null
|
99
|
+
//
|
100
|
+
// Perhaps return null in all cases
|
101
|
+
var exampleDefA = {
|
102
|
+
astring: String,
|
103
|
+
anumber: Number,
|
104
|
+
aboolean: Boolean,
|
105
|
+
aint: Int,
|
106
|
+
aobject: Object,
|
107
|
+
__allowDynamic: false
|
108
|
+
};
|
109
|
+
|
110
|
+
var exampleSourceA = {
|
111
|
+
astring: 'hello',
|
112
|
+
anumber: 1,
|
113
|
+
aboolean: true,
|
114
|
+
aint: 3,
|
115
|
+
aobject: {name: 'Fred'}
|
116
|
+
};
|
117
|
+
|
118
|
+
it("Try defining properties with classes and then readTypedProperties without conversion required", function() {
|
119
|
+
expect(exampleDefA.astring===String);
|
120
|
+
expect(exampleDefA.anumber===Number);
|
121
|
+
expect(exampleDefA.aboolean===Boolean);
|
122
|
+
expect(exampleDefA.aint===Int);
|
123
|
+
expect(exampleDefA.aobject===Object);
|
124
|
+
|
125
|
+
expect(exampleDefA.aobject!==Int);
|
126
|
+
expect(exampleDefA.aobject!==String);
|
127
|
+
expect(exampleDefA.aobject!==Number);
|
128
|
+
|
129
|
+
expect(exampleDefA.aint!==String);
|
130
|
+
expect(exampleDefA.aint!==Object);
|
131
|
+
|
132
|
+
var obj = {};
|
133
|
+
obj = Kojac.readTypedProperties(obj,exampleSourceA,exampleDefA);
|
134
|
+
expect(obj).toEqual(exampleSourceA);
|
135
|
+
});
|
136
|
+
|
137
|
+
var exampleSourceB = {
|
138
|
+
astring: 111,
|
139
|
+
anumber: "123",
|
140
|
+
aboolean: 1,
|
141
|
+
aint: 5.6,
|
142
|
+
aobject: [2,3,4]
|
143
|
+
};
|
144
|
+
|
145
|
+
it("Try readTypedProperties needing conversion", function() {
|
146
|
+
var obj = Kojac.readTypedProperties({},exampleSourceB,exampleDefA);
|
147
|
+
expect(obj).toEqual({
|
148
|
+
astring: "111",
|
149
|
+
anumber: 123.0,
|
150
|
+
aboolean: true,
|
151
|
+
aint: 6,
|
152
|
+
aobject: null
|
153
|
+
});
|
154
|
+
});
|
155
|
+
|
156
|
+
});
|
157
|
+
|
@@ -0,0 +1,179 @@
|
|
1
|
+
describe("Kojac Ember Model", function() {
|
2
|
+
|
3
|
+
var product1Values = {
|
4
|
+
name: String,
|
5
|
+
purchases: Int,
|
6
|
+
weight: Number,
|
7
|
+
isMember: Boolean
|
8
|
+
};
|
9
|
+
var Product1 = Kojac.EmberModel.extend(product1Values);
|
10
|
+
|
11
|
+
var product2Values = {
|
12
|
+
name: 'John',
|
13
|
+
purchases: 56,
|
14
|
+
weight: 12.3,
|
15
|
+
isMember: true
|
16
|
+
}
|
17
|
+
var Product2 = Kojac.EmberModel.extend(product2Values);
|
18
|
+
|
19
|
+
var wrongProductValues = {
|
20
|
+
name: 123,
|
21
|
+
purchases: 2.34,
|
22
|
+
weight: [],
|
23
|
+
isMember: 1
|
24
|
+
};
|
25
|
+
|
26
|
+
it("extend and check null values", function() {
|
27
|
+
var product = Product1.create();
|
28
|
+
expect(product.name).toBeNull();
|
29
|
+
expect(product.purchases).toBeNull();
|
30
|
+
expect(product.weight).toBeNull();
|
31
|
+
expect(product.isMember).toBeNull();
|
32
|
+
expect(Product1.getDefinitions()).toEqual(product1Values);
|
33
|
+
});
|
34
|
+
|
35
|
+
it("extend and check non-null values", function() {
|
36
|
+
var product = Product2.create();
|
37
|
+
expect(product.name).toBe(product2Values.name);
|
38
|
+
expect(product.purchases).toBe(product2Values.purchases);
|
39
|
+
expect(product.weight).toBe(product2Values.weight);
|
40
|
+
expect(product.isMember).toBe(product2Values.isMember);
|
41
|
+
expect(product.get('name')).toBe(product2Values.name);
|
42
|
+
expect(product.get('purchases')).toBe(product2Values.purchases);
|
43
|
+
expect(product.get('weight')).toBe(product2Values.weight);
|
44
|
+
expect(product.get('isMember')).toBe(product2Values.isMember);
|
45
|
+
expect(Product2.getDefinitions()).toEqual({
|
46
|
+
name: String,
|
47
|
+
purchases: Int,
|
48
|
+
weight: Number,
|
49
|
+
isMember: Boolean
|
50
|
+
});
|
51
|
+
});
|
52
|
+
|
53
|
+
it("Ember.Object extend and create", function() {
|
54
|
+
var product3def = {
|
55
|
+
name: 'Fred',
|
56
|
+
shape: 'circle'
|
57
|
+
};
|
58
|
+
var Product3 = Kojac.EmberModel.extend(product3def);
|
59
|
+
var product3 = Product3.create();
|
60
|
+
expect(product3.get('name')).toEqual('Fred');
|
61
|
+
expect(product3.get('shape')).toEqual('circle');
|
62
|
+
|
63
|
+
var product3 = Product3.create();
|
64
|
+
expect(product3.get('name')).toEqual(product3def.name);
|
65
|
+
var product3 = Product3.create({});
|
66
|
+
expect(product3.get('name')).toEqual(product3def.name);
|
67
|
+
var product3 = Product3.create({name: 'John', colour: 'red'});
|
68
|
+
expect(product3.get('name')).toEqual('John');
|
69
|
+
expect(product3.get('shape')).toEqual('circle');
|
70
|
+
expect(product3.get('colour')).toEqual('red');
|
71
|
+
});
|
72
|
+
|
73
|
+
it("check create values", function() {
|
74
|
+
var product = Product1.create(product2Values);
|
75
|
+
expect(product.get('name')).toBe(product2Values.name);
|
76
|
+
expect(product.get('purchases')).toBe(product2Values.purchases);
|
77
|
+
expect(product.get('weight')).toBe(product2Values.weight);
|
78
|
+
expect(product.get('isMember')).toBe(product2Values.isMember);
|
79
|
+
});
|
80
|
+
|
81
|
+
it("check create values requiring conversion", function() {
|
82
|
+
var product = Product1.create(wrongProductValues);
|
83
|
+
expect(product.get('name')).toBe('123');
|
84
|
+
expect(product.get('purchases')).toBe(2);
|
85
|
+
expect(product.get('weight')).toBe(null);
|
86
|
+
expect(product.get('isMember')).toBe(true);
|
87
|
+
});
|
88
|
+
|
89
|
+
it("check set values requiring conversion", function() {
|
90
|
+
var product = Product1.create();
|
91
|
+
for (p in wrongProductValues)
|
92
|
+
product.set(p,wrongProductValues[p]);
|
93
|
+
//person.setProperties(wrongProductValues);
|
94
|
+
expect(product.name).toBe('123');
|
95
|
+
expect(product.purchases).toBe(2);
|
96
|
+
expect(product.weight).toBe(null);
|
97
|
+
expect(product.isMember).toBe(true);
|
98
|
+
});
|
99
|
+
|
100
|
+
it("check setProperties values requiring conversion", function() {
|
101
|
+
var product = Product1.create();
|
102
|
+
product.setProperties(wrongProductValues);
|
103
|
+
expect(product.name).toBe('123');
|
104
|
+
expect(product.purchases).toBe(2);
|
105
|
+
expect(product.weight).toBe(null);
|
106
|
+
expect(product.isMember).toBe(true);
|
107
|
+
});
|
108
|
+
|
109
|
+
it("check init", function() {
|
110
|
+
var initValues = {
|
111
|
+
name: 'Jeffery',
|
112
|
+
purchases: 5,
|
113
|
+
weight: 2.4,
|
114
|
+
isMember: true
|
115
|
+
};
|
116
|
+
var productValuesWithInit = {
|
117
|
+
name: 'XXX',
|
118
|
+
purchases: 3,
|
119
|
+
weight: 1.2,
|
120
|
+
isMember: false,
|
121
|
+
init: function() {
|
122
|
+
this._super();
|
123
|
+
for (p in initValues) {
|
124
|
+
if (p=='weight')
|
125
|
+
continue;
|
126
|
+
this[p] = initValues[p];
|
127
|
+
}
|
128
|
+
}
|
129
|
+
};
|
130
|
+
var Product3 = Kojac.EmberModel.extend(productValuesWithInit);
|
131
|
+
var product = Product3.create();
|
132
|
+
expect(product.name).toBe(initValues.name);
|
133
|
+
expect(product.purchases).toBe(initValues.purchases);
|
134
|
+
expect(product.isMember).toBe(initValues.isMember);
|
135
|
+
expect(product.weight).toBe(productValuesWithInit.weight);
|
136
|
+
});
|
137
|
+
|
138
|
+
it("check computed property", function() {
|
139
|
+
var initValues = {
|
140
|
+
first_name: 'Jeffery',
|
141
|
+
last_name: 'Watt',
|
142
|
+
full_name: function() {
|
143
|
+
return this.first_name+' '+this.last_name;
|
144
|
+
}.property()
|
145
|
+
};
|
146
|
+
var Cust = Ember.Object.extend(initValues);
|
147
|
+
var cust = Cust.create();
|
148
|
+
expect(cust.first_name).toBe(initValues.first_name);
|
149
|
+
expect(cust.last_name).toBe(initValues.last_name);
|
150
|
+
expect(cust.get('full_name')).toBe(initValues.first_name+' '+initValues.last_name);
|
151
|
+
});
|
152
|
+
|
153
|
+
it("real world example", function() {
|
154
|
+
var App = {};
|
155
|
+
App.FinanceProvider = Kojac.EmberModel.extend({
|
156
|
+
id: Int,
|
157
|
+
name: String
|
158
|
+
});
|
159
|
+
App.FinanceProviders = [
|
160
|
+
App.FinanceProvider.create({
|
161
|
+
id: 1,
|
162
|
+
name: 'GE Automotive'
|
163
|
+
}),
|
164
|
+
App.FinanceProvider.create({
|
165
|
+
id: 2,
|
166
|
+
name: 'St George Bank'
|
167
|
+
}),
|
168
|
+
App.FinanceProvider.create({
|
169
|
+
id: 3,
|
170
|
+
name: 'Esanda ANZ'
|
171
|
+
})
|
172
|
+
];
|
173
|
+
expect(App.FinanceProviders[0].get('id')).toEqual(1);
|
174
|
+
expect(App.FinanceProviders[0].get('name')).toEqual('GE Automotive');
|
175
|
+
expect(App.FinanceProviders[1].get('id')).toEqual(2);
|
176
|
+
expect(App.FinanceProviders[1].get('name')).toEqual('St George Bank');
|
177
|
+
});
|
178
|
+
|
179
|
+
});
|
Binary file
|
Binary file
|