jelly 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/MIT-LICENSE +21 -0
- data/README.markdown +112 -0
- data/Rakefile +39 -0
- data/VERSION +1 -0
- data/VERSION.yml +4 -0
- data/generators/jelly/USAGE +11 -0
- data/generators/jelly/jelly_generator.rb +12 -0
- data/generators/jelly/templates/javascripts/ajax_with_jelly.js +32 -0
- data/generators/jelly/templates/javascripts/jelly.js +81 -0
- data/generators/jelly/templates/javascripts/jquery/jquery-1.3.2.js +4376 -0
- data/generators/jelly/templates/javascripts/jquery/jquery.protify-0.3.js +345 -0
- data/install.rb +1 -0
- data/jelly.gemspec +77 -0
- data/lib/jelly.rb +16 -0
- data/lib/jelly/jelly_controller.rb +23 -0
- data/lib/jelly/jelly_helper.rb +42 -0
- data/spec/controllers/jelly_controller_spec.rb +118 -0
- data/spec/helpers/jelly_helper_spec.rb +54 -0
- data/spec/rails_root/app/controllers/application_controller.rb +10 -0
- data/spec/rails_root/app/helpers/application_helper.rb +3 -0
- data/spec/rails_root/config/boot.rb +110 -0
- data/spec/rails_root/config/environment.rb +41 -0
- data/spec/rails_root/config/environments/development.rb +17 -0
- data/spec/rails_root/config/environments/production.rb +28 -0
- data/spec/rails_root/config/environments/test.rb +28 -0
- data/spec/rails_root/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_root/config/initializers/inflections.rb +10 -0
- data/spec/rails_root/config/initializers/mime_types.rb +5 -0
- data/spec/rails_root/config/initializers/new_rails_defaults.rb +19 -0
- data/spec/rails_root/config/initializers/session_store.rb +15 -0
- data/spec/rails_root/config/routes.rb +43 -0
- data/spec/rails_root/test/performance/browsing_test.rb +9 -0
- data/spec/rails_root/test/test_helper.rb +38 -0
- data/spec/spec_helper.rb +22 -0
- data/tasks/jelly_tasks.rake +4 -0
- data/uninstall.rb +1 -0
- metadata +99 -0
@@ -0,0 +1,345 @@
|
|
1
|
+
/**
|
2
|
+
* Protify jQuery Plugin
|
3
|
+
* version 0.3
|
4
|
+
*
|
5
|
+
* Copyright (c) 2009 Josh Powell
|
6
|
+
* Licensed under the MIT license.
|
7
|
+
*
|
8
|
+
* * Date: 2009-02-04 11:45:50 (Wed, 04 Feb 2009)
|
9
|
+
*
|
10
|
+
*/
|
11
|
+
(function ($) {
|
12
|
+
var $break = { };
|
13
|
+
var arrayFunc = {
|
14
|
+
_each: function(iterator) {
|
15
|
+
for (var i = 0, length = this.length; i < length; i++) {
|
16
|
+
iterator(this[i]);
|
17
|
+
}
|
18
|
+
},
|
19
|
+
|
20
|
+
all: function(iterator, context) {
|
21
|
+
iterator = iterator || function(x) { return x; };
|
22
|
+
var result = true;
|
23
|
+
this.each(function(value, index) {
|
24
|
+
result = result && !!iterator.call(context, value, index);
|
25
|
+
if (!result) { throw $break; }
|
26
|
+
});
|
27
|
+
return result;
|
28
|
+
},
|
29
|
+
|
30
|
+
any: function(iterator, context) {
|
31
|
+
iterator = iterator || function(x) { return x; };
|
32
|
+
var result = false;
|
33
|
+
this.each(function(value, index) {
|
34
|
+
if (result = !!iterator.call(context, value, index)) {
|
35
|
+
throw $break;
|
36
|
+
}
|
37
|
+
});
|
38
|
+
return result;
|
39
|
+
},
|
40
|
+
|
41
|
+
clear: function() {
|
42
|
+
this.length = 0;
|
43
|
+
return this;
|
44
|
+
},
|
45
|
+
|
46
|
+
clone: function() {
|
47
|
+
return $.protify([].concat(this));
|
48
|
+
},
|
49
|
+
|
50
|
+
collect: function(iterator, context) {
|
51
|
+
iterator = iterator || function(x) { return x; };
|
52
|
+
var results = $.protify([]);
|
53
|
+
this.each(function(value, index) {
|
54
|
+
results.push(iterator.call(context, value, index));
|
55
|
+
});
|
56
|
+
return results;
|
57
|
+
},
|
58
|
+
|
59
|
+
detect: function(iterator, context) {
|
60
|
+
var result;
|
61
|
+
this.each(function(value, index) {
|
62
|
+
if (iterator.call(context, value, index)) {
|
63
|
+
result = value;
|
64
|
+
throw $break;
|
65
|
+
}
|
66
|
+
});
|
67
|
+
return result;
|
68
|
+
},
|
69
|
+
|
70
|
+
compact: function() {
|
71
|
+
return $.protify(this.select(function(value) {
|
72
|
+
return value !== null;
|
73
|
+
}));
|
74
|
+
},
|
75
|
+
|
76
|
+
each: function(iterator, context) {
|
77
|
+
context = context || this;
|
78
|
+
var index = 0;
|
79
|
+
try {
|
80
|
+
this._each(function(value) {
|
81
|
+
iterator.call(context, value, index++);
|
82
|
+
});
|
83
|
+
} catch (e) {
|
84
|
+
if (e != $break) { throw e; }
|
85
|
+
}
|
86
|
+
return this;
|
87
|
+
},
|
88
|
+
|
89
|
+
eachSlice: function(number, iterator, context) {
|
90
|
+
var index = -number, slices = [], array = this.toArray();
|
91
|
+
if (number < 1) { return array; }
|
92
|
+
while ((index += number) < array.length) {
|
93
|
+
slices.push(array.slice(index, index+number));
|
94
|
+
}
|
95
|
+
return $.protify($.protify(slices).collect(iterator, context));
|
96
|
+
},
|
97
|
+
|
98
|
+
extended : function() {
|
99
|
+
return true;
|
100
|
+
},
|
101
|
+
|
102
|
+
findAll: function(iterator, context) {
|
103
|
+
var results = $.protify([]);
|
104
|
+
this.each(function(value, index) {
|
105
|
+
if (iterator.call(context, value, index)) {
|
106
|
+
results.push(value);
|
107
|
+
}
|
108
|
+
});
|
109
|
+
return results;
|
110
|
+
},
|
111
|
+
|
112
|
+
flatten: function() {
|
113
|
+
return this.inject([], function(array, value) {
|
114
|
+
$.protify(value);
|
115
|
+
return $.protify(array.concat($.isArray(value) ?
|
116
|
+
value.flatten() : [value]));
|
117
|
+
});
|
118
|
+
},
|
119
|
+
|
120
|
+
first: function() {
|
121
|
+
return this[0];
|
122
|
+
},
|
123
|
+
|
124
|
+
grep: function(filter, iterator, context) {
|
125
|
+
iterator = iterator || function(x) { return x; };
|
126
|
+
var results = $.protify([]);
|
127
|
+
if (typeof filter === 'string') {
|
128
|
+
filter = new RegExp(filter);
|
129
|
+
}
|
130
|
+
|
131
|
+
this.each(function(value, index) {
|
132
|
+
if (filter.test(value)) {
|
133
|
+
results.push(iterator.call(context, value, index));
|
134
|
+
}
|
135
|
+
});
|
136
|
+
return results;
|
137
|
+
},
|
138
|
+
|
139
|
+
include: function(object) {
|
140
|
+
if ($.isFunction(this.indexOf)) {
|
141
|
+
if (this.indexOf(object) != -1) {
|
142
|
+
return true;
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
var found = false;
|
147
|
+
this.each(function(value) {
|
148
|
+
if (value == object) {
|
149
|
+
found = true;
|
150
|
+
throw $break;
|
151
|
+
}
|
152
|
+
});
|
153
|
+
return found;
|
154
|
+
},
|
155
|
+
|
156
|
+
indexOf: function(item, i) {
|
157
|
+
i || (i = 0);
|
158
|
+
var length = this.length;
|
159
|
+
if (i < 0) i = length + i;
|
160
|
+
for (; i < length; i++)
|
161
|
+
if (this[i] === item) return i;
|
162
|
+
return -1;
|
163
|
+
},
|
164
|
+
|
165
|
+
inGroupsOf: function(number, fillWith) {
|
166
|
+
fillWith = fillWith ? null : fillWith;
|
167
|
+
return this.eachSlice(number, function(slice) {
|
168
|
+
while(slice.length < number) { slice.push(fillWith); }
|
169
|
+
return slice;
|
170
|
+
});
|
171
|
+
},
|
172
|
+
|
173
|
+
inject: function(memo, iterator, context) {
|
174
|
+
this.each(function(value, index) {
|
175
|
+
memo = iterator.call(context, memo, value, index);
|
176
|
+
});
|
177
|
+
return memo;
|
178
|
+
},
|
179
|
+
|
180
|
+
inspect: function() {
|
181
|
+
return '[' + this.map($.inspect).join(', ') + ']';
|
182
|
+
},
|
183
|
+
|
184
|
+
intersect: function(array) {
|
185
|
+
$.protify(array);
|
186
|
+
return this.uniq().findAll(function(item) {
|
187
|
+
return array.detect(function(value) { return item === value; });
|
188
|
+
});
|
189
|
+
},
|
190
|
+
|
191
|
+
invoke: function(method) {
|
192
|
+
var args = $.makeArray(arguments).slice(1);
|
193
|
+
return this.map(function(value) {
|
194
|
+
return value[method].apply(value, args);
|
195
|
+
});
|
196
|
+
},
|
197
|
+
|
198
|
+
last: function() {
|
199
|
+
return this[this.length - 1];
|
200
|
+
},
|
201
|
+
|
202
|
+
lastIndexOf : function(item, i) {
|
203
|
+
i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
|
204
|
+
var n = $.protify(this.slice(0, i).reverse()).indexOf(item);
|
205
|
+
return (n < 0) ? n : i - n - 1;
|
206
|
+
},
|
207
|
+
max: function(iterator, context) {
|
208
|
+
iterator = iterator || function(x) { return x; };
|
209
|
+
var result;
|
210
|
+
this.each(function(value, index) {
|
211
|
+
value = iterator.call(context, value, index);
|
212
|
+
if (result == null || value >= result) {
|
213
|
+
result = value;
|
214
|
+
}
|
215
|
+
});
|
216
|
+
return result;
|
217
|
+
},
|
218
|
+
|
219
|
+
min: function(iterator, context) {
|
220
|
+
iterator = iterator || function(x) { return x; };
|
221
|
+
var result;
|
222
|
+
this.each(function(value, index) {
|
223
|
+
value = iterator.call(context, value, index);
|
224
|
+
if (result == null || value < result) {
|
225
|
+
result = value;
|
226
|
+
}
|
227
|
+
});
|
228
|
+
return result;
|
229
|
+
},
|
230
|
+
|
231
|
+
partition: function(iterator, context) {
|
232
|
+
iterator = iterator || function(x) { return x; };
|
233
|
+
var trues = [], falses = [];
|
234
|
+
this.each(function(value, index) {
|
235
|
+
(iterator.call(context, value, index) ? trues : falses).push(value);
|
236
|
+
});
|
237
|
+
return [trues, falses];
|
238
|
+
},
|
239
|
+
|
240
|
+
pluck: function(property) {
|
241
|
+
var results = $.protify([]);
|
242
|
+
this.each(function(value) {
|
243
|
+
results.push(value[property]);
|
244
|
+
});
|
245
|
+
return results;
|
246
|
+
},
|
247
|
+
|
248
|
+
purge: function () {
|
249
|
+
return [].concat(this);
|
250
|
+
},
|
251
|
+
|
252
|
+
reduce: function() {
|
253
|
+
return this.length > 1 ? this : this[0];
|
254
|
+
},
|
255
|
+
|
256
|
+
reject: function(iterator, context) {
|
257
|
+
var results = $.protify([]);
|
258
|
+
this.each(function(value, index) {
|
259
|
+
if (!iterator.call(context, value, index)) {
|
260
|
+
results.push(value);
|
261
|
+
}
|
262
|
+
});
|
263
|
+
return results;
|
264
|
+
},
|
265
|
+
|
266
|
+
size: function() {
|
267
|
+
return this.length;
|
268
|
+
},
|
269
|
+
|
270
|
+
sortBy: function(iterator, context) {
|
271
|
+
return this.map(function(value, index) {
|
272
|
+
return {
|
273
|
+
value: value,
|
274
|
+
criteria: iterator.call(context, value, index)
|
275
|
+
};
|
276
|
+
}).sort(function(left, right) {
|
277
|
+
var a = left.criteria, b = right.criteria;
|
278
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
279
|
+
}).pluck('value');
|
280
|
+
},
|
281
|
+
|
282
|
+
toArray: function() {
|
283
|
+
return $.protify(this.map());
|
284
|
+
},
|
285
|
+
|
286
|
+
// toJSON: function() {
|
287
|
+
// var results = [];
|
288
|
+
// this.each(function(object) {
|
289
|
+
// var value = Object.toJSON(object);
|
290
|
+
// if (!Object.isUndefined(value)) results.push(value);
|
291
|
+
// });
|
292
|
+
// return '[' + results.join(', ') + ']';
|
293
|
+
//},
|
294
|
+
|
295
|
+
uniq: function(sorted) {
|
296
|
+
return $.protify(this.inject([], function(array, value, index) {
|
297
|
+
$.protify(array, true);
|
298
|
+
if (0 === index || (sorted ? array.last() != value : !array.include(value))) {
|
299
|
+
array.push(value);
|
300
|
+
}
|
301
|
+
return array;
|
302
|
+
}));
|
303
|
+
},
|
304
|
+
|
305
|
+
without: function() {
|
306
|
+
var values = $.protify($.makeArray(arguments));
|
307
|
+
return $.protify(this.select(function(value) {
|
308
|
+
return !values.include(value);
|
309
|
+
}));
|
310
|
+
},
|
311
|
+
|
312
|
+
zip: function() {
|
313
|
+
var iterator = function(x) { return x; }, args = $.protify($.makeArray(arguments));
|
314
|
+
if ($.isFunction(args.last())) {
|
315
|
+
iterator = args.pop();
|
316
|
+
}
|
317
|
+
|
318
|
+
var collections = $.protify([this].concat(args)).map();
|
319
|
+
return this.map(function(value, index) {
|
320
|
+
return iterator(collections.pluck(index));
|
321
|
+
});
|
322
|
+
}
|
323
|
+
};
|
324
|
+
|
325
|
+
$.extend(arrayFunc, {
|
326
|
+
map: arrayFunc.collect,
|
327
|
+
find: arrayFunc.detect,
|
328
|
+
select: arrayFunc.findAll,
|
329
|
+
filter: arrayFunc.findAll,
|
330
|
+
member: arrayFunc.include,
|
331
|
+
entries: arrayFunc.toArray,
|
332
|
+
every: arrayFunc.all,
|
333
|
+
some: arrayFunc.any
|
334
|
+
});
|
335
|
+
|
336
|
+
$.protify = function(target, permanent) {
|
337
|
+
if (permanent) {
|
338
|
+
$.extend(target, arrayFunc);
|
339
|
+
return target;
|
340
|
+
}
|
341
|
+
target = $.extend(target.slice(), arrayFunc);
|
342
|
+
return target;
|
343
|
+
};
|
344
|
+
|
345
|
+
})(jQuery);
|
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
data/jelly.gemspec
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{jelly}
|
8
|
+
s.version = "0.5.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Pivotal Labs, Inc"]
|
12
|
+
s.date = %q{2009-09-28}
|
13
|
+
s.description = %q{Jelly provides a set of tools and conventions for creating rich ajax/javascript web applications with jQuery and Ruby on Rails.}
|
14
|
+
s.email = %q{opensource@pivotallabs.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"MIT-LICENSE",
|
21
|
+
"README.markdown",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"VERSION.yml",
|
25
|
+
"generators/jelly/USAGE",
|
26
|
+
"generators/jelly/jelly_generator.rb",
|
27
|
+
"generators/jelly/templates/javascripts/ajax_with_jelly.js",
|
28
|
+
"generators/jelly/templates/javascripts/jelly.js",
|
29
|
+
"generators/jelly/templates/javascripts/jquery/jquery-1.3.2.js",
|
30
|
+
"generators/jelly/templates/javascripts/jquery/jquery.protify-0.3.js",
|
31
|
+
"install.rb",
|
32
|
+
"jelly.gemspec",
|
33
|
+
"lib/jelly.rb",
|
34
|
+
"lib/jelly/jelly_controller.rb",
|
35
|
+
"lib/jelly/jelly_helper.rb",
|
36
|
+
"tasks/jelly_tasks.rake",
|
37
|
+
"uninstall.rb"
|
38
|
+
]
|
39
|
+
s.homepage = %q{http://github.com/pivotal/jelly}
|
40
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
41
|
+
s.require_paths = ["lib"]
|
42
|
+
s.rubygems_version = %q{1.3.5}
|
43
|
+
s.summary = %q{a sweet unobtrusive javascript framework for jQuery and Rails}
|
44
|
+
s.test_files = [
|
45
|
+
"spec/controllers/jelly_controller_spec.rb",
|
46
|
+
"spec/helpers/jelly_helper_spec.rb",
|
47
|
+
"spec/rails_root/app/controllers/application_controller.rb",
|
48
|
+
"spec/rails_root/app/helpers/application_helper.rb",
|
49
|
+
"spec/rails_root/config/boot.rb",
|
50
|
+
"spec/rails_root/config/environment.rb",
|
51
|
+
"spec/rails_root/config/environments/development.rb",
|
52
|
+
"spec/rails_root/config/environments/production.rb",
|
53
|
+
"spec/rails_root/config/environments/test.rb",
|
54
|
+
"spec/rails_root/config/initializers/backtrace_silencers.rb",
|
55
|
+
"spec/rails_root/config/initializers/inflections.rb",
|
56
|
+
"spec/rails_root/config/initializers/mime_types.rb",
|
57
|
+
"spec/rails_root/config/initializers/new_rails_defaults.rb",
|
58
|
+
"spec/rails_root/config/initializers/session_store.rb",
|
59
|
+
"spec/rails_root/config/routes.rb",
|
60
|
+
"spec/rails_root/test/performance/browsing_test.rb",
|
61
|
+
"spec/rails_root/test/test_helper.rb",
|
62
|
+
"spec/spec_helper.rb"
|
63
|
+
]
|
64
|
+
|
65
|
+
if s.respond_to? :specification_version then
|
66
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
67
|
+
s.specification_version = 3
|
68
|
+
|
69
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
70
|
+
s.add_runtime_dependency(%q<rails>, [">= 2.3.0"])
|
71
|
+
else
|
72
|
+
s.add_dependency(%q<rails>, [">= 2.3.0"])
|
73
|
+
end
|
74
|
+
else
|
75
|
+
s.add_dependency(%q<rails>, [">= 2.3.0"])
|
76
|
+
end
|
77
|
+
end
|
data/lib/jelly.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
raise "Jelly must be used in a Rails environment." unless defined?(ActionController)
|
2
|
+
|
3
|
+
require 'jelly/jelly_controller'
|
4
|
+
require 'jelly/jelly_helper'
|
5
|
+
|
6
|
+
ActionController::Base.class_eval do
|
7
|
+
include JellyController
|
8
|
+
end
|
9
|
+
|
10
|
+
ActionView::Base.class_eval do
|
11
|
+
include JellyHelper
|
12
|
+
end
|
13
|
+
|
14
|
+
ActionView::Helpers::AssetTagHelper.register_javascript_expansion :jelly => ["jquery/jquery-1.3.2", "jquery/jquery.protify-0.3",
|
15
|
+
"ajax_with_jelly", "jelly"]
|
16
|
+
ActionView::Helpers::AssetTagHelper.register_javascript_expansion :only_jelly => ["jquery/jquery.protify-0.3", "jelly", "ajax_with_jelly"]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JellyController
|
2
|
+
protected
|
3
|
+
|
4
|
+
def jelly_callback(callback_base_name = @action_name, options = {}, &block)
|
5
|
+
render :inline => jelly_callback_erb("on_#{callback_base_name}", options, block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def jelly_callback_erb(callback_name, options, block)
|
9
|
+
@callback_name = callback_name
|
10
|
+
@options = options
|
11
|
+
@block = block
|
12
|
+
erb = <<-ERB
|
13
|
+
<%= begin
|
14
|
+
args = @block ? instance_eval(&@block) : []
|
15
|
+
args = [args] unless args.is_a?(Array)
|
16
|
+
{"method" => @callback_name, "arguments" => args}.reverse_merge(@options).to_json
|
17
|
+
end %>
|
18
|
+
ERB
|
19
|
+
request.xhr? ? erb : "<textarea>#{erb}</textarea>"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
end
|