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.
- checksums.yaml +4 -4
- data/CHANGES.rdoc +9 -0
- data/README.rdoc +14 -0
- data/lib/live_ast/base.rb +7 -9
- data/lib/live_ast/irb_spy.rb +1 -1
- data/lib/live_ast/replace_caller.rb +14 -0
- data/lib/live_ast/version.rb +1 -1
- metadata +85 -120
- data/Rakefile +0 -62
- data/devel/levitate.rb +0 -184
- data/devel/levitate_config.rb +0 -4
- data/test/alias_test.rb +0 -25
- data/test/ast_eval/ast_eval_test.rb +0 -13
- data/test/ast_load/ast_load_test.rb +0 -47
- data/test/attr_test.rb +0 -26
- data/test/backtrace_test.rb +0 -161
- data/test/base/noninvasive_test.rb +0 -55
- data/test/base/reload_test.rb +0 -43
- data/test/covert_define_method_test.rb +0 -25
- data/test/def_test.rb +0 -37
- data/test/define_method_test.rb +0 -69
- data/test/define_singleton_method_test.rb +0 -17
- data/test/encoding_test/bad.rb +0 -1
- data/test/encoding_test/cp932.rb +0 -6
- data/test/encoding_test/default.rb +0 -5
- data/test/encoding_test/eucjp.rb +0 -6
- data/test/encoding_test/koi8.rb +0 -6
- data/test/encoding_test/koi8_shebang.rb +0 -7
- data/test/encoding_test/koi8_with_utf8bom.rb +0 -6
- data/test/encoding_test/usascii.rb +0 -6
- data/test/encoding_test/usascii_with_utf8bom.rb +0 -6
- data/test/encoding_test/utf8.rb +0 -6
- data/test/encoding_test/utf8bom.rb +0 -6
- data/test/encoding_test/utf8bom_only.rb +0 -5
- data/test/encoding_test/utf8dos.rb +0 -6
- data/test/encoding_test/utf8mac.rb +0 -6
- data/test/encoding_test/utf8mac_alt.rb +0 -6
- data/test/encoding_test/utf8unix.rb +0 -6
- data/test/encoding_test.rb +0 -54
- data/test/error_test.rb +0 -118
- data/test/eval_test.rb +0 -271
- data/test/flush_cache_test.rb +0 -102
- data/test/full/ast_reload_test.rb +0 -41
- data/test/full/replace_eval_test.rb +0 -433
- data/test/irb_test.rb +0 -43
- data/test/lambda_test.rb +0 -65
- data/test/load_path_test.rb +0 -77
- data/test/load_test.rb +0 -125
- data/test/main.rb +0 -134
- data/test/nested_test.rb +0 -31
- data/test/readme_test.rb +0 -16
- data/test/recursive_eval_test.rb +0 -53
- data/test/redefine_method_test.rb +0 -85
- data/test/rubygems_test.rb +0 -27
- data/test/rubyspec_test.rb +0 -39
- data/test/singleton_test.rb +0 -27
- data/test/stdlib_test.rb +0 -15
- data/test/thread_test.rb +0 -45
- data/test/to_ast/to_ast_feature_test.rb +0 -13
- data/test/to_ruby/to_ruby_feature_test.rb +0 -13
- data/test/to_ruby/to_ruby_test.rb +0 -101
data/test/alias_test.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class AliasTest < RegularTest
|
6
|
-
class A
|
7
|
-
def f
|
8
|
-
"A#f"
|
9
|
-
end
|
10
|
-
|
11
|
-
alias g f
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_alias_unbound_method
|
15
|
-
expected = no_arg_def(:f, "A#f")
|
16
|
-
assert_equal expected, A.instance_method(:f).to_ast
|
17
|
-
assert_equal expected, A.instance_method(:g).to_ast
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_alias_method
|
21
|
-
expected = no_arg_def(:f, "A#f")
|
22
|
-
assert_equal expected, A.new.method(:f).to_ast
|
23
|
-
assert_equal expected, A.new.method(:g).to_ast
|
24
|
-
end
|
25
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "main"
|
4
|
-
|
5
|
-
require "live_ast/ast_load"
|
6
|
-
|
7
|
-
class AstLoadTest < BaseTest
|
8
|
-
include FileUtils
|
9
|
-
|
10
|
-
def test_defines_ast_load
|
11
|
-
assert private_methods.include?(:ast_load)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_reloading
|
15
|
-
noninvasive_ast_reload
|
16
|
-
end
|
17
|
-
|
18
|
-
def noninvasive_ast_reload
|
19
|
-
code1 = %{
|
20
|
-
class AstLoadTest::B
|
21
|
-
def f
|
22
|
-
"first B#f"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
}
|
26
|
-
|
27
|
-
code2 = %{
|
28
|
-
class AstLoadTest::B
|
29
|
-
def f
|
30
|
-
"second B#f"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
}
|
34
|
-
|
35
|
-
temp_file code1 do |file|
|
36
|
-
load file
|
37
|
-
|
38
|
-
LiveAST.ast(B.instance_method(:f))
|
39
|
-
|
40
|
-
write_file file, code2
|
41
|
-
ast_load file
|
42
|
-
|
43
|
-
assert_equal no_arg_def(:f, "second B#f"),
|
44
|
-
LiveAST.ast(B.instance_method(:f))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/test/attr_test.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class AttrTest < RegularTest
|
6
|
-
class A
|
7
|
-
attr_accessor :f
|
8
|
-
attr_reader :g
|
9
|
-
attr_writer :h
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_attr
|
13
|
-
assert_raises LiveAST::ASTNotFoundError do
|
14
|
-
A.instance_method(:f).to_ast
|
15
|
-
end
|
16
|
-
assert_raises LiveAST::ASTNotFoundError do
|
17
|
-
A.instance_method(:f=).to_ast
|
18
|
-
end
|
19
|
-
assert_raises LiveAST::ASTNotFoundError do
|
20
|
-
A.instance_method(:g).to_ast
|
21
|
-
end
|
22
|
-
assert_raises LiveAST::ASTNotFoundError do
|
23
|
-
A.instance_method(:h=).to_ast
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/test/backtrace_test.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
# test for raise redefinition side-effects: unsort this TestCase from
|
6
|
-
# other TestCases.
|
7
|
-
|
8
|
-
define_unsorted_test_case "BacktraceTest", RegularTest do
|
9
|
-
def test_raise_in_eval
|
10
|
-
3.times do
|
11
|
-
orig = exception_backtrace do
|
12
|
-
eval %{
|
13
|
-
|
14
|
-
raise
|
15
|
-
|
16
|
-
|
17
|
-
}, binding, "somewhere", 1000
|
18
|
-
end
|
19
|
-
|
20
|
-
live = exception_backtrace do
|
21
|
-
ast_eval %{
|
22
|
-
|
23
|
-
raise
|
24
|
-
|
25
|
-
|
26
|
-
}, binding, "somewhere", 1000
|
27
|
-
end
|
28
|
-
|
29
|
-
assert_equal orig.first, live.first
|
30
|
-
assert_match(/somewhere:1002/, live.first)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_raise_no_overrides
|
35
|
-
3.times do
|
36
|
-
orig = exception_backtrace do
|
37
|
-
eval %{
|
38
|
-
|
39
|
-
|
40
|
-
raise
|
41
|
-
|
42
|
-
}, binding, __FILE__, (__LINE__ + 9)
|
43
|
-
end
|
44
|
-
|
45
|
-
live = exception_backtrace do
|
46
|
-
ast_eval %{
|
47
|
-
|
48
|
-
|
49
|
-
raise
|
50
|
-
|
51
|
-
}, binding
|
52
|
-
end
|
53
|
-
|
54
|
-
assert_equal orig.first, live.first
|
55
|
-
here = Regexp.quote __FILE__
|
56
|
-
assert_match(/#{here}/, live.first)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_raise_using_overrides
|
61
|
-
3.times do
|
62
|
-
orig = exception_backtrace do
|
63
|
-
eval %{
|
64
|
-
|
65
|
-
|
66
|
-
raise
|
67
|
-
|
68
|
-
}, binding, __FILE__, (__LINE__ + 9)
|
69
|
-
end
|
70
|
-
|
71
|
-
live = exception_backtrace do
|
72
|
-
ast_eval %{
|
73
|
-
|
74
|
-
|
75
|
-
raise
|
76
|
-
|
77
|
-
}, binding, __FILE__, __LINE__
|
78
|
-
end
|
79
|
-
|
80
|
-
assert_equal orig.first, live.first
|
81
|
-
here = Regexp.quote __FILE__
|
82
|
-
assert_match(/#{here}/, live.first)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_raise_using_only_file_override
|
87
|
-
3.times do
|
88
|
-
orig = exception_backtrace do
|
89
|
-
eval %{
|
90
|
-
|
91
|
-
|
92
|
-
raise
|
93
|
-
|
94
|
-
}, binding, __FILE__
|
95
|
-
end
|
96
|
-
|
97
|
-
live = exception_backtrace do
|
98
|
-
ast_eval %{
|
99
|
-
|
100
|
-
|
101
|
-
raise
|
102
|
-
|
103
|
-
}, binding, __FILE__
|
104
|
-
end
|
105
|
-
|
106
|
-
assert_equal orig.first, live.first
|
107
|
-
here = Regexp.quote __FILE__
|
108
|
-
assert_match(/#{here}/, live.first)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def test_raise_after_eval
|
113
|
-
raise_after_eval("raise", false)
|
114
|
-
raise_after_eval("1/0", false)
|
115
|
-
|
116
|
-
require "live_ast/replace_raise"
|
117
|
-
|
118
|
-
raise_after_eval("raise", true)
|
119
|
-
raise_after_eval("1/0", false)
|
120
|
-
end
|
121
|
-
|
122
|
-
def raise_after_eval(code, will_succeed)
|
123
|
-
3.times do
|
124
|
-
orig = eval %{
|
125
|
-
|
126
|
-
lambda { #{code} } # lambda { foo }
|
127
|
-
|
128
|
-
|
129
|
-
}, binding, "somewhere", 1000
|
130
|
-
|
131
|
-
live = ast_eval %{
|
132
|
-
|
133
|
-
lambda { #{code} } # lambda { foo }
|
134
|
-
|
135
|
-
|
136
|
-
}, binding, "somewhere", 1000
|
137
|
-
|
138
|
-
orig_top = exception_backtrace { orig.call }.first
|
139
|
-
live_top = exception_backtrace { live.call }.first
|
140
|
-
|
141
|
-
assert_equal orig_top, LiveAST.strip_token(live_top)
|
142
|
-
|
143
|
-
if will_succeed
|
144
|
-
assert_equal orig_top, live_top
|
145
|
-
assert_match(/somewhere:1002/, live_top)
|
146
|
-
else
|
147
|
-
assert_not_equal orig_top, live_top
|
148
|
-
assert_match(/somewhere.*?:1002/, live_top)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def test_tokens_stripped
|
154
|
-
lines = exception_backtrace do
|
155
|
-
ast_eval %{ ast_eval ' ast_eval "raise", binding ', binding }, binding
|
156
|
-
end
|
157
|
-
lines.each do |line|
|
158
|
-
assert_nil line.index(LiveAST::Linker::REVISION_TOKEN)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "main"
|
4
|
-
|
5
|
-
class NoninvasiveTest < BaseTest
|
6
|
-
def test_no_clutter
|
7
|
-
[Method, UnboundMethod, Proc].each do |klass|
|
8
|
-
assert !klass.instance_methods.include?(:to_ast)
|
9
|
-
assert !klass.instance_methods.include?(:to_ruby)
|
10
|
-
end
|
11
|
-
|
12
|
-
assert !respond_to?(:ast_eval)
|
13
|
-
assert !private_methods.include?(:ast_eval)
|
14
|
-
assert !Kernel.respond_to?(:ast_eval)
|
15
|
-
assert !respond_to?(:ast_load)
|
16
|
-
assert !private_methods.include?(:ast_load)
|
17
|
-
assert !Kernel.respond_to?(:ast_load)
|
18
|
-
end
|
19
|
-
|
20
|
-
DEFINE_A = lambda do
|
21
|
-
class A
|
22
|
-
def f
|
23
|
-
"A#f"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_method
|
29
|
-
DEFINE_A.call
|
30
|
-
|
31
|
-
expected = no_arg_def(:f, "A#f")
|
32
|
-
assert_equal expected, LiveAST.ast(A.instance_method(:f))
|
33
|
-
assert_equal expected, LiveAST.ast(A.new.method(:f))
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_lambda
|
37
|
-
a = lambda { |x, y| x**y }
|
38
|
-
|
39
|
-
assert_equal binop_block(:lambda, :**), LiveAST.ast(a)
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_ast_eval
|
43
|
-
code = %{ lambda { |x, y| x / y } }
|
44
|
-
|
45
|
-
expected = binop_block(:lambda, :/)
|
46
|
-
result = LiveAST.ast(LiveAST.eval(code, binding))
|
47
|
-
assert_equal expected, result
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_bogus
|
51
|
-
assert_raises TypeError do
|
52
|
-
LiveAST.ast(99)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/test/base/reload_test.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "main"
|
4
|
-
|
5
|
-
class ReloadTest < BaseTest
|
6
|
-
include FileUtils
|
7
|
-
|
8
|
-
def test_reloading
|
9
|
-
raw_reload
|
10
|
-
end
|
11
|
-
|
12
|
-
def raw_reload
|
13
|
-
code1 = %{
|
14
|
-
class ReloadTest::A
|
15
|
-
def f
|
16
|
-
"first A#f"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
}
|
20
|
-
|
21
|
-
code2 = %{
|
22
|
-
class ReloadTest::A
|
23
|
-
def f
|
24
|
-
"second A#f"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
}
|
28
|
-
|
29
|
-
temp_file code1 do |file|
|
30
|
-
load file
|
31
|
-
|
32
|
-
LiveAST.ast(A.instance_method(:f))
|
33
|
-
|
34
|
-
write_file file, code2
|
35
|
-
load file
|
36
|
-
|
37
|
-
# forced a raw-reload inconsistency -- verify bogus
|
38
|
-
|
39
|
-
assert_equal no_arg_def(:f, "first A#f"),
|
40
|
-
LiveAST.ast(A.instance_method(:f))
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class CovertDefineMethodTest < RegularTest
|
6
|
-
DEFINE = lambda do
|
7
|
-
class A
|
8
|
-
def A.my_def(*args, &block)
|
9
|
-
define_method(*args, &block)
|
10
|
-
end
|
11
|
-
|
12
|
-
my_def :h do |x, y|
|
13
|
-
x + y
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_covert_define_method
|
19
|
-
DEFINE.call
|
20
|
-
assert_equal 77, A.new.h(33, 44)
|
21
|
-
|
22
|
-
assert_equal binop_define_method(:h, :+, :my_def),
|
23
|
-
A.instance_method(:h).to_ast
|
24
|
-
end
|
25
|
-
end
|
data/test/def_test.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class DefTest < RegularTest
|
6
|
-
class A
|
7
|
-
def f
|
8
|
-
"A#f"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_def_unbound_method_a
|
13
|
-
expected = no_arg_def(:f, "A#f")
|
14
|
-
assert_equal expected, A.instance_method(:f).to_ast
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_def_method_a
|
18
|
-
expected = no_arg_def(:f, "A#f")
|
19
|
-
assert_equal expected, A.new.method(:f).to_ast
|
20
|
-
end
|
21
|
-
|
22
|
-
class B
|
23
|
-
def f(x, y)
|
24
|
-
x + y
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_def_unbound_method_b
|
29
|
-
expected = binop_def(:f, :+)
|
30
|
-
assert_equal expected, B.instance_method(:f).to_ast
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_def_instance_method_b
|
34
|
-
expected = binop_def(:f, :+)
|
35
|
-
assert_equal expected, B.new.method(:f).to_ast
|
36
|
-
end
|
37
|
-
end
|
data/test/define_method_test.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class DefineMethodTest < RegularTest
|
6
|
-
WITH_BLOCKS = lambda do
|
7
|
-
class A
|
8
|
-
{
|
9
|
-
f: :+,
|
10
|
-
g: :*,
|
11
|
-
h: :-
|
12
|
-
}.each_pair do |name, op|
|
13
|
-
case op
|
14
|
-
when :+
|
15
|
-
define_method name do |x, y|
|
16
|
-
x + y
|
17
|
-
end
|
18
|
-
when :*
|
19
|
-
define_method name do |x, y|
|
20
|
-
x * y
|
21
|
-
end
|
22
|
-
when :-
|
23
|
-
define_method name do |x, y|
|
24
|
-
x - y
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_with_block
|
32
|
-
WITH_BLOCKS.call
|
33
|
-
|
34
|
-
assert_equal binop_define_method_with_var(:name, :+),
|
35
|
-
A.instance_method(:f).to_ast
|
36
|
-
|
37
|
-
assert_equal binop_define_method_with_var(:name, :*),
|
38
|
-
A.instance_method(:g).to_ast
|
39
|
-
|
40
|
-
assert_equal binop_define_method_with_var(:name, :-),
|
41
|
-
A.instance_method(:h).to_ast
|
42
|
-
end
|
43
|
-
|
44
|
-
WITH_PROCS = lambda do
|
45
|
-
class B
|
46
|
-
op = lambda { |x, y| x / y }
|
47
|
-
|
48
|
-
no_arg = proc { "B#f" }
|
49
|
-
|
50
|
-
define_method :g, &no_arg; define_method :f, &op
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_via_block
|
55
|
-
WITH_PROCS.call
|
56
|
-
|
57
|
-
assert_equal binop_block(:lambda, :/),
|
58
|
-
B.instance_method(:f).to_ast
|
59
|
-
|
60
|
-
assert_equal binop_block(:lambda, :/),
|
61
|
-
B.new.method(:f).to_ast
|
62
|
-
|
63
|
-
assert_equal no_arg_block(:proc, "B#f"),
|
64
|
-
B.instance_method(:g).to_ast
|
65
|
-
|
66
|
-
assert_equal no_arg_block(:proc, "B#f"),
|
67
|
-
B.new.method(:g).to_ast
|
68
|
-
end
|
69
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "main"
|
4
|
-
|
5
|
-
class DefineSingletonMethodTest < RegularTest
|
6
|
-
def test_define_singleton_method
|
7
|
-
a = Object.new
|
8
|
-
a.define_singleton_method :f do |x, y|
|
9
|
-
x + y
|
10
|
-
end
|
11
|
-
|
12
|
-
assert_equal 77, a.f(33, 44)
|
13
|
-
|
14
|
-
assert_equal binop_define_singleton_method(:f, :+, :a),
|
15
|
-
a.singleton_class.instance_method(:f).to_ast
|
16
|
-
end
|
17
|
-
end
|
data/test/encoding_test/bad.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# encoding: feynman-diagram
|
data/test/encoding_test/cp932.rb
DELETED
data/test/encoding_test/eucjp.rb
DELETED
data/test/encoding_test/koi8.rb
DELETED
data/test/encoding_test/utf8.rb
DELETED