mvz-live_ast 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +5 -0
  3. data/README.rdoc +14 -0
  4. data/lib/live_ast/base.rb +7 -9
  5. data/lib/live_ast/irb_spy.rb +1 -1
  6. data/lib/live_ast/replace_caller.rb +14 -0
  7. data/lib/live_ast/version.rb +1 -1
  8. metadata +75 -116
  9. data/Rakefile +0 -62
  10. data/devel/levitate.rb +0 -184
  11. data/devel/levitate_config.rb +0 -4
  12. data/test/alias_test.rb +0 -25
  13. data/test/ast_eval/ast_eval_test.rb +0 -13
  14. data/test/ast_load/ast_load_test.rb +0 -47
  15. data/test/attr_test.rb +0 -26
  16. data/test/backtrace_test.rb +0 -161
  17. data/test/base/noninvasive_test.rb +0 -55
  18. data/test/base/reload_test.rb +0 -43
  19. data/test/covert_define_method_test.rb +0 -25
  20. data/test/def_test.rb +0 -37
  21. data/test/define_method_test.rb +0 -69
  22. data/test/define_singleton_method_test.rb +0 -17
  23. data/test/encoding_test/bad.rb +0 -1
  24. data/test/encoding_test/cp932.rb +0 -6
  25. data/test/encoding_test/default.rb +0 -5
  26. data/test/encoding_test/eucjp.rb +0 -6
  27. data/test/encoding_test/koi8.rb +0 -6
  28. data/test/encoding_test/koi8_shebang.rb +0 -7
  29. data/test/encoding_test/koi8_with_utf8bom.rb +0 -6
  30. data/test/encoding_test/usascii.rb +0 -6
  31. data/test/encoding_test/usascii_with_utf8bom.rb +0 -6
  32. data/test/encoding_test/utf8.rb +0 -6
  33. data/test/encoding_test/utf8bom.rb +0 -6
  34. data/test/encoding_test/utf8bom_only.rb +0 -5
  35. data/test/encoding_test/utf8dos.rb +0 -6
  36. data/test/encoding_test/utf8mac.rb +0 -6
  37. data/test/encoding_test/utf8mac_alt.rb +0 -6
  38. data/test/encoding_test/utf8unix.rb +0 -6
  39. data/test/encoding_test.rb +0 -54
  40. data/test/error_test.rb +0 -118
  41. data/test/eval_test.rb +0 -271
  42. data/test/flush_cache_test.rb +0 -102
  43. data/test/full/ast_reload_test.rb +0 -41
  44. data/test/full/replace_eval_test.rb +0 -433
  45. data/test/irb_test.rb +0 -43
  46. data/test/lambda_test.rb +0 -65
  47. data/test/load_path_test.rb +0 -77
  48. data/test/load_test.rb +0 -125
  49. data/test/main.rb +0 -134
  50. data/test/nested_test.rb +0 -31
  51. data/test/readme_test.rb +0 -16
  52. data/test/recursive_eval_test.rb +0 -53
  53. data/test/redefine_method_test.rb +0 -85
  54. data/test/rubygems_test.rb +0 -27
  55. data/test/rubyspec_test.rb +0 -39
  56. data/test/singleton_test.rb +0 -27
  57. data/test/stdlib_test.rb +0 -15
  58. data/test/thread_test.rb +0 -45
  59. data/test/to_ast/to_ast_feature_test.rb +0 -13
  60. data/test/to_ruby/to_ruby_feature_test.rb +0 -13
  61. data/test/to_ruby/to_ruby_test.rb +0 -101
@@ -1,433 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "main"
4
-
5
- class FullReplaceEvalTest < ReplaceEvalTest
6
- RESULT = {}
7
-
8
- def setup
9
- RESULT.clear
10
- end
11
-
12
- DEFINE_A = lambda do
13
- class A
14
- eval %{
15
- def f(x, y)
16
- x**y
17
- end
18
- }
19
- end
20
- end
21
-
22
- def test_a_def_method
23
- DEFINE_A.call
24
- assert_equal binop_def(:f, :**), A.instance_method(:f).to_ast
25
- end
26
-
27
- DEFINE_B = lambda do
28
- eval %{
29
- class B
30
- def f(x, y)
31
- x / y
32
- end
33
- end
34
- }
35
- end
36
-
37
- def test_def_class
38
- DEFINE_B.call
39
- assert_equal "FullReplaceEvalTest::B", B.name
40
- assert_equal binop_def(:f, :/), B.instance_method(:f).to_ast
41
- end
42
-
43
- def moo
44
- a = 22
45
- ignore(a)
46
- binding
47
- end
48
-
49
- def test_binding_eval
50
- assert_equal 22, moo.eval("a")
51
- assert_equal 22, moo.eval("lambda { a }").call
52
- end
53
-
54
- DEFINE_P = lambda do
55
- class P
56
- eval %{
57
- def f
58
- @x = 33
59
- RESULT[:old] = live_ast_original_eval("@x")
60
- RESULT[:new] = eval("@x")
61
- end
62
- }
63
- end
64
- end
65
-
66
- def test_const_lookup
67
- DEFINE_P.call
68
- P.new.f
69
-
70
- assert_equal 33, RESULT[:old]
71
- assert_equal 33, RESULT[:new]
72
- end
73
-
74
- def test_const_lookup_two
75
- Class.new do
76
- eval %{
77
- def f
78
- @x = 44
79
- RESULT[:old] = live_ast_original_eval("@x")
80
- RESULT[:new] = eval("@x")
81
- end
82
- }
83
- end.new.f
84
-
85
- assert_equal 44, RESULT[:old]
86
- assert_equal 44, RESULT[:new]
87
- end
88
-
89
- DEFINE_QS = lambda do
90
- class Q
91
- class R
92
- eval %{
93
- def f
94
- RESULT[:qr] = 55
95
- end
96
- }
97
- end
98
- end
99
-
100
- module S
101
- class T
102
- eval %{
103
- def f
104
- RESULT[:st] = 66
105
- end
106
- }
107
- end
108
- end
109
- end
110
-
111
- def test_const_lookup_three
112
- DEFINE_QS.call
113
- Q::R.new.f
114
- S::T.new.f
115
- assert_equal 55, RESULT[:qr]
116
- assert_equal 66, RESULT[:st]
117
- end
118
-
119
- def test_eval_arg_error
120
- [[], (1..5).to_a].each do |args|
121
- orig = assert_raises ArgumentError do
122
- live_ast_original_eval(*args)
123
- end
124
- live = assert_raises ArgumentError do
125
- eval(*args)
126
- end
127
- assert_equal orig.message, live.message
128
- end
129
- end
130
-
131
- def test_singleton_eval_arg_error
132
- [[], (1..5).to_a].each do |args|
133
- orig = assert_raises ArgumentError do
134
- Kernel.live_ast_original_singleton_eval(*args)
135
- end
136
- live = assert_raises ArgumentError do
137
- Kernel.eval(*args)
138
- end
139
- assert_equal orig.message, live.message
140
- end
141
- end
142
-
143
- def test_instance_eval_arg_error_no_block
144
- [[], ("a".."z").to_a].each do |args|
145
- orig = assert_raises ArgumentError do
146
- Object.new.live_ast_original_instance_eval(*args)
147
- end
148
- live = assert_raises ArgumentError do
149
- Object.new.instance_eval(*args)
150
- end
151
- assert_equal orig.message, live.message
152
- end
153
-
154
- orig = assert_raises TypeError do
155
- Object.new.live_ast_original_instance_eval(nil)
156
- end
157
- live = assert_raises TypeError do
158
- Object.new.instance_eval(nil)
159
- end
160
- assert_equal orig.message, live.message
161
-
162
- [[nil], [Object.new], [3], [4, 3, 2], (1..10).to_a].each do |args|
163
- orig = assert_raises ArgumentError, TypeError do
164
- Object.new.live_ast_original_instance_eval(*args)
165
- end
166
- live = assert_raises ArgumentError, TypeError do
167
- Object.new.instance_eval(*args)
168
- end
169
- assert_equal orig.message, live.message
170
- assert_equal orig.class, live.class
171
- end
172
- end
173
-
174
- describe "instance_eval argument errors" do
175
- before do
176
- require "live_ast/full"
177
- end
178
-
179
- let(:orig) {
180
- assert_raises(ArgumentError, TypeError) do
181
- Object.new.live_ast_original_instance_eval(*args)
182
- end
183
- }
184
- let(:live) {
185
- assert_raises(ArgumentError, TypeError) do
186
- Object.new.instance_eval(*args)
187
- end
188
- }
189
-
190
- describe "when the second argument is nil" do
191
- let(:args) { ["1", nil] }
192
- it "raises the same error as the original" do
193
- assert_equal orig.message, live.message
194
- assert_equal orig.class, live.class
195
- end
196
- end
197
- end
198
-
199
- def test_instance_eval_arg_error_with_block
200
- orig = assert_raises ArgumentError do
201
- Object.new.live_ast_original_instance_eval(3, 4, 5) { nil }
202
- end
203
- live = assert_raises ArgumentError do
204
- Object.new.instance_eval(3, 4, 5) { nil }
205
- end
206
- assert_equal orig.message, live.message
207
- end
208
-
209
- def test_instance_eval_block
210
- orig = {}
211
- orig.live_ast_original_instance_eval do
212
- self[:x] = 33
213
- end
214
- assert_equal 33, orig[:x]
215
-
216
- live = {}
217
- live.instance_eval do
218
- self[:x] = 44
219
- end
220
- assert_equal 44, live[:x]
221
- end
222
-
223
- def test_instance_eval_string
224
- orig = {}
225
- orig.live_ast_original_instance_eval %{
226
- self[:x] = 33
227
- }
228
- assert_equal 33, orig[:x]
229
-
230
- live = {}
231
- live.instance_eval %{
232
- self[:x] = 44
233
- }
234
- assert_equal 44, live[:x]
235
- end
236
-
237
- def test_instance_eval_binding
238
- x = 33
239
- orig = {}
240
- orig.live_ast_original_instance_eval %{
241
- self[:x] = x
242
- self[:f] = lambda { "f" }
243
- }
244
- assert_equal x, orig[:x]
245
-
246
- y = 44
247
- live = {}
248
- live.instance_eval %{
249
- self[:y] = y
250
- self[:g] = lambda { "g" }
251
- }
252
- assert_equal y, live[:y]
253
-
254
- assert_equal no_arg_block(:lambda, "g"), live[:g].to_ast
255
- end
256
-
257
- def test_module_eval_block
258
- orig = Module.new
259
- orig.live_ast_original_module_eval do
260
- def f
261
- "orig"
262
- end
263
- end
264
- orig.instance_method(:f)
265
-
266
- live = Module.new
267
- live.module_eval do
268
- def f
269
- "live"
270
- end
271
- end
272
- assert_equal no_arg_def(:f, "live"),
273
- live.instance_method(:f).to_ast
274
- end
275
-
276
- def test_module_eval_string
277
- orig = Module.new
278
- orig.live_ast_original_module_eval %{
279
- def f
280
- "orig"
281
- end
282
- }
283
- orig.instance_method(:f)
284
-
285
- live = Module.new
286
- live.module_eval %{
287
- def h
288
- "live h"
289
- end
290
- }
291
- assert_equal no_arg_def(:h, "live h"),
292
- live.instance_method(:h).to_ast
293
- end
294
-
295
- def test_module_eval_binding
296
- x = 33
297
- ignore(x)
298
- orig = Class.new
299
- orig.live_ast_original_module_eval %{
300
- define_method :value do
301
- x
302
- end
303
- define_method :f do
304
- lambda { }
305
- end
306
- }
307
- assert_equal 33, orig.new.value
308
- assert orig.new.f.is_a?(Proc)
309
-
310
- y = 44
311
- ignore(y)
312
- live = Class.new
313
- live.module_eval %{
314
- define_method :value do
315
- y
316
- end
317
- define_method :g do
318
- lambda { "g return" }
319
- end
320
- }
321
- assert_equal 44, live.new.value
322
- assert live.new.g.is_a?(Proc)
323
-
324
- assert_equal no_arg_block(:lambda, "g return"),
325
- live.new.g.to_ast
326
- end
327
-
328
- def test_module_eval_file_line
329
- klass = Module.new
330
-
331
- orig =
332
- klass.live_ast_original_module_eval("[__FILE__, __LINE__]", "test", 102)
333
- live =
334
- klass.module_eval("[__FILE__, __LINE__]", "test", 102)
335
-
336
- unfixable do
337
- assert_equal orig, live
338
- end
339
-
340
- live.first.sub!(/#{Regexp.quote LiveAST::Linker::REVISION_TOKEN}.*\Z/, "")
341
- assert_equal orig, live
342
- assert_equal ["test", 102], live
343
- end
344
-
345
- def test_module_eval_to_str
346
- file = MiniTest::Mock.new
347
- file.expect(:to_str, "zebra.rb")
348
- Class.new.module_eval("33 + 44", file)
349
- file.verify
350
- end
351
-
352
- def test_eval_not_hosed
353
- assert_equal 3, eval("1 + 2")
354
- 1.times do
355
- assert_equal 3, eval("1 + 2")
356
- end
357
-
358
- assert_equal(3, eval(%{ eval("1 + 2") }))
359
- 1.times do
360
- assert_equal(3, eval(%{ eval("1 + 2") }))
361
- end
362
-
363
- x = 5
364
- eval %{
365
- assert_equal(3, eval(' eval("1 + 2") '))
366
- x = 6
367
- }
368
- assert_equal 6, x
369
- end
370
-
371
- def test_local_var_collision
372
- args = 33
373
- ignore(args)
374
-
375
- assert_equal 33, live_ast_original_eval("args")
376
- assert_equal 33, eval("args")
377
-
378
- assert_equal 33, Kernel.live_ast_original_singleton_eval("args")
379
- assert_equal 33, Kernel.eval("args")
380
-
381
- assert_equal 33, binding.live_ast_original_binding_eval("args")
382
- assert_equal 33, binding.eval("args")
383
-
384
- assert_equal 33, Object.new.live_ast_original_instance_eval("args")
385
- assert_equal 33, Object.new.instance_eval("args")
386
-
387
- assert_equal 33, Class.new.live_ast_original_module_eval("args")
388
- assert_equal 33, Class.new.module_eval("args")
389
-
390
- assert_equal 33, Class.new.live_ast_original_instance_eval("args")
391
- assert_equal 33, Class.new.instance_eval("args")
392
- end
393
-
394
- def test_location_without_binding
395
- expected = ["(eval)", 2]
396
-
397
- assert_equal expected, live_ast_original_eval("\n[__FILE__, __LINE__]")
398
-
399
- unfixable do
400
- assert_equal expected, eval("\n[__FILE__, __LINE__]")
401
- end
402
-
403
- file, line = eval("\n[__FILE__, __LINE__]")
404
- file = LiveAST.strip_token file
405
-
406
- assert_equal expected, [file, line]
407
- end
408
-
409
- DEFINE_BO_TEST = lambda do
410
- class BasicObject
411
- Kernel.eval("1 + 1")
412
- end
413
- end
414
-
415
- def test_basic_object
416
- ::BasicObject.new.instance_eval %{
417
- t = 33
418
- ::FullReplaceEvalTest::RESULT[:bo_test] = t + 44
419
- }
420
- assert_equal 77, RESULT[:bo_test]
421
- end
422
-
423
- class Z
424
- def initialize
425
- @t = 99
426
- end
427
- end
428
-
429
- def test_instance_variables
430
- assert_equal 99, Z.new.instance_eval { @t }
431
- assert_equal 99, Z.new.instance_eval("@t")
432
- end
433
- end
data/test/irb_test.rb DELETED
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
- require "live_ast/irb_spy"
5
-
6
- class IRBTest < RegularTest
7
- def with_module(parent, child)
8
- parent.const_set child, Module.new
9
- begin
10
- yield
11
- ensure
12
- parent.send :remove_const, child
13
- end
14
- end
15
-
16
- def setup
17
- LiveAST::IRBSpy.history = [
18
- nil,
19
- "class Foo; def bar; 'bar'; end; end",
20
- "class Bar",
21
- " def foo",
22
- " 'foo'",
23
- " end",
24
- "end"
25
- ]
26
- end
27
-
28
- def test_single_line
29
- with_module(Object, :IRB) do
30
- expected = no_arg_def(:bar, "bar")
31
- result = LiveAST::Linker.fetch_from_cache("(irb)", 1)
32
- assert_equal expected, result
33
- end
34
- end
35
-
36
- def test_multiple_lines
37
- with_module(Object, :IRB) do
38
- expected = no_arg_def(:foo, "foo")
39
- result = LiveAST::Linker.fetch_from_cache("(irb)", 3)
40
- assert_equal expected, result
41
- end
42
- end
43
- end
data/test/lambda_test.rb DELETED
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class LambdaTest < RegularTest
6
- def test_block_braces_multiline
7
- block = return_block { |x, y|
8
- x + y
9
- }
10
-
11
- expected = binop_block(:return_block, :+)
12
- assert_equal expected, block.to_ast
13
- end
14
-
15
- def test_block_do_end_multiline
16
- block = return_block do |x, y|
17
- x * y
18
- end
19
-
20
- expected = binop_block(:return_block, :*)
21
- assert_equal expected, block.to_ast
22
- end
23
-
24
- def test_lambda
25
- a = lambda { |x, y| x - y }
26
-
27
- expected = binop_block(:lambda, :-)
28
- assert_equal expected, a.to_ast
29
- end
30
-
31
- def test_stabby_lambda
32
- a = ->(x, y) { x - y }
33
-
34
- expected = binop_lambda(:-)
35
- assert_equal expected, a.to_ast
36
- end
37
-
38
- def test_proc
39
- a = proc { |x, y| x / y }
40
-
41
- expected = binop_block(:proc, :/)
42
- assert_equal expected, a.to_ast
43
- end
44
-
45
- def test_proc_new
46
- a = Proc.new { |x, y| x + y }
47
-
48
- expected = binop_proc_new(:+)
49
- assert_equal expected, a.to_ast
50
- end
51
-
52
- def test_block_braces_one_line
53
- block = return_block { |x, y| x * y }
54
-
55
- expected = binop_block(:return_block, :*)
56
- assert_equal expected, block.to_ast
57
- end
58
-
59
- def test_block_do_end_one_line
60
- block = return_block do |x, y| x - y end
61
-
62
- expected = binop_block(:return_block, :-)
63
- assert_equal expected, block.to_ast
64
- end
65
- end
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class LoadPathTest < BaseTest
6
- include FileUtils
7
-
8
- def test_load_path
9
- $LOAD_PATH.unshift DATA_DIR
10
- begin
11
- check_load
12
- check_errors
13
- temp_file nil, "foo.rb" do
14
- Dir.chdir(DATA_DIR) do
15
- compare_load_errors("/foo.rb")
16
- end
17
- end
18
- ensure
19
- $LOAD_PATH.shift
20
- end
21
- end
22
-
23
- def test_chdir
24
- Dir.chdir(DATA_DIR) do
25
- check_load
26
- check_errors
27
- end
28
- end
29
-
30
- def check_load
31
- code1 = %{
32
- def hello
33
- "password"
34
- end
35
- }
36
-
37
- code2 = %{
38
- def goodbye
39
- "bubbleboy"
40
- end
41
- }
42
-
43
- temp_file code1, "foo.rb" do |path|
44
- load "foo.rb"
45
- assert_equal "password", hello
46
-
47
- write_file path, code2
48
-
49
- LiveAST.load "foo.rb"
50
- assert_equal "bubbleboy", goodbye
51
- end
52
- ensure
53
- Object.send(:remove_method, :hello)
54
- Object.send(:remove_method, :goodbye)
55
- end
56
-
57
- def compare_load_errors(file)
58
- error = assert_raises LoadError do
59
- LiveAST.load file
60
- end
61
- assert_equal "cannot load such file -- #{file}", error.message
62
- end
63
-
64
- def check_errors
65
- temp_file "# do nothing", "foo.rb" do |_path|
66
- [
67
- "foo",
68
- "",
69
- "/usr",
70
- ".",
71
- ".."
72
- ].each do |file|
73
- compare_load_errors(file)
74
- end
75
- end
76
- end
77
- end