mvz-live_ast 2.0.0 → 2.1.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +9 -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 +85 -120
  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