mvz-live_ast 1.1.1 → 1.1.2

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +14 -0
  3. data/Rakefile +48 -9
  4. data/devel/levitate.rb +5 -674
  5. data/lib/live_ast/common.rb +22 -21
  6. data/lib/live_ast/error.rb +2 -2
  7. data/lib/live_ast/irb_spy.rb +4 -6
  8. data/lib/live_ast/linker.rb +7 -7
  9. data/lib/live_ast/loader.rb +6 -6
  10. data/lib/live_ast/reader.rb +2 -2
  11. data/lib/live_ast/replace_eval.rb +27 -31
  12. data/lib/live_ast/replace_load.rb +1 -1
  13. data/lib/live_ast/ruby_parser.rb +24 -22
  14. data/lib/live_ast/ruby_parser/test.rb +183 -179
  15. data/lib/live_ast/ruby_parser/unparser.rb +10 -6
  16. data/lib/live_ast/to_ast.rb +1 -1
  17. data/lib/live_ast/version.rb +1 -1
  18. data/test/ast_eval/ast_eval_test.rb +11 -0
  19. data/test/ast_load/ast_load_test.rb +45 -0
  20. data/test/backtrace_test.rb +29 -28
  21. data/test/{noninvasive_test.rb → base/noninvasive_test.rb} +7 -5
  22. data/test/base/reload_test.rb +41 -0
  23. data/test/covert_define_method_test.rb +1 -1
  24. data/test/define_method_test.rb +5 -5
  25. data/test/encoding_test.rb +5 -5
  26. data/test/error_test.rb +6 -6
  27. data/test/eval_test.rb +7 -7
  28. data/test/flush_cache_test.rb +6 -6
  29. data/test/full/ast_reload_test.rb +39 -0
  30. data/test/{replace_eval_test.rb → full/replace_eval_test.rb} +31 -12
  31. data/test/irb_test.rb +1 -1
  32. data/test/lambda_test.rb +7 -0
  33. data/test/load_path_test.rb +12 -12
  34. data/test/load_test.rb +35 -35
  35. data/test/main.rb +19 -27
  36. data/test/nested_test.rb +1 -1
  37. data/test/readme_test.rb +1 -3
  38. data/test/recursive_eval_test.rb +2 -3
  39. data/test/redefine_method_test.rb +2 -2
  40. data/test/rubygems_test.rb +1 -1
  41. data/test/rubyspec_test.rb +3 -3
  42. data/test/stdlib_test.rb +1 -1
  43. data/test/thread_test.rb +1 -2
  44. data/test/to_ast/to_ast_feature_test.rb +11 -0
  45. data/test/to_ruby/to_ruby_feature_test.rb +11 -0
  46. data/test/{to_ruby_test.rb → to_ruby/to_ruby_test.rb} +2 -2
  47. metadata +93 -91
  48. data/test/ast_eval_feature_test.rb +0 -11
  49. data/test/ast_load_feature_test.rb +0 -11
  50. data/test/reload_test.rb +0 -105
  51. data/test/to_ast_feature_test.rb +0 -15
  52. data/test/to_ruby_feature_test.rb +0 -15
@@ -15,8 +15,8 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
15
15
 
16
16
  def uncached_method_from_require
17
17
  klass = Class.new do
18
- def f ; end
19
- def g ; end
18
+ def f; end
19
+ def g; end
20
20
  end
21
21
 
22
22
  LiveAST.flush_cache
@@ -66,8 +66,8 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
66
66
 
67
67
  def lost_method_from_require
68
68
  klass = Class.new do
69
- def f ; end
70
- def g ; end
69
+ def f; end
70
+ def g; end
71
71
  end
72
72
 
73
73
  # check that previous flushing did not cause side effect
@@ -83,14 +83,14 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
83
83
  lambda { "bbb" },
84
84
  ]
85
85
  }, binding
86
-
86
+
87
87
  a_ast = a.to_ast
88
88
  assert_equal no_arg_block(:lambda, "aaa"), a_ast
89
89
 
90
90
  LiveAST.flush_cache
91
91
 
92
92
  assert_equal a_ast.object_id, a.to_ast.object_id
93
-
93
+
94
94
  assert_raises LiveAST::ASTNotFoundError do
95
95
  b.to_ast
96
96
  end
@@ -0,0 +1,39 @@
1
+ require 'main'
2
+
3
+ class ASTReloadTest < ReplaceEvalTest
4
+ include FileUtils
5
+
6
+ def test_reloading
7
+ ast_reload
8
+ end
9
+
10
+ def ast_reload
11
+ code_1 = %{
12
+ class ASTReloadTest::C
13
+ def f
14
+ "first C#f"
15
+ end
16
+ end
17
+ }
18
+
19
+ code_2 = %{
20
+ class ASTReloadTest::C
21
+ def f
22
+ "second C#f"
23
+ end
24
+ end
25
+ }
26
+
27
+ temp_file code_1 do |file|
28
+ load file
29
+
30
+ LiveAST.ast(C.instance_method(:f))
31
+
32
+ write_file file, code_2
33
+ load file
34
+
35
+ assert_equal no_arg_def(:f, "second C#f"),
36
+ LiveAST.ast(C.instance_method(:f))
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
- require_relative 'main'
1
+ require 'main'
2
2
 
3
- class ZZY_ReplaceEvalTest < ReplaceEvalTest
3
+ class FullReplaceEvalTest < ReplaceEvalTest
4
4
  RESULT = {}
5
5
 
6
6
  def setup
@@ -34,7 +34,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
34
34
 
35
35
  def test_def_class
36
36
  DEFINE_B.call
37
- assert_equal "ZZY_ReplaceEvalTest::B", B.name
37
+ assert_equal "FullReplaceEvalTest::B", B.name
38
38
  assert_equal binop_def(:f, :/), B.instance_method(:f).to_ast
39
39
  end
40
40
 
@@ -94,7 +94,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
94
94
  }
95
95
  end
96
96
  end
97
-
97
+
98
98
  module S
99
99
  class T
100
100
  eval %{
@@ -105,7 +105,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
105
105
  end
106
106
  end
107
107
  end
108
-
108
+
109
109
  def test_const_lookup_3
110
110
  DEFINE_QS.call
111
111
  Q::R.new.f
@@ -157,7 +157,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
157
157
  end
158
158
  assert_equal orig.message, live.message
159
159
 
160
- [[nil], [Object.new], [3], [4,3,2], (1..10).to_a].each do |args|
160
+ [[nil], [Object.new], [3], [4, 3, 2], (1..10).to_a].each do |args|
161
161
  orig = assert_raises ArgumentError, TypeError do
162
162
  Object.new.live_ast_original_instance_eval(*args)
163
163
  end
@@ -169,12 +169,31 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
169
169
  end
170
170
  end
171
171
 
172
+ describe "instance_eval argument errors" do
173
+ before do
174
+ require 'live_ast/full'
175
+ end
176
+
177
+ let(:orig) { assert_raises(ArgumentError, TypeError) {
178
+ Object.new.live_ast_original_instance_eval(*args) } }
179
+ let(:live) { assert_raises(ArgumentError, TypeError) {
180
+ Object.new.instance_eval(*args) } }
181
+
182
+ describe "when the second argument is nil" do
183
+ let(:args) { ['1', nil] }
184
+ it "raises the same error as the original" do
185
+ assert_equal orig.message, live.message
186
+ assert_equal orig.class, live.class
187
+ end
188
+ end
189
+ end
190
+
172
191
  def test_instance_eval_arg_error_with_block
173
192
  orig = assert_raises ArgumentError do
174
- Object.new.live_ast_original_instance_eval(3,4,5) { }
193
+ Object.new.live_ast_original_instance_eval(3, 4, 5) {}
175
194
  end
176
195
  live = assert_raises ArgumentError do
177
- Object.new.instance_eval(3,4,5) { }
196
+ Object.new.instance_eval(3, 4, 5) {}
178
197
  end
179
198
  assert_equal orig.message, live.message
180
199
  end
@@ -223,7 +242,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
223
242
  self[:g] = lambda { "g" }
224
243
  }
225
244
  assert_equal y, live[:y]
226
-
245
+
227
246
  assert_equal no_arg_block(:lambda, "g"), live[:g].to_ast
228
247
  end
229
248
 
@@ -309,7 +328,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
309
328
  unfixable do
310
329
  assert_equal orig, live
311
330
  end
312
-
331
+
313
332
  live.first.sub!(/#{Regexp.quote LiveAST::Linker::REVISION_TOKEN}.*\Z/, "")
314
333
  assert_equal orig, live
315
334
  assert_equal ["test", 102], live
@@ -388,7 +407,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
388
407
  def test_basic_object
389
408
  ::BasicObject.new.instance_eval %{
390
409
  t = 33
391
- ::ZZY_ReplaceEvalTest::RESULT[:bo_test] = t + 44
410
+ ::FullReplaceEvalTest::RESULT[:bo_test] = t + 44
392
411
  }
393
412
  assert_equal 77, RESULT[:bo_test]
394
413
  end
@@ -400,7 +419,7 @@ class ZZY_ReplaceEvalTest < ReplaceEvalTest
400
419
  end
401
420
 
402
421
  def test_instance_variables
403
- assert_equal 99, Z.new.instance_eval{ @t }
422
+ assert_equal 99, Z.new.instance_eval { @t }
404
423
  assert_equal 99, Z.new.instance_eval("@t")
405
424
  end
406
425
  end
data/test/irb_test.rb CHANGED
@@ -14,7 +14,7 @@ class IRBTest < RegularTest
14
14
  with_module(Object, :IRB) do
15
15
  with_module(LiveAST, :IRBSpy) do
16
16
  LiveAST::IRBSpy.class_eval do
17
- def self.code_at(line)
17
+ def self.code_at(_line)
18
18
  "def f ; end"
19
19
  end
20
20
  end
data/test/lambda_test.rb CHANGED
@@ -26,6 +26,13 @@ class LambdaTest < RegularTest
26
26
  assert_equal expected, a.to_ast
27
27
  end
28
28
 
29
+ def test_stabby_lambda
30
+ a = ->(x, y) { x - y }
31
+
32
+ expected = binop_block(:lambda, :-)
33
+ assert_equal expected, a.to_ast
34
+ end
35
+
29
36
  def test_proc
30
37
  a = proc { |x, y| x / y }
31
38
 
@@ -1,8 +1,8 @@
1
1
  require_relative 'main'
2
2
 
3
- class AAA_LoadPathTest < BaseTest
3
+ class LoadPathTest < BaseTest
4
4
  include FileUtils
5
-
5
+
6
6
  def test_load_path
7
7
  $LOAD_PATH.unshift DATA_DIR
8
8
  begin
@@ -17,9 +17,9 @@ class AAA_LoadPathTest < BaseTest
17
17
  $LOAD_PATH.shift
18
18
  end
19
19
  end
20
-
20
+
21
21
  def test_chdir
22
- mkdir DATA_DIR, :verbose => false rescue nil
22
+ mkdir DATA_DIR, verbose: false rescue nil
23
23
  Dir.chdir(DATA_DIR) do
24
24
  check_load
25
25
  check_errors
@@ -43,9 +43,9 @@ class AAA_LoadPathTest < BaseTest
43
43
  Object.send(:remove_method, :hello) rescue nil
44
44
  load "foo.rb"
45
45
  assert_equal "password", hello
46
-
46
+
47
47
  write_file path, code_2
48
-
48
+
49
49
  Object.send(:remove_method, :goodbye) rescue nil
50
50
  LiveAST.load "foo.rb"
51
51
  assert_equal "bubbleboy", goodbye
@@ -63,13 +63,13 @@ class AAA_LoadPathTest < BaseTest
63
63
  end
64
64
 
65
65
  def check_errors
66
- temp_file "# do nothing", "foo.rb" do |path|
66
+ temp_file "# do nothing", "foo.rb" do |_path|
67
67
  [
68
- "foo",
69
- "",
70
- "/usr",
71
- ".",
72
- "..",
68
+ "foo",
69
+ "",
70
+ "/usr",
71
+ ".",
72
+ "..",
73
73
  ].each do |file|
74
74
  compare_load_errors(file)
75
75
  end
data/test/load_test.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  require_relative 'main'
2
2
  require_relative '../devel/levitate'
3
3
 
4
- class AAA_LoadFileTest < BaseTest
4
+ class LoadFileTest < BaseTest
5
5
  class << self
6
6
  attr_accessor :flag
7
7
  end
8
8
 
9
9
  def test_a_no_locals_created
10
10
  code = %{
11
- AAA_LoadFileTest.flag = :code_a
11
+ LoadFileTest.flag = :code_a
12
12
  FOO = 77
13
13
  x = 33
14
14
  y = 99
@@ -17,8 +17,8 @@ class AAA_LoadFileTest < BaseTest
17
17
  temp_file code do |file|
18
18
  ret = LiveAST.load file
19
19
  assert_equal true, ret
20
- assert_equal :code_a, AAA_LoadFileTest.flag
21
-
20
+ assert_equal :code_a, LoadFileTest.flag
21
+
22
22
  assert_raises NameError do
23
23
  eval("x", TOPLEVEL_BINDING)
24
24
  end
@@ -29,33 +29,33 @@ class AAA_LoadFileTest < BaseTest
29
29
 
30
30
  def test_b_no_locals_modified
31
31
  code = %{
32
- AAA_LoadFileTest.flag = :code_b
32
+ LoadFileTest.flag = :code_b
33
33
  r = 55
34
34
  }
35
35
 
36
36
  temp_file code do |file|
37
37
  eval("r = 66", TOPLEVEL_BINDING)
38
-
38
+
39
39
  ret = LiveAST.load file
40
40
  assert_equal true, ret
41
- assert_equal :code_b, AAA_LoadFileTest.flag
42
-
41
+ assert_equal :code_b, LoadFileTest.flag
42
+
43
43
  actual = eval("r", TOPLEVEL_BINDING)
44
44
  assert_equal 66, actual
45
45
  end
46
46
  end
47
-
47
+
48
48
  def test_c_wrap
49
49
  code = %{
50
- AAA_LoadFileTest.flag = :code_c
50
+ LoadFileTest.flag = :code_c
51
51
  ZOOM = 111
52
52
  }
53
53
 
54
54
  temp_file code do |file|
55
55
  ret = LiveAST.load file, true
56
56
  assert_equal true, ret
57
- assert_equal :code_c, AAA_LoadFileTest.flag
58
-
57
+ assert_equal :code_c, LoadFileTest.flag
58
+
59
59
  assert_raises NameError do
60
60
  ZOOM
61
61
  end
@@ -68,12 +68,12 @@ class AAA_LoadFileTest < BaseTest
68
68
 
69
69
  def test_d_empty_locals_list
70
70
  code = %{
71
- AAA_LoadFileTest.from_d
71
+ LoadFileTest.from_d
72
72
  }
73
-
73
+
74
74
  temp_file code do |file|
75
75
  LiveAST.load file
76
- assert_equal :code_d, AAA_LoadFileTest.flag
76
+ assert_equal :code_d, LoadFileTest.flag
77
77
  end
78
78
  end
79
79
 
@@ -81,27 +81,27 @@ class AAA_LoadFileTest < BaseTest
81
81
  lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
82
82
 
83
83
  [
84
- # respects a loaded file setting $VERBOSE = true
85
- [
86
- "false",
87
- "true",
88
- lambda { |file|
89
- Levitate.run file
90
- }
91
- ],
92
-
93
- # unfixable: does not respect a loaded file setting $VERBOSE = nil
94
- [
95
- "true",
96
- "false",
97
- lambda { |file|
98
- unfixable do
99
- assert_nothing_raised do
100
- Levitate.run file
84
+ # respects a loaded file setting $VERBOSE = true
85
+ [
86
+ "false",
87
+ "true",
88
+ lambda { |file|
89
+ Levitate.run file
90
+ }
91
+ ],
92
+
93
+ # unfixable: does not respect a loaded file setting $VERBOSE = nil
94
+ [
95
+ "true",
96
+ "false",
97
+ lambda { |file|
98
+ unfixable do
99
+ assert_nothing_raised do
100
+ Levitate.run file
101
+ end
101
102
  end
102
- end
103
- }
104
- ]
103
+ }
104
+ ]
105
105
  ].each do |main_value, loaded_value, action|
106
106
  loaded_code = %{
107
107
  $VERBOSE = #{loaded_value}
data/test/main.rb CHANGED
@@ -5,7 +5,6 @@ require 'pp'
5
5
  require 'find'
6
6
  require 'fileutils'
7
7
 
8
- require 'minitest/unit'
9
8
  require 'minitest/mock'
10
9
  require 'minitest/autorun'
11
10
 
@@ -19,10 +18,10 @@ def define_unsorted_test_case(name, superclass, &block)
19
18
  Object.const_set "#{letter}#{name}", klass
20
19
  end
21
20
 
22
- class JLMiniTest < MiniTest::Unit::TestCase
21
+ class JLMiniTest < MiniTest::Test
23
22
  def self.test_methods
24
23
  default = super
25
- onlies = default.select { |m| m =~ %r!__only\Z! }
24
+ onlies = default.select { |m| m =~ /__only\Z/ }
26
25
  if onlies.empty?
27
26
  default
28
27
  else
@@ -32,7 +31,7 @@ class JLMiniTest < MiniTest::Unit::TestCase
32
31
  end
33
32
 
34
33
  def delim(char)
35
- "\n" << (char*72) << "\n"
34
+ "\n" << (char * 72) << "\n"
36
35
  end
37
36
 
38
37
  def mu_pp(obj)
@@ -42,11 +41,9 @@ class JLMiniTest < MiniTest::Unit::TestCase
42
41
  end
43
42
 
44
43
  def unfixable
45
- begin
46
- yield
47
- raise "claimed to be unfixable, but assertion succeeded"
48
- rescue MiniTest::Assertion
49
- end
44
+ yield
45
+ raise "claimed to be unfixable, but assertion succeeded"
46
+ rescue MiniTest::Assertion
50
47
  end
51
48
 
52
49
  def assert_nothing_raised
@@ -54,13 +51,13 @@ class JLMiniTest < MiniTest::Unit::TestCase
54
51
  assert_nil nil
55
52
  rescue => ex
56
53
  raise MiniTest::Assertion,
57
- exception_details(ex, "Expected nothing raised, but got:")
54
+ exception_details(ex, "Expected nothing raised, but got:")
58
55
  end
59
56
 
60
- %w[
57
+ %w(
61
58
  empty equal in_delta in_epsilon includes instance_of
62
59
  kind_of match nil operator respond_to same
63
- ].each { |name|
60
+ ).each { |name|
64
61
  alias_method "assert_not_#{name}", "refute_#{name}"
65
62
  }
66
63
  end
@@ -97,14 +94,12 @@ class BaseTest < JLMiniTest
97
94
  end
98
95
 
99
96
  def exception_backtrace
100
- begin
101
- yield
102
- rescue Exception => e
103
- e.backtrace
104
- end
97
+ yield
98
+ rescue Exception => e
99
+ e.backtrace
105
100
  end
106
101
 
107
- def ignore(*args)
102
+ def ignore(*_args)
108
103
  end
109
104
  end
110
105
 
@@ -122,18 +117,15 @@ class ReplaceEvalTest < BaseTest
122
117
  require 'live_ast/full'
123
118
  true
124
119
  rescue LoadError
125
- if RUBY_ENGINE == "ruby"
126
- raise "need: gem install boc"
127
- end
120
+ raise "need: gem install binding_of_caller" if RUBY_ENGINE == "ruby"
128
121
  false
129
122
  end
130
123
 
131
- unless ok
132
- self.class.class_eval do
133
- instance_methods(false).each do |m|
134
- remove_method(m)
135
- define_method(m) { }
136
- end
124
+ return if ok
125
+ self.class.class_eval do
126
+ instance_methods(false).each do |m|
127
+ remove_method(m)
128
+ define_method(m) {}
137
129
  end
138
130
  end
139
131
  end