de_rjs 0.2.1

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.
@@ -0,0 +1,17 @@
1
+ require 'parser/current'
2
+ require_relative 'rewriter/erbify'
3
+
4
+ module DeRjs
5
+ module Rewriter
6
+ def rewrite_rjs(source)
7
+ buffer = Parser::Source::Buffer.new("buffer_name")
8
+ buffer.source = source
9
+ parser = Parser::CurrentRuby.new
10
+ ast = parser.parse(buffer)
11
+ rewriter = Erbify.new
12
+
13
+ rewriter.rewrite(buffer, ast)
14
+ end
15
+ module_function :rewrite_rjs
16
+ end
17
+ end
@@ -0,0 +1,104 @@
1
+ module DeRjs
2
+ module Rewriter
3
+ class Erbify < Parser::Rewriter
4
+ class MustTranslateManually < StandardError; end
5
+
6
+ def on_send(node)
7
+ receiver_node, method_name, *arg_nodes = *node
8
+
9
+ if receiver_node.to_a.last == :page
10
+ case method_name
11
+ when :replace_html, :replace
12
+ rewrite_replace_html(receiver_node, method_name, *arg_nodes)
13
+
14
+ when :insert_html
15
+ rewrite_insert_html(receiver_node, method_name, *arg_nodes)
16
+
17
+ when :redirect_to
18
+ rewrite_redirect_to(receiver_node, method_name, *arg_nodes)
19
+
20
+ when :[]
21
+ rewrite_square_bracket(receiver_node, method_name, *arg_nodes)
22
+
23
+ else
24
+ # All others such as :
25
+ # page.alert
26
+ # page.hide
27
+ # page.redirect_to
28
+ # page.reload
29
+ # page.replace
30
+ # page.select
31
+ # page.show
32
+ # page.visual_effect
33
+ rewrite_all_args(receiver_node, method_name, *arg_nodes)
34
+ end
35
+ end
36
+
37
+ # page[:html_id].some_method
38
+ if receiver_node.to_a.first.to_a.last == :page && receiver_node.to_a[1] == :[]
39
+ rewrite_square_bracket(*receiver_node.to_a)
40
+ rewrite_square_replace(receiver_node, method_name, *arg_nodes) if [:replace, :replace_html].include?(method_name)
41
+ end
42
+ end
43
+
44
+ def rewrite_all_args(receiver_node, method_name, *arg_nodes)
45
+ arg_nodes.each {|arg_node| rewrite_to_erb_unless_static(arg_node) }
46
+ end
47
+
48
+ # id, *options_for_render
49
+ def rewrite_replace_html(receiver_node, method_name, *arg_nodes)
50
+ rewrite_to_erb_unless_static(arg_nodes.shift)
51
+ rewrite_options_for_render(arg_nodes)
52
+ end
53
+
54
+ # position, id, *options_for_render
55
+ def rewrite_insert_html(receiver_node, method_name, *arg_nodes)
56
+ rewrite_to_erb_unless_static(arg_nodes.shift)
57
+ rewrite_to_erb_unless_static(arg_nodes.shift)
58
+ rewrite_options_for_render(arg_nodes)
59
+ end
60
+
61
+ # location (string, or url_for compatible options)
62
+ def rewrite_redirect_to(receiver_node, method_name, *arg_nodes)
63
+ rewrite_url_for(arg_nodes.first)
64
+ end
65
+
66
+ # e.g. page["sgfg"] or page["wat_#{@id}"]
67
+ #
68
+ # But this will raise when it encounters e.g. page[@var] or page[Bunny.new]
69
+ # While this is NOT accurate, throwing an error seems better than trying to evaluating
70
+ # a turing complete statement, and causing subtle failures downstream
71
+ def rewrite_square_bracket(receiver_node, method_name, *arg_nodes)
72
+ unless [:str, :sym, :dstr].include?(arg_nodes.first.type)
73
+ raise MustTranslateManually, "Unable to compute type of expression statically:#{arg_nodes.first.inspect}\n -" \
74
+ "`def id[]` supports String, Symbol, NilClass or something that `dom_id` can understand"
75
+ end
76
+ rewrite_to_erb_unless_static(arg_nodes.shift)
77
+ end
78
+
79
+ # *options_for_render
80
+ def rewrite_square_replace(receiver_node, method_name, *arg_nodes)
81
+ rewrite_options_for_render(arg_nodes)
82
+ end
83
+
84
+ protected
85
+ def rewrite_to_erb_unless_static(id_arg)
86
+ return if [:str, :sym].include?(id_arg.type)
87
+ insert_before id_arg.loc.expression, "%q{<%= "
88
+ insert_after id_arg.loc.expression, " %>}"
89
+ end
90
+
91
+ def rewrite_options_for_render(arg_nodes)
92
+ return if arg_nodes.size == 1 && arg_nodes.first.type == :str
93
+ insert_before arg_nodes.first.loc.expression, "%q{<%= escape_javascript(render("
94
+ insert_after arg_nodes.last.loc.expression, ")) %>}"
95
+ end
96
+
97
+ def rewrite_url_for(url_arg)
98
+ return if url_arg.type == :str
99
+ insert_before url_arg.loc.expression, "%q{<%= url_for("
100
+ insert_after url_arg.loc.expression, ") %>}"
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,26 @@
1
+ require 'de_rjs'
2
+
3
+ module DeRjs
4
+ class Runner
5
+ attr_reader :filenames
6
+
7
+ def initialize(filenames)
8
+ @filenames = filenames
9
+ end
10
+
11
+ def execute
12
+ filenames.each do |filename|
13
+ source = File.read filename
14
+ js_erb = rewrite_to_js_erb(source)
15
+ File.open(filename, "w") {|f| f << js_erb}
16
+ end
17
+ end
18
+
19
+ protected
20
+ def rewrite_to_js_erb(rjs)
21
+ rewritten_source = DeRjs::Rewriter.rewrite_rjs(rjs)
22
+ generator = DeRjs::JqueryGenerator.new(nil) { eval(rewritten_source)}
23
+ generator.to_s
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ lib = File.expand_path("#{File.dirname(__FILE__)}/../lib")
2
+ $:.unshift(lib) unless $:.include?('lib') || $:.include?(lib)
3
+
4
+ $:.unshift(File.dirname(__FILE__) + '/lib')
5
+
6
+ require 'rubygems'
7
+ require 'bundler/setup'
8
+ require "minitest/autorun"
9
+ require 'active_support'
10
+ require 'action_controller'
11
+ require 'action_view'
12
+
13
+ require 'de_rjs'
@@ -0,0 +1,432 @@
1
+ require 'abstract_unit'
2
+ require 'active_model'
3
+
4
+ class Bunny < Struct.new(:Bunny, :id)
5
+ extend ActiveModel::Naming
6
+ include ActiveModel::Conversion
7
+ def to_key() id ? [id] : nil end
8
+ end
9
+
10
+ class DeRjsBaseTest < Minitest::Test
11
+ protected
12
+ def not_supported
13
+ skip "not supported"
14
+ end
15
+
16
+ def create_generator
17
+ block = Proc.new { |*args| yield(*args) if block_given? }
18
+ DeRjs::JqueryGenerator.new self, &block
19
+ end
20
+
21
+ def generate_js(rjs)
22
+ rewritten_source = DeRjs::Rewriter.rewrite_rjs(rjs)
23
+ generator = DeRjs::JqueryGenerator.new(nil) { eval(rewritten_source)}
24
+ generator.to_s
25
+ end
26
+ end
27
+
28
+
29
+ class DeRjsTest < DeRjsBaseTest
30
+ def setup
31
+ super
32
+ @generator = create_generator
33
+ ActiveSupport.escape_html_entities_in_json = true
34
+ end
35
+
36
+ def teardown
37
+ ActiveSupport.escape_html_entities_in_json = false
38
+ end
39
+
40
+ def _evaluate_assigns_and_ivars() end
41
+
42
+ def test_insert_html_with_string
43
+ assert_equal '$("#element").prepend("\\u003cp\\u003eThis is a test\\u003c/p\\u003e");',
44
+ generate_js(%Q{ page.insert_html(:top, 'element', '<p>This is a test</p>') })
45
+ assert_equal '$("#element").append("\\u003cp\u003eThis is a test\\u003c/p\u003e");',
46
+ generate_js(%Q{ page.insert_html(:bottom, 'element', '<p>This is a test</p>') })
47
+ assert_equal '$("#element").before("\\u003cp\u003eThis is a test\\u003c/p\u003e");',
48
+ generate_js(%Q{ page.insert_html(:before, 'element', '<p>This is a test</p>') })
49
+ assert_equal '$("#element").after("\\u003cp\u003eThis is a test\\u003c/p\u003e");',
50
+ generate_js(%Q{ page.insert_html(:after, 'element', '<p>This is a test</p>') })
51
+ end
52
+
53
+ def test_replace_html_with_string
54
+ assert_equal '$("#element").html("\\u003cp\\u003eThis is a test\\u003c/p\\u003e");',
55
+ generate_js(%Q{ page.replace_html('element', '<p>This is a test</p>') })
56
+ end
57
+
58
+ def test_replace_element_with_string
59
+ assert_equal '$("#element").replaceWith("\\u003cdiv id=\"element\"\\u003e\\u003cp\\u003eThis is a test\\u003c/p\\u003e\\u003c/div\\u003e");',
60
+ generate_js(%Q{ page.replace('element', '<div id="element"><p>This is a test</p></div>') })
61
+ end
62
+
63
+ def test_insert_html_with_hash
64
+ assert_equal '$("#element").prepend("<%= escape_javascript(render(:partial => "post", :locals => {:ab => "cd"})) %>");',
65
+ generate_js(%Q{ page.insert_html(:top, 'element', :partial => "post", :locals => {:ab => "cd"}) })
66
+ end
67
+
68
+ def test_replace_html_with_hash
69
+ assert_equal '$("#element").html("<%= escape_javascript(render(:partial => "post", :locals => {:ab => "cd"})) %>");',
70
+ generate_js(%Q{ page.replace_html('element', :partial => "post", :locals => {:ab => "cd"}) })
71
+ end
72
+
73
+ def test_replace_element_with_hash
74
+ assert_equal '$("#element").replaceWith("<%= escape_javascript(render(:partial => "post", :locals => {:ab => "cd"})) %>");',
75
+ generate_js(%Q{ page.replace('element', :partial => "post", :locals => {:ab => "cd"}) })
76
+ end
77
+
78
+
79
+ def test_remove
80
+ assert_equal '$("#foo").remove();',
81
+ generate_js(%Q{ page.remove('foo') })
82
+ assert_equal '$("#foo,#bar,#baz").remove();',
83
+ generate_js(%Q{ page.remove('foo', 'bar', 'baz') })
84
+ end
85
+
86
+ def test_show
87
+ assert_equal '$("#foo").show();',
88
+ generate_js(%Q{ page.show('foo') })
89
+ assert_equal '$("#foo,#bar,#baz").show();',
90
+ generate_js(%Q{ page.show('foo', 'bar', 'baz') })
91
+ end
92
+
93
+ def test_hide
94
+ assert_equal '$("#foo").hide();',
95
+ generate_js(%Q{ page.hide('foo') })
96
+ assert_equal '$("#foo,#bar,#baz").hide();',
97
+ generate_js(%Q{ page.hide('foo', 'bar', 'baz') })
98
+ end
99
+
100
+ def test_toggle
101
+ assert_equal '$("#foo").toggle();',
102
+ generate_js(%Q{ page.toggle('foo') })
103
+ assert_equal '$("#foo,#bar,#baz").toggle();',
104
+ generate_js(%Q{ page.toggle('foo', 'bar', 'baz') })
105
+ end
106
+
107
+ def test_alert
108
+ assert_equal 'alert("hello");', generate_js(%Q{ page.alert('hello') })
109
+ end
110
+
111
+ def test_redirect_to
112
+ assert_equal 'window.location.href = "http://www.example.com/welcome?a=b&c=d";',
113
+ generate_js(%Q{ page.redirect_to("http://www.example.com/welcome?a=b&c=d") })
114
+ assert_equal 'window.location.href = "<%= url_for(:action => \'welcome\') %>";',
115
+ generate_js(%Q{ page.redirect_to(:action => 'welcome') })
116
+ end
117
+
118
+ def test_reload
119
+ assert_equal 'window.location.reload();',
120
+ generate_js(%Q{ page.reload })
121
+ end
122
+
123
+ def test_delay
124
+ not_supported
125
+
126
+ @generator.delay(20) do
127
+ @generator.hide('foo')
128
+ end
129
+
130
+ assert_equal "setTimeout(function() {\n;\n$(\"#foo\").hide();\n}, 20000);", @generator.to_s
131
+ end
132
+
133
+ def test_to_s
134
+ not_supported
135
+
136
+ @generator.insert_html(:top, 'element', '<p>This is a test</p>')
137
+ @generator.insert_html(:bottom, 'element', '<p>This is a test</p>')
138
+ @generator.remove('foo', 'bar')
139
+ @generator.replace_html('baz', '<p>This is a test</p>')
140
+
141
+ assert_equal <<-EOS.chomp, @generator.to_s
142
+ $("#element").prepend("\\u003cp\\u003eThis is a test\\u003c/p\\u003e");
143
+ $("#element").append("\\u003cp\\u003eThis is a test\\u003c/p\\u003e");
144
+ $("#foo,#bar").remove();
145
+ $("#baz").html("\\u003cp\\u003eThis is a test\\u003c/p\\u003e");
146
+ EOS
147
+ end
148
+
149
+ def test_element_access
150
+ assert_equal %($("#hello");), generate_js(%Q{ page['hello'] })
151
+ end
152
+
153
+ def test_element_access_on_variable
154
+ assert_raises DeRjs::Rewriter::Erbify::MustTranslateManually do
155
+ assert_equal %($("#<%= 'hello' + @var %>");), generate_js(%Q{ page['hello' + @var] })
156
+ end
157
+ assert_raises DeRjs::Rewriter::Erbify::MustTranslateManually do
158
+ assert_equal %($("#<%= 'hello' + @var %>").hide();), generate_js(%Q{ page['hello' + @var].hide })
159
+ end
160
+ end
161
+
162
+ def test_element_access_on_records
163
+ assert_raises DeRjs::Rewriter::Erbify::MustTranslateManually do
164
+ assert_equal %($("#<%= Bunny.new(:id => 5) %>");), generate_js(%Q{ page[Bunny.new(:id => 5)] })
165
+ end
166
+ assert_raises DeRjs::Rewriter::Erbify::MustTranslateManually do
167
+ assert_equal %($("#<%= Bunny.new %>");), generate_js(%Q{ page[Bunny.new] })
168
+ end
169
+ end
170
+
171
+
172
+ def test_element_proxy_one_deep
173
+ assert_equal %($("#hello").hide();), generate_js(%Q{ page['hello'].hide })
174
+ end
175
+
176
+ def test_element_proxy_variable_access
177
+ assert_equal %($("#hello").style;), generate_js(%Q{ page['hello']['style'] })
178
+ end
179
+
180
+ def test_element_proxy_variable_access_with_assignment
181
+ assert_equal %($("#hello").style.color = "red";), generate_js(%Q{ page['hello']['style']['color'] = 'red' })
182
+ end
183
+
184
+ def test_element_proxy_assignment
185
+ assert_equal %($("#hello").width = 400;), generate_js(%Q{ page['hello'].width = 400 })
186
+ end
187
+
188
+ def test_element_proxy_two_deep
189
+ @generator['hello'].hide("first").clean_whitespace
190
+ assert_equal %($("#hello").hide("first").cleanWhitespace();), @generator.to_s
191
+ end
192
+
193
+ def test_select_access
194
+ assert_equal %($("div.hello");), @generator.select('div.hello')
195
+ end
196
+
197
+ def test_select_proxy_one_deep
198
+ assert_equal %($("p.welcome b").first().hide();), generate_js(%Q{ page.select('p.welcome b').first.hide })
199
+ end
200
+
201
+ def test_visual_effect
202
+ assert_equal %($(\"#blah\").effect(\"puff\",{});),
203
+ generate_js(%Q{ page.visual_effect(:puff,'blah') })
204
+ end
205
+
206
+ def test_visual_effect_toggle
207
+ assert_equal %($(\"#blah\").toggle(\"fade\",{});),
208
+ generate_js(%Q{ page.visual_effect(:toggle_appear,'blah') })
209
+ end
210
+
211
+ def test_visual_effect_with_variable
212
+ assert_equal %($(\"#<%= "blah" + blah.id %>\").toggle(\"fade\",{});),
213
+ generate_js(%Q{ page.visual_effect(:toggle_appear,"blah" + blah.id) })
214
+ end
215
+
216
+ def test_sortable
217
+ assert_equal %(Sortable.create("blah", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize("blah")})}});),
218
+ @generator.sortable('blah', :url => { :action => "order" })
219
+ assert_equal %(Sortable.create("blah", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:false, evalScripts:true, parameters:Sortable.serialize("blah")})}});),
220
+ @generator.sortable('blah', :url => { :action => "order" }, :type => :synchronous)
221
+ end
222
+
223
+ def test_draggable
224
+ assert_equal %(new Draggable("blah", {});),
225
+ @generator.draggable('blah')
226
+ end
227
+
228
+ def test_drop_receiving
229
+ assert_equal %(Droppables.add("blah", {onDrop:function(element){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}});),
230
+ @generator.drop_receiving('blah', :url => { :action => "order" })
231
+ assert_equal %(Droppables.add("blah", {onDrop:function(element){new Ajax.Request('http://www.example.com/order', {asynchronous:false, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}});),
232
+ @generator.drop_receiving('blah', :url => { :action => "order" }, :type => :synchronous)
233
+ end
234
+
235
+ def test_collection_first_and_last
236
+ js = generate_js(%Q{
237
+ page.select('p.welcome b').first.hide()
238
+ page.select('p.welcome b').last.show()
239
+ })
240
+ assert_equal <<-EOS.strip, js
241
+ $("p.welcome b").first().hide();
242
+ $("p.welcome b").last().show();
243
+ EOS
244
+ end
245
+
246
+ def test_collection_proxy_with_each
247
+ not_supported
248
+
249
+ @generator.select('p.welcome b').each do |value|
250
+ value.remove_class_name 'selected'
251
+ end
252
+ @generator.select('p.welcome b').each do |value, index|
253
+ @generator.visual_effect :highlight, value
254
+ end
255
+ assert_equal <<-EOS.strip, @generator.to_s
256
+ $("p.welcome b").each(function(value, index) {
257
+ value.removeClassName("selected");
258
+ });
259
+ $("p.welcome b").each(function(value, index) {
260
+ $("#value").effect("highlight",{});
261
+ });
262
+ EOS
263
+ end
264
+
265
+ def test_collection_proxy_on_collect
266
+ not_supported
267
+
268
+ @generator.select('p').collect('a') { |para| para.show }
269
+ @generator.select('p').collect { |para| para.hide }
270
+ assert_equal <<-EOS.strip, @generator.to_s
271
+ var a = $("p").collect(function(value, index) {
272
+ return value.show();
273
+ });
274
+ $("p").collect(function(value, index) {
275
+ return value.hide();
276
+ });
277
+ EOS
278
+ @generator = create_generator
279
+ end
280
+
281
+ def test_collection_proxy_with_grep
282
+ not_supported
283
+
284
+ @generator.select('p').grep 'a', /^a/ do |value|
285
+ @generator << '(value.className == "welcome")'
286
+ end
287
+ @generator.select('p').grep 'b', /b$/ do |value, index|
288
+ @generator.call 'alert', value
289
+ @generator << '(value.className == "welcome")'
290
+ end
291
+
292
+ assert_equal <<-EOS.strip, @generator.to_s
293
+ var a = $("p").grep(/^a/, function(value, index) {
294
+ return (value.className == "welcome");
295
+ });
296
+ var b = $("p").grep(/b$/, function(value, index) {
297
+ alert(value);
298
+ return (value.className == "welcome");
299
+ });
300
+ EOS
301
+ end
302
+
303
+ def test_collection_proxy_with_inject
304
+ not_supported
305
+
306
+ @generator.select('p').inject 'a', [] do |memo, value|
307
+ @generator << '(value.className == "welcome")'
308
+ end
309
+ @generator.select('p').inject 'b', nil do |memo, value, index|
310
+ @generator.call 'alert', memo
311
+ @generator << '(value.className == "welcome")'
312
+ end
313
+
314
+ assert_equal <<-EOS.strip, @generator.to_s
315
+ var a = $("p").inject([], function(memo, value, index) {
316
+ return (value.className == "welcome");
317
+ });
318
+ var b = $("p").inject(null, function(memo, value, index) {
319
+ alert(memo);
320
+ return (value.className == "welcome");
321
+ });
322
+ EOS
323
+ end
324
+
325
+ def test_collection_proxy_with_pluck
326
+ js = generate_js(%Q{ page.select('p').pluck('a', 'className') })
327
+ assert_equal %(var a = $("p").pluck("className");), js
328
+ end
329
+
330
+ def test_collection_proxy_with_zip
331
+ not_supported
332
+
333
+ ActionView::Helpers::JavaScriptCollectionProxy.new(@generator, '[1, 2, 3]').zip('a', [4, 5, 6], [7, 8, 9])
334
+ ActionView::Helpers::JavaScriptCollectionProxy.new(@generator, '[1, 2, 3]').zip('b', [4, 5, 6], [7, 8, 9]) do |array|
335
+ @generator.call 'array.reverse'
336
+ end
337
+
338
+ assert_equal <<-EOS.strip, @generator.to_s
339
+ var a = [1, 2, 3].zip([4,5,6], [7,8,9]);
340
+ var b = [1, 2, 3].zip([4,5,6], [7,8,9], function(array) {
341
+ return array.reverse();
342
+ });
343
+ EOS
344
+ end
345
+
346
+ def test_collection_proxy_with_find_all
347
+ not_supported
348
+
349
+ @generator.select('p').find_all 'a' do |value, index|
350
+ @generator << '(value.className == "welcome")'
351
+ end
352
+
353
+ assert_equal <<-EOS.strip, @generator.to_s
354
+ var a = $("p").findAll(function(value, index) {
355
+ return (value.className == "welcome");
356
+ });
357
+ EOS
358
+ end
359
+
360
+ def test_collection_proxy_with_in_groups_of
361
+ not_supported
362
+
363
+ @generator.select('p').in_groups_of('a', 3)
364
+ @generator.select('p').in_groups_of('a', 3, 'x')
365
+ assert_equal <<-EOS.strip, @generator.to_s
366
+ var a = $("p").inGroupsOf(3);
367
+ var a = $("p").inGroupsOf(3, "x");
368
+ EOS
369
+ end
370
+
371
+ def test_collection_proxy_with_each_slice
372
+ not_supported
373
+
374
+ @generator.select('p').each_slice('a', 3)
375
+ @generator.select('p').each_slice('a', 3) do |group, index|
376
+ group.reverse
377
+ end
378
+
379
+ assert_equal <<-EOS.strip, @generator.to_s
380
+ var a = $("p").eachSlice(3);
381
+ var a = $("p").eachSlice(3, function(value, index) {
382
+ return value.reverse();
383
+ });
384
+ EOS
385
+ end
386
+
387
+ #def test_debug_rjs
388
+ #ActionView::Base.debug_rjs = true
389
+ #@generator['welcome'].replace_html 'Welcome'
390
+ #assert_equal "try {\n$(\"#welcome\").html(\"Welcome\");\n} catch (e) { alert('RJS error:\\n\\n' + e.toString()); alert('$(\\\"#welcome\\\").html(\\\"Welcome\\\");'); throw e }", @generator.to_s
391
+ #ensure
392
+ #ActionView::Base.debug_rjs = false
393
+ #end
394
+
395
+ def test_literal
396
+ not_supported
397
+
398
+ literal = @generator.literal("function() {}")
399
+ assert_equal "function() {}", ActiveSupport::JSON.encode(literal)
400
+ assert_equal "", @generator.to_s
401
+ end
402
+
403
+ def test_class_proxy
404
+ @generator.form.focus('my_field')
405
+ assert_equal "Form.focus(\"my_field\");", @generator.to_s
406
+ end
407
+
408
+ def test_call_with_block
409
+ not_supported
410
+
411
+ @generator.call(:before)
412
+ @generator.call(:my_method) do |p|
413
+ p[:one].show
414
+ p[:two].hide
415
+ end
416
+ @generator.call(:in_between)
417
+ @generator.call(:my_method_with_arguments, true, "hello") do |p|
418
+ p[:three].visual_effect(:highlight)
419
+ end
420
+ assert_equal "before();\nmy_method(function() { $(\"#one\").show();\n$(\"#two\").hide(); });\nin_between();\nmy_method_with_arguments(true, \"hello\", function() { $(\"#three\").visualEffect(\"highlight\"); });", @generator.to_s
421
+ end
422
+
423
+ def test_class_proxy_call_with_block
424
+ not_supported
425
+
426
+ @generator.my_object.my_method do |p|
427
+ p[:one].show
428
+ p[:two].hide
429
+ end
430
+ assert_equal "MyObject.myMethod(function() { $(\"#one\").show();\n$(\"#two\").hide(); });", @generator.to_s
431
+ end
432
+ end