kojac 0.9.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.
Files changed (101) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +7 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +158 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.md +69 -0
  7. data/Rakefile +27 -0
  8. data/app/assets/javascripts/can_extensions.js +45 -0
  9. data/app/assets/javascripts/kojac.js +1230 -0
  10. data/app/assets/javascripts/kojac_canjs.js +191 -0
  11. data/app/assets/javascripts/kojac_ember.js +463 -0
  12. data/app/controllers/kojac_controller.rb +70 -0
  13. data/app/serializers/default_kojac_serializer.rb +10 -0
  14. data/diagram.odg +0 -0
  15. data/kojac.gemspec +36 -0
  16. data/lib/kojac/app_serialize.rb +29 -0
  17. data/lib/kojac/kojac_rails.rb +432 -0
  18. data/lib/kojac/ring_strong_parameters.rb +195 -0
  19. data/lib/kojac/version.rb +3 -0
  20. data/lib/kojac.rb +8 -0
  21. data/lib/tasks/kojac_tasks.rake +4 -0
  22. data/notes.txt +48 -0
  23. data/spec/.DS_Store +0 -0
  24. data/spec/can_cache_spec.js +87 -0
  25. data/spec/can_factory_spec.js +144 -0
  26. data/spec/can_model_spec.js +127 -0
  27. data/spec/demo/README.rdoc +261 -0
  28. data/spec/demo/Rakefile +7 -0
  29. data/spec/demo/app/assets/javascripts/application.js +15 -0
  30. data/spec/demo/app/assets/stylesheets/application.css +13 -0
  31. data/spec/demo/app/controllers/application_controller.rb +3 -0
  32. data/spec/demo/app/helpers/application_helper.rb +2 -0
  33. data/spec/demo/app/mailers/.gitkeep +0 -0
  34. data/spec/demo/app/models/.gitkeep +0 -0
  35. data/spec/demo/app/views/layouts/application.html.erb +14 -0
  36. data/spec/demo/config/application.rb +65 -0
  37. data/spec/demo/config/boot.rb +10 -0
  38. data/spec/demo/config/database.yml +25 -0
  39. data/spec/demo/config/environment.rb +5 -0
  40. data/spec/demo/config/environments/development.rb +37 -0
  41. data/spec/demo/config/environments/production.rb +67 -0
  42. data/spec/demo/config/environments/test.rb +37 -0
  43. data/spec/demo/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/demo/config/initializers/inflections.rb +15 -0
  45. data/spec/demo/config/initializers/mime_types.rb +5 -0
  46. data/spec/demo/config/initializers/secret_token.rb +7 -0
  47. data/spec/demo/config/initializers/session_store.rb +8 -0
  48. data/spec/demo/config/initializers/wrap_parameters.rb +14 -0
  49. data/spec/demo/config/locales/en.yml +5 -0
  50. data/spec/demo/config/routes.rb +58 -0
  51. data/spec/demo/config.ru +4 -0
  52. data/spec/demo/lib/assets/.gitkeep +0 -0
  53. data/spec/demo/log/.gitkeep +0 -0
  54. data/spec/demo/public/404.html +26 -0
  55. data/spec/demo/public/422.html +26 -0
  56. data/spec/demo/public/500.html +25 -0
  57. data/spec/demo/public/favicon.ico +0 -0
  58. data/spec/demo/script/rails +6 -0
  59. data/spec/ember_factory_spec.js +157 -0
  60. data/spec/ember_model_spec.js +179 -0
  61. data/spec/external/.DS_Store +0 -0
  62. data/spec/external/ember/.DS_Store +0 -0
  63. data/spec/external/ember/ember-1.0.0-rc.6.js +30970 -0
  64. data/spec/external/ember/handlebars-1.0.0-rc.4.js +2239 -0
  65. data/spec/external/jasmine/MIT.LICENSE +20 -0
  66. data/spec/external/jasmine/jasmine-html.js +616 -0
  67. data/spec/external/jasmine/jasmine.css +81 -0
  68. data/spec/external/jasmine/jasmine.js +2529 -0
  69. data/spec/external/jasmine.async.js +51 -0
  70. data/spec/external/jquery/jquery-1.7.2.js +9404 -0
  71. data/spec/external/jquery/jquery-1.7.2.min.js +4 -0
  72. data/spec/external/jquery/jquery-1.9.1.js +9597 -0
  73. data/spec/external/json2.js +480 -0
  74. data/spec/external/steal/steal-121115.js +2747 -0
  75. data/spec/external/steal/steal-3.2.3.js +2098 -0
  76. data/spec/external/steal/steal-3.2.3.min.js +27 -0
  77. data/spec/external/steal/steal.js +2466 -0
  78. data/spec/external/steal/steal.min.js +32 -0
  79. data/spec/external/steal/stealconfig.js +19 -0
  80. data/spec/external/underscore.js +1223 -0
  81. data/spec/external/underscore_plus.js +261 -0
  82. data/spec/external.zip +0 -0
  83. data/spec/handler_stack_spec.js +143 -0
  84. data/spec/helpers/SpecHelper.js +10 -0
  85. data/spec/kojac_caching_spec.js +105 -0
  86. data/spec/kojac_mock_spec.js +230 -0
  87. data/spec/kojac_model_spec.js +126 -0
  88. data/spec/kojac_object_spec.js +171 -0
  89. data/spec/kojac_operations_spec.js +41 -0
  90. data/spec/mockjson/order_item.js +37 -0
  91. data/spec/mockjson/order_item__49.js +15 -0
  92. data/spec/mockjson/order_item__50.js +15 -0
  93. data/spec/mockjson/order_item__51.js +15 -0
  94. data/spec/mockjson/product.js +82 -0
  95. data/spec/mockjson/product__3.js +22 -0
  96. data/spec/model_ring_spec.rb +52 -0
  97. data/spec/operation_include_spec.js +77 -0
  98. data/spec/run.html +81 -0
  99. data/spec/spec.js +2 -0
  100. data/spec/support/jasmine.yml +86 -0
  101. 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