acts_as_dashboard 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +54 -0
- data/Rakefile +23 -0
- data/VERSION +1 -0
- data/acts_as_dashboard.gemspec +166 -0
- data/generators/dashboard/USAGE +23 -0
- data/generators/dashboard/dashboard_generator.rb +105 -0
- data/generators/dashboard/templates/controller.erb +39 -0
- data/generators/dashboard/templates/dashboard.css +66 -0
- data/generators/dashboard/templates/dashboard.js +305 -0
- data/generators/dashboard/templates/jqplot-0.9.7/jquery.jqplot.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.barRenderer.js +404 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.barRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisLabelRenderer.js +200 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisLabelRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisTickRenderer.js +232 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasAxisTickRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasTextRenderer.js +408 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.canvasTextRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.categoryAxisRenderer.js +238 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.categoryAxisRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.cursor.js +812 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.cursor.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dateAxisRenderer.js +313 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dateAxisRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dragable.js +203 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.dragable.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.highlighter.js +359 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.highlighter.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.logAxisRenderer.js +434 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.logAxisRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoAxisRenderer.js +595 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoAxisRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoRenderer.js +308 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.mekkoRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.ohlcRenderer.js +343 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.ohlcRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pieRenderer.js +333 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pieRenderer.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.js +307 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.js.orig +273 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.pointLabels.min.js +14 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.trendline.js +208 -0
- data/generators/dashboard/templates/jqplot-0.9.7/plugins/jqplot.trendline.min.js +14 -0
- data/generators/dashboard/templates/jquery.jqplot.min.css +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/CHANGELOG +269 -0
- data/generators/dashboard/templates/js.class-2.1.4/MIT-LICENSE +30 -0
- data/generators/dashboard/templates/js.class-2.1.4/README +30 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/command.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/comparable.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/constant_scope.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/core.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/decorator.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/enumerable.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/forwardable.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/hash.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/linked_list.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/loader.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/method_chain.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/observable.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/package.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/proxy.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/ruby.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/set.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/stack_trace.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/state.js +1 -0
- data/generators/dashboard/templates/js.class-2.1.4/min/stdlib.js +16 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/command.js +93 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/comparable.js +37 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/constant_scope.js +48 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/core.js +1060 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/decorator.js +50 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/enumerable.js +505 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/forwardable.js +22 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/hash.js +334 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/linked_list.js +114 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/loader.js +458 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/method_chain.js +172 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/observable.js +55 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/package.js +377 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/proxy.js +58 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/ruby.js +44 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/set.js +332 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/stack_trace.js +151 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/state.js +95 -0
- data/generators/dashboard/templates/js.class-2.1.4/src/stdlib.js +2517 -0
- data/generators/dashboard/templates/show.html.erb +67 -0
- data/lib/acts_as_dashboard/app/views/dashboards/show.html.erb +67 -0
- data/lib/acts_as_dashboard/class_methods.rb +58 -0
- data/lib/acts_as_dashboard/config.rb +25 -0
- data/lib/acts_as_dashboard/instance_methods.rb +32 -0
- data/lib/acts_as_dashboard/line_graph_widget.rb +68 -0
- data/lib/acts_as_dashboard/public/javascripts/dashboard.js +305 -0
- data/lib/acts_as_dashboard/public/stylesheets/dashboard.css +66 -0
- data/lib/acts_as_dashboard/short_messages_widget.rb +25 -0
- data/lib/acts_as_dashboard/widget.rb +55 -0
- data/lib/acts_as_dashboard.rb +17 -0
- data/spec/acts_as_dashboard/class_method_specs.rb +188 -0
- data/spec/acts_as_dashboard/config_spec.rb +57 -0
- data/spec/acts_as_dashboard/instance_methods_spec.rb +134 -0
- data/spec/acts_as_dashboard/line_graph_widget_spec.rb +165 -0
- data/spec/acts_as_dashboard/short_messages_widget_spec.rb +69 -0
- data/spec/acts_as_dashboard/widget_spec.rb +6 -0
- data/spec/acts_as_dashboard_spec.rb +15 -0
- data/spec/shared/widget_behaviours.rb +171 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- data/tasks/install.rake +8 -0
- data/tasks/install_javascript.rake +7 -0
- data/tasks/install_stylesheets.rake +7 -0
- 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
|
+
});
|