acts_as_dashboard 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +54 -0
  5. data/Rakefile +23 -0
  6. data/VERSION +1 -0
  7. data/acts_as_dashboard.gemspec +166 -0
  8. data/generators/dashboard/USAGE +23 -0
  9. data/generators/dashboard/dashboard_generator.rb +105 -0
  10. data/generators/dashboard/templates/controller.erb +39 -0
  11. data/generators/dashboard/templates/dashboard.css +66 -0
  12. data/generators/dashboard/templates/dashboard.js +305 -0
  13. data/generators/dashboard/templates/jqplot-0.9.7/jquery.jqplot.min.js +14 -0
  14. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.barRenderer.js +404 -0
  15. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.barRenderer.min.js +14 -0
  16. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisLabelRenderer.js +200 -0
  17. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisLabelRenderer.min.js +14 -0
  18. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisTickRenderer.js +232 -0
  19. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisTickRenderer.min.js +14 -0
  20. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasTextRenderer.js +408 -0
  21. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasTextRenderer.min.js +14 -0
  22. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.categoryAxisRenderer.js +238 -0
  23. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.categoryAxisRenderer.min.js +14 -0
  24. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.cursor.js +812 -0
  25. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.cursor.min.js +14 -0
  26. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dateAxisRenderer.js +313 -0
  27. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dateAxisRenderer.min.js +14 -0
  28. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dragable.js +203 -0
  29. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dragable.min.js +14 -0
  30. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.highlighter.js +359 -0
  31. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.highlighter.min.js +14 -0
  32. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.logAxisRenderer.js +434 -0
  33. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.logAxisRenderer.min.js +14 -0
  34. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoAxisRenderer.js +595 -0
  35. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoAxisRenderer.min.js +14 -0
  36. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoRenderer.js +308 -0
  37. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoRenderer.min.js +14 -0
  38. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.ohlcRenderer.js +343 -0
  39. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.ohlcRenderer.min.js +14 -0
  40. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pieRenderer.js +333 -0
  41. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pieRenderer.min.js +14 -0
  42. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.js +307 -0
  43. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.js.orig +273 -0
  44. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.min.js +14 -0
  45. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.trendline.js +208 -0
  46. data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.trendline.min.js +14 -0
  47. data/generators/dashboard/templates/jquery.jqplot.min.css +1 -0
  48. data/generators/dashboard/templates/js.class-2.1.4/CHANGELOG +269 -0
  49. data/generators/dashboard/templates/js.class-2.1.4/MIT-LICENSE +30 -0
  50. data/generators/dashboard/templates/js.class-2.1.4/README +30 -0
  51. data/generators/dashboard/templates/js.class-2.1.4/min/command.js +1 -0
  52. data/generators/dashboard/templates/js.class-2.1.4/min/comparable.js +1 -0
  53. data/generators/dashboard/templates/js.class-2.1.4/min/constant_scope.js +1 -0
  54. data/generators/dashboard/templates/js.class-2.1.4/min/core.js +1 -0
  55. data/generators/dashboard/templates/js.class-2.1.4/min/decorator.js +1 -0
  56. data/generators/dashboard/templates/js.class-2.1.4/min/enumerable.js +1 -0
  57. data/generators/dashboard/templates/js.class-2.1.4/min/forwardable.js +1 -0
  58. data/generators/dashboard/templates/js.class-2.1.4/min/hash.js +1 -0
  59. data/generators/dashboard/templates/js.class-2.1.4/min/linked_list.js +1 -0
  60. data/generators/dashboard/templates/js.class-2.1.4/min/loader.js +1 -0
  61. data/generators/dashboard/templates/js.class-2.1.4/min/method_chain.js +1 -0
  62. data/generators/dashboard/templates/js.class-2.1.4/min/observable.js +1 -0
  63. data/generators/dashboard/templates/js.class-2.1.4/min/package.js +1 -0
  64. data/generators/dashboard/templates/js.class-2.1.4/min/proxy.js +1 -0
  65. data/generators/dashboard/templates/js.class-2.1.4/min/ruby.js +1 -0
  66. data/generators/dashboard/templates/js.class-2.1.4/min/set.js +1 -0
  67. data/generators/dashboard/templates/js.class-2.1.4/min/stack_trace.js +1 -0
  68. data/generators/dashboard/templates/js.class-2.1.4/min/state.js +1 -0
  69. data/generators/dashboard/templates/js.class-2.1.4/min/stdlib.js +16 -0
  70. data/generators/dashboard/templates/js.class-2.1.4/src/command.js +93 -0
  71. data/generators/dashboard/templates/js.class-2.1.4/src/comparable.js +37 -0
  72. data/generators/dashboard/templates/js.class-2.1.4/src/constant_scope.js +48 -0
  73. data/generators/dashboard/templates/js.class-2.1.4/src/core.js +1060 -0
  74. data/generators/dashboard/templates/js.class-2.1.4/src/decorator.js +50 -0
  75. data/generators/dashboard/templates/js.class-2.1.4/src/enumerable.js +505 -0
  76. data/generators/dashboard/templates/js.class-2.1.4/src/forwardable.js +22 -0
  77. data/generators/dashboard/templates/js.class-2.1.4/src/hash.js +334 -0
  78. data/generators/dashboard/templates/js.class-2.1.4/src/linked_list.js +114 -0
  79. data/generators/dashboard/templates/js.class-2.1.4/src/loader.js +458 -0
  80. data/generators/dashboard/templates/js.class-2.1.4/src/method_chain.js +172 -0
  81. data/generators/dashboard/templates/js.class-2.1.4/src/observable.js +55 -0
  82. data/generators/dashboard/templates/js.class-2.1.4/src/package.js +377 -0
  83. data/generators/dashboard/templates/js.class-2.1.4/src/proxy.js +58 -0
  84. data/generators/dashboard/templates/js.class-2.1.4/src/ruby.js +44 -0
  85. data/generators/dashboard/templates/js.class-2.1.4/src/set.js +332 -0
  86. data/generators/dashboard/templates/js.class-2.1.4/src/stack_trace.js +151 -0
  87. data/generators/dashboard/templates/js.class-2.1.4/src/state.js +95 -0
  88. data/generators/dashboard/templates/js.class-2.1.4/src/stdlib.js +2517 -0
  89. data/generators/dashboard/templates/show.html.erb +67 -0
  90. data/lib/acts_as_dashboard/app/views/dashboards/show.html.erb +67 -0
  91. data/lib/acts_as_dashboard/class_methods.rb +58 -0
  92. data/lib/acts_as_dashboard/config.rb +25 -0
  93. data/lib/acts_as_dashboard/instance_methods.rb +32 -0
  94. data/lib/acts_as_dashboard/line_graph_widget.rb +68 -0
  95. data/lib/acts_as_dashboard/public/javascripts/dashboard.js +305 -0
  96. data/lib/acts_as_dashboard/public/stylesheets/dashboard.css +66 -0
  97. data/lib/acts_as_dashboard/short_messages_widget.rb +25 -0
  98. data/lib/acts_as_dashboard/widget.rb +55 -0
  99. data/lib/acts_as_dashboard.rb +17 -0
  100. data/spec/acts_as_dashboard/class_method_specs.rb +188 -0
  101. data/spec/acts_as_dashboard/config_spec.rb +57 -0
  102. data/spec/acts_as_dashboard/instance_methods_spec.rb +134 -0
  103. data/spec/acts_as_dashboard/line_graph_widget_spec.rb +165 -0
  104. data/spec/acts_as_dashboard/short_messages_widget_spec.rb +69 -0
  105. data/spec/acts_as_dashboard/widget_spec.rb +6 -0
  106. data/spec/acts_as_dashboard_spec.rb +15 -0
  107. data/spec/shared/widget_behaviours.rb +171 -0
  108. data/spec/spec.opts +1 -0
  109. data/spec/spec_helper.rb +10 -0
  110. data/tasks/install.rake +8 -0
  111. data/tasks/install_javascript.rake +7 -0
  112. data/tasks/install_stylesheets.rake +7 -0
  113. metadata +209 -0
@@ -0,0 +1,50 @@
1
+ JS.Decorator = new JS.Class('Decorator', {
2
+ initialize: function(decoree, methods) {
3
+ var decorator = new JS.Class(),
4
+ delegators = {},
5
+ method, func;
6
+
7
+ for (method in decoree.prototype) {
8
+ func = decoree.prototype[method];
9
+ if (JS.isFn(func) && func !== decoree) func = this.klass.delegate(method);
10
+ delegators[method] = func;
11
+ }
12
+
13
+ decorator.include(new JS.Module(delegators), false);
14
+ decorator.include(this.klass.InstanceMethods, false);
15
+ decorator.include(methods, true);
16
+ return decorator;
17
+ },
18
+
19
+ extend: {
20
+ delegate: function(name) {
21
+ return function() {
22
+ return this.component[name].apply(this.component, arguments);
23
+ };
24
+ },
25
+
26
+ InstanceMethods: new JS.Module({
27
+ initialize: function(component) {
28
+ this.component = component;
29
+ this.klass = this.constructor = component.klass;
30
+ var method, func;
31
+ for (method in component) {
32
+ if (this[method]) continue;
33
+ func = component[method];
34
+ if (JS.isFn(func)) func = JS.Decorator.delegate(method);
35
+ this[method] = func;
36
+ }
37
+ },
38
+
39
+ extend: function(source) {
40
+ this.component.extend(source);
41
+ var method, func;
42
+ for (method in source) {
43
+ func = source[method];
44
+ if (JS.isFn(func)) func = JS.Decorator.delegate(method);
45
+ this[method] = func;
46
+ }
47
+ }
48
+ })
49
+ }
50
+ });
@@ -0,0 +1,505 @@
1
+ JS.Enumerable = new JS.Module('Enumerable', {
2
+ extend: {
3
+ forEach: function(block, context) {
4
+ if (!block) return new JS.Enumerator(this, 'forEach');
5
+ for (var i = 0, n = this.length; i < n; i++) {
6
+ if (this[i] !== undefined)
7
+ block.call(context || null, this[i]);
8
+ }
9
+ return this;
10
+ },
11
+
12
+ isComparable: function(list) {
13
+ return list.all(function(item) { return JS.isFn(item.compareTo) });
14
+ },
15
+
16
+ areEqual: function(one, another) {
17
+ return one.equals
18
+ ? one.equals(another)
19
+ : (one === another);
20
+ },
21
+
22
+ Collection: new JS.Class({
23
+ initialize: function(array) {
24
+ this.length = 0;
25
+ var push = Array.prototype.push;
26
+ JS.Enumerable.forEach.call(array, function(item) {
27
+ push.call(this, item);
28
+ }, this);
29
+ }
30
+ })
31
+ },
32
+
33
+ all: function(block, context) {
34
+ block = JS.Enumerable.toFn(block);
35
+ var truth = true;
36
+ this.forEach(function(item) {
37
+ truth = truth && (block ? block.apply(context || null, arguments) : item);
38
+ });
39
+ return !!truth;
40
+ },
41
+
42
+ any: function(block, context) {
43
+ block = JS.Enumerable.toFn(block);
44
+ var truth = false;
45
+ this.forEach(function(item) {
46
+ truth = truth || (block ? block.apply(context || null, arguments) : item);
47
+ });
48
+ return !!truth;
49
+ },
50
+
51
+ count: function(block, context) {
52
+ if (JS.isFn(this.size)) return this.size();
53
+ var count = 0, object = block;
54
+
55
+ if (block && !JS.isFn(block))
56
+ block = function(x) { return JS.Enumerable.areEqual(x, object) };
57
+
58
+ this.forEach(function() {
59
+ if (!block || block.apply(context || null, arguments))
60
+ count += 1;
61
+ });
62
+ return count;
63
+ },
64
+
65
+ cycle: function(n, block, context) {
66
+ if (!block) return this.enumFor('cycle', n);
67
+ block = JS.Enumerable.toFn(block);
68
+ while (n--) this.forEach(block, context);
69
+ },
70
+
71
+ drop: function(n) {
72
+ var entries = [];
73
+ this.forEachWithIndex(function(item, i) {
74
+ if (i >= n) entries.push(item);
75
+ });
76
+ return entries;
77
+ },
78
+
79
+ dropWhile: function(block, context) {
80
+ if (!block) return this.enumFor('dropWhile');
81
+ block = JS.Enumerable.toFn(block);
82
+
83
+ var entries = [],
84
+ drop = true;
85
+
86
+ this.forEach(function(item) {
87
+ if (drop) drop = drop && block.apply(context || null, arguments);
88
+ if (!drop) entries.push(item);
89
+ });
90
+ return entries;
91
+ },
92
+
93
+ forEachCons: function(n, block, context) {
94
+ if (!block) return this.enumFor('forEachCons', n);
95
+ block = JS.Enumerable.toFn(block);
96
+
97
+ var entries = this.toArray(),
98
+ size = entries.length,
99
+ limit = size - n,
100
+ i;
101
+
102
+ for (i = 0; i <= limit; i++)
103
+ block.call(context || null, entries.slice(i, i+n));
104
+
105
+ return this;
106
+ },
107
+
108
+ forEachSlice: function(n, block, context) {
109
+ if (!block) return this.enumFor('forEachSlice', n);
110
+ block = JS.Enumerable.toFn(block);
111
+
112
+ var entries = this.toArray(),
113
+ size = entries.length,
114
+ m = Math.ceil(size/n),
115
+ i;
116
+
117
+ for (i = 0; i < m; i++)
118
+ block.call(context || null, entries.slice(i*n, (i+1)*n));
119
+
120
+ return this;
121
+ },
122
+
123
+ forEachWithIndex: function(offset, block, context) {
124
+ if (JS.isFn(offset)) {
125
+ context = block;
126
+ block = offset;
127
+ offset = 0;
128
+ }
129
+ offset = offset || 0;
130
+
131
+ if (!block) return this.enumFor('forEachWithIndex', offset);
132
+ block = JS.Enumerable.toFn(block);
133
+
134
+ return this.forEach(function(item) {
135
+ var result = block.call(context || null, item, offset);
136
+ offset += 1;
137
+ return result;
138
+ });
139
+ },
140
+
141
+ forEachWithObject: function(object, block, context) {
142
+ if (!block) return this.enumFor('forEachWithObject', object);
143
+ block = JS.Enumerable.toFn(block);
144
+
145
+ this.forEach(function() {
146
+ var args = [object].concat(JS.array(arguments));
147
+ block.apply(context || null, args);
148
+ });
149
+ return object;
150
+ },
151
+
152
+ find: function(block, context) {
153
+ if (!block) return this.enumFor('find');
154
+ block = JS.Enumerable.toFn(block);
155
+
156
+ var needle = {}, K = needle;
157
+ this.forEach(function(item) {
158
+ if (needle !== K) return;
159
+ needle = block.apply(context || null, arguments) ? item : needle;
160
+ });
161
+ return needle === K ? null : needle;
162
+ },
163
+
164
+ findIndex: function(needle, context) {
165
+ if (needle === undefined) return this.enumFor('findIndex');
166
+
167
+ var index = null,
168
+ block = JS.isFn(needle);
169
+
170
+ this.forEachWithIndex(function(item, i) {
171
+ if (index !== null) return;
172
+ if (JS.Enumerable.areEqual(needle, item) || (block && needle.apply(context || null, arguments)))
173
+ index = i;
174
+ });
175
+ return index;
176
+ },
177
+
178
+ first: function(n) {
179
+ var entries = this.toArray();
180
+ return (n === undefined) ? entries[0] : entries.slice(0,n);
181
+ },
182
+
183
+ grep: function(pattern, block, context) {
184
+ block = JS.Enumerable.toFn(block);
185
+ var results = [];
186
+ this.forEach(function(item) {
187
+ var match = JS.isFn(pattern.match) ? pattern.match(item) : pattern(item);
188
+ if (!match) return;
189
+ if (block) item = block.apply(context || null, arguments);
190
+ results.push(item);
191
+ });
192
+ return results;
193
+ },
194
+
195
+ groupBy: function(block, context) {
196
+ if (!block) return this.enumFor('groupBy');
197
+ block = JS.Enumerable.toFn(block);
198
+
199
+ var hash = new JS.Hash();
200
+ this.forEach(function(item) {
201
+ var value = block.apply(context || null, arguments);
202
+ if (!hash.hasKey(value)) hash.store(value, []);
203
+ hash.get(value).push(item);
204
+ });
205
+ return hash;
206
+ },
207
+
208
+ inject: function(memo, block, context) {
209
+ var args = JS.array(arguments),
210
+ counter = 0,
211
+ K = {};
212
+
213
+ switch (args.length) {
214
+ case 1: memo = K;
215
+ block = args[0];
216
+ break;
217
+
218
+ case 2: if (JS.isFn(memo)) {
219
+ memo = K;
220
+ block = args[0];
221
+ context = args[1];
222
+ }
223
+ }
224
+ block = JS.Enumerable.toFn(block);
225
+
226
+ this.forEach(function(item) {
227
+ if (!counter++ && memo === K) return memo = item;
228
+ var args = [memo].concat(JS.array(arguments));
229
+ memo = block.apply(context || null, args);
230
+ });
231
+ return memo;
232
+ },
233
+
234
+ map: function(block, context) {
235
+ if (!block) return this.enumFor('map');
236
+ block = JS.Enumerable.toFn(block);
237
+
238
+ var map = [];
239
+ this.forEach(function() {
240
+ map.push(block.apply(context || null, arguments));
241
+ });
242
+ return map;
243
+ },
244
+
245
+ max: function(block, context) {
246
+ return this.minmax(block, context)[1];
247
+ },
248
+
249
+ maxBy: function(block, context) {
250
+ if (!block) return this.enumFor('maxBy');
251
+ return this.minmaxBy(block, context)[1];
252
+ },
253
+
254
+ member: function(needle) {
255
+ return this.any(function(item) { return JS.Enumerable.areEqual(item, needle) });
256
+ },
257
+
258
+ min: function(block, context) {
259
+ return this.minmax(block, context)[0];
260
+ },
261
+
262
+ minBy: function(block, context) {
263
+ if (!block) return this.enumFor('minBy');
264
+ return this.minmaxBy(block, context)[0];
265
+ },
266
+
267
+ minmax: function(block, context) {
268
+ var list = this.sort(block, context);
269
+ return [list[0], list[list.length - 1]];
270
+ },
271
+
272
+ minmaxBy: function(block, context) {
273
+ if (!block) return this.enumFor('minmaxBy');
274
+ var list = this.sortBy(block, context);
275
+ return [list[0], list[list.length - 1]];
276
+ },
277
+
278
+ none: function(block, context) {
279
+ return !this.any(block, context);
280
+ },
281
+
282
+ one: function(block, context) {
283
+ block = JS.Enumerable.toFn(block);
284
+ var count = 0;
285
+ this.forEach(function(item) {
286
+ if (block ? block.apply(context || null, arguments) : item) count += 1;
287
+ });
288
+ return count === 1;
289
+ },
290
+
291
+ partition: function(block, context) {
292
+ if (!block) return this.enumFor('partition');
293
+ block = JS.Enumerable.toFn(block);
294
+
295
+ var ayes = [], noes = [];
296
+ this.forEach(function(item) {
297
+ (block.apply(context || null, arguments) ? ayes : noes).push(item);
298
+ });
299
+ return [ayes, noes];
300
+ },
301
+
302
+ reject: function(block, context) {
303
+ if (!block) return this.enumFor('reject');
304
+ block = JS.Enumerable.toFn(block);
305
+
306
+ var map = [];
307
+ this.forEach(function(item) {
308
+ if (!block.apply(context || null, arguments)) map.push(item);
309
+ });
310
+ return map;
311
+ },
312
+
313
+ reverseForEach: function(block, context) {
314
+ if (!block) return this.enumFor('reverseForEach');
315
+ block = JS.Enumerable.toFn(block);
316
+
317
+ var entries = this.toArray(),
318
+ n = entries.length;
319
+
320
+ while (n--) block.call(context || null, entries[n]);
321
+ return this;
322
+ },
323
+
324
+ select: function(block, context) {
325
+ if (!block) return this.enumFor('select');
326
+ block = JS.Enumerable.toFn(block);
327
+
328
+ var map = [];
329
+ this.forEach(function(item) {
330
+ if (block.apply(context || null, arguments)) map.push(item);
331
+ });
332
+ return map;
333
+ },
334
+
335
+ sort: function(block, context) {
336
+ var comparable = JS.Enumerable.isComparable(this),
337
+ entries = this.toArray();
338
+
339
+ block = block || (comparable
340
+ ? function(a,b) { return a.compareTo(b); }
341
+ : null);
342
+ return block
343
+ ? entries.sort(function(a,b) { return block.call(context || null, a, b); })
344
+ : entries.sort();
345
+ },
346
+
347
+ sortBy: function(block, context) {
348
+ if (!block) return this.enumFor('sortBy');
349
+ block = JS.Enumerable.toFn(block);
350
+
351
+ var util = JS.Enumerable,
352
+ map = new util.Collection(this.map(block, context)),
353
+ comparable = util.isComparable(map);
354
+
355
+ return new util.Collection(map.zip(this).sort(function(a, b) {
356
+ a = a[0]; b = b[0];
357
+ return comparable ? a.compareTo(b) : (a < b ? -1 : (a > b ? 1 : 0));
358
+ })).map(function(item) { return item[1]; });
359
+ },
360
+
361
+ take: function(n) {
362
+ var entries = [];
363
+ this.forEachWithIndex(function(item, i) {
364
+ if (i < n) entries.push(item);
365
+ });
366
+ return entries;
367
+ },
368
+
369
+ takeWhile: function(block, context) {
370
+ if (!block) return this.enumFor('takeWhile');
371
+ block = JS.Enumerable.toFn(block);
372
+
373
+ var entries = [],
374
+ take = true;
375
+ this.forEach(function(item) {
376
+ if (take) take = take && block.apply(context || null, arguments);
377
+ if (take) entries.push(item);
378
+ });
379
+ return entries;
380
+ },
381
+
382
+ toArray: function() {
383
+ return this.drop(0);
384
+ },
385
+
386
+ zip: function() {
387
+ var util = JS.Enumerable,
388
+ args = [],
389
+ counter = 0,
390
+ n = arguments.length,
391
+ block, context;
392
+
393
+ if (JS.isFn(arguments[n-1])) {
394
+ block = arguments[n-1]; context = {};
395
+ }
396
+ if (JS.isFn(arguments[n-2])) {
397
+ block = arguments[n-2]; context = arguments[n-1];
398
+ }
399
+ util.forEach.call(arguments, function(arg) {
400
+ if (arg === block || arg === context) return;
401
+ if (arg.toArray) arg = arg.toArray();
402
+ if (JS.isType(arg, Array)) args.push(arg);
403
+ });
404
+ var results = this.map(function(item) {
405
+ var zip = [item];
406
+ util.forEach.call(args, function(arg) {
407
+ zip.push(arg[counter] === undefined ? null : arg[counter]);
408
+ });
409
+ return ++counter && zip;
410
+ });
411
+ if (!block) return results;
412
+ util.forEach.call(results, block, context);
413
+ }
414
+ });
415
+
416
+ // http://developer.mozilla.org/en/docs/index.php?title=Core_JavaScript_1.5_Reference:Global_Objects:Array&oldid=58326
417
+ JS.Enumerable.include({
418
+ forEach: JS.Enumerable.forEach,
419
+ collect: JS.Enumerable.instanceMethod('map'),
420
+ detect: JS.Enumerable.instanceMethod('find'),
421
+ entries: JS.Enumerable.instanceMethod('toArray'),
422
+ every: JS.Enumerable.instanceMethod('all'),
423
+ findAll: JS.Enumerable.instanceMethod('select'),
424
+ filter: JS.Enumerable.instanceMethod('select'),
425
+ some: JS.Enumerable.instanceMethod('any'),
426
+
427
+ extend: {
428
+ toFn: function(object) {
429
+ if (!object) return object;
430
+ if (object.toFunction) return object.toFunction();
431
+ if (this.OPS[object]) return this.OPS[object];
432
+ if (JS.isType(object, 'string') || JS.isType(object, String))
433
+ return function() {
434
+ var args = JS.array(arguments),
435
+ target = args.shift(),
436
+ method = target[object];
437
+ return JS.isFn(method) ? method.apply(target, args) : method;
438
+ };
439
+ return object;
440
+ },
441
+
442
+ OPS: {
443
+ '+': function(a,b) { return a + b },
444
+ '-': function(a,b) { return a - b },
445
+ '*': function(a,b) { return a * b },
446
+ '/': function(a,b) { return a / b },
447
+ '%': function(a,b) { return a % b },
448
+ '^': function(a,b) { return a ^ b },
449
+ '&': function(a,b) { return a & b },
450
+ '&&': function(a,b) { return a && b },
451
+ '|': function(a,b) { return a | b },
452
+ '||': function(a,b) { return a || b },
453
+ '==': function(a,b) { return a == b },
454
+ '!=': function(a,b) { return a != b },
455
+ '>': function(a,b) { return a > b },
456
+ '>=': function(a,b) { return a >= b },
457
+ '<': function(a,b) { return a < b },
458
+ '<=': function(a,b) { return a <= b },
459
+ '===': function(a,b) { return a === b },
460
+ '!==': function(a,b) { return a !== b },
461
+ '[]': function(a,b) { return a[b] },
462
+ '()': function(a,b) { return a(b) }
463
+ },
464
+
465
+ Enumerator: new JS.Class({
466
+ include: JS.Enumerable,
467
+
468
+ extend: {
469
+ DEFAULT_METHOD: 'forEach'
470
+ },
471
+
472
+ initialize: function(object, method, args) {
473
+ this._object = object;
474
+ this._method = method || this.klass.DEFAULT_METHOD;
475
+ this._args = (args || []).slice();
476
+ },
477
+
478
+ forEach: function(block, context) {
479
+ if (!block) return this;
480
+ var args = this._args.slice();
481
+ args.push(block);
482
+ if (context) args.push(context);
483
+ return this._object[this._method].apply(this._object, args);
484
+ },
485
+
486
+ cons: JS.Enumerable.instanceMethod('forEachCons'),
487
+ reverse: JS.Enumerable.instanceMethod('reverseForEach'),
488
+ slice: JS.Enumerable.instanceMethod('forEachSlice'),
489
+ withIndex: JS.Enumerable.instanceMethod('forEachWithIndex'),
490
+ withObject: JS.Enumerable.instanceMethod('forEachWithObject')
491
+ })
492
+ }
493
+ }, false);
494
+
495
+ JS.Enumerable.Collection.include(JS.Enumerable, true);
496
+
497
+ JS.Kernel.include({
498
+ enumFor: function(method) {
499
+ var args = JS.array(arguments),
500
+ method = args.shift();
501
+ return new JS.Enumerable.Enumerator(this, method, args);
502
+ }
503
+ }, false);
504
+
505
+ JS.Kernel.define('toEnum', JS.Kernel.instanceMethod('enumFor'), true);
@@ -0,0 +1,22 @@
1
+ JS.Forwardable = new JS.Module('Forwardable', {
2
+ defineDelegator: function(subject, method, alias, resolve) {
3
+ alias = alias || method;
4
+ this.define(alias, function() {
5
+ var object = this[subject],
6
+ property = object[method];
7
+
8
+ return JS.isFn(property)
9
+ ? property.apply(object, arguments)
10
+ : property;
11
+ }, resolve !== false);
12
+ },
13
+
14
+ defineDelegators: function() {
15
+ var methods = JS.array(arguments),
16
+ subject = methods.shift(),
17
+ i = methods.length;
18
+
19
+ while (i--) this.defineDelegator(subject, methods[i], methods[i], false);
20
+ this.resolve();
21
+ }
22
+ });