mvz-live_ast 1.3.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.rdoc +8 -1
- data/README.rdoc +3 -3
- data/Rakefile +20 -20
- data/lib/live_ast.rb +4 -4
- data/lib/live_ast/ast_eval.rb +1 -1
- data/lib/live_ast/ast_load.rb +1 -1
- data/lib/live_ast/base.rb +13 -12
- data/lib/live_ast/common.rb +2 -10
- data/lib/live_ast/evaler.rb +3 -3
- data/lib/live_ast/full.rb +2 -2
- data/lib/live_ast/irb_spy.rb +4 -4
- data/lib/live_ast/loader.rb +2 -2
- data/lib/live_ast/reader.rb +1 -1
- data/lib/live_ast/replace_eval.rb +12 -13
- data/lib/live_ast/replace_load.rb +1 -1
- data/lib/live_ast/replace_raise.rb +3 -3
- data/lib/live_ast/ruby_parser.rb +4 -4
- data/lib/live_ast/ruby_parser/test.rb +12 -0
- data/lib/live_ast/ruby_parser/unparser.rb +1 -1
- data/lib/live_ast/to_ast.rb +13 -18
- data/lib/live_ast/to_ruby.rb +8 -18
- data/lib/live_ast/version.rb +1 -1
- data/test/alias_test.rb +1 -1
- data/test/ast_eval/ast_eval_test.rb +2 -2
- data/test/ast_load/ast_load_test.rb +2 -2
- data/test/attr_test.rb +1 -1
- data/test/backtrace_test.rb +4 -4
- data/test/base/noninvasive_test.rb +1 -1
- data/test/base/reload_test.rb +1 -1
- data/test/covert_define_method_test.rb +1 -1
- data/test/def_test.rb +1 -1
- data/test/define_method_test.rb +2 -2
- data/test/define_singleton_method_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/error_test.rb +3 -3
- data/test/eval_test.rb +1 -1
- data/test/flush_cache_test.rb +3 -1
- data/test/full/ast_reload_test.rb +1 -1
- data/test/full/replace_eval_test.rb +8 -8
- data/test/irb_test.rb +2 -2
- data/test/lambda_test.rb +2 -2
- data/test/load_path_test.rb +2 -2
- data/test/load_test.rb +3 -3
- data/test/main.rb +18 -18
- data/test/nested_test.rb +1 -1
- data/test/readme_test.rb +3 -3
- data/test/recursive_eval_test.rb +1 -1
- data/test/redefine_method_test.rb +1 -1
- data/test/rubygems_test.rb +4 -4
- data/test/rubyspec_test.rb +8 -8
- data/test/singleton_test.rb +1 -1
- data/test/stdlib_test.rb +1 -1
- data/test/thread_test.rb +2 -2
- data/test/to_ast/to_ast_feature_test.rb +2 -2
- data/test/to_ruby/to_ruby_feature_test.rb +2 -2
- data/test/to_ruby/to_ruby_test.rb +15 -15
- metadata +74 -60
data/lib/live_ast/to_ruby.rb
CHANGED
@@ -1,26 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "live_ast/base"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
module LiveAST
|
6
|
+
module CallableToRuby
|
7
|
+
# Generate ruby code which reflects the AST of this object.
|
8
|
+
def to_ruby
|
8
9
|
LiveAST.parser::Unparser.unparse(LiveAST.ast(self))
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
class UnboundMethod
|
19
|
-
# :method: to_ruby
|
20
|
-
# Generate ruby code which reflects the AST of this object.
|
21
|
-
end
|
22
|
-
|
23
|
-
class Proc
|
24
|
-
# :method: to_ruby
|
25
|
-
# Generate ruby code which reflects the AST of this object.
|
26
|
-
end
|
14
|
+
Method.include LiveAST::CallableToRuby
|
15
|
+
UnboundMethod.include LiveAST::CallableToRuby
|
16
|
+
Proc.include LiveAST::CallableToRuby
|
data/lib/live_ast/version.rb
CHANGED
data/test/alias_test.rb
CHANGED
data/test/attr_test.rb
CHANGED
data/test/backtrace_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
# test for raise redefinition side-effects: unsort this TestCase from
|
6
6
|
# other TestCases.
|
@@ -113,7 +113,7 @@ define_unsorted_test_case "BacktraceTest", RegularTest do
|
|
113
113
|
raise_after_eval("raise", false)
|
114
114
|
raise_after_eval("1/0", false)
|
115
115
|
|
116
|
-
require
|
116
|
+
require "live_ast/replace_raise"
|
117
117
|
|
118
118
|
raise_after_eval("raise", true)
|
119
119
|
raise_after_eval("1/0", false)
|
@@ -123,14 +123,14 @@ define_unsorted_test_case "BacktraceTest", RegularTest do
|
|
123
123
|
3.times do
|
124
124
|
orig = eval %{
|
125
125
|
|
126
|
-
lambda { #{code} }
|
126
|
+
lambda { #{code} } # lambda { foo }
|
127
127
|
|
128
128
|
|
129
129
|
}, binding, "somewhere", 1000
|
130
130
|
|
131
131
|
live = ast_eval %{
|
132
132
|
|
133
|
-
lambda { #{code} }
|
133
|
+
lambda { #{code} } # lambda { foo }
|
134
134
|
|
135
135
|
|
136
136
|
}, binding, "somewhere", 1000
|
data/test/base/reload_test.rb
CHANGED
data/test/def_test.rb
CHANGED
data/test/define_method_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
class DefineMethodTest < RegularTest
|
6
6
|
WITH_BLOCKS = lambda do
|
@@ -8,7 +8,7 @@ class DefineMethodTest < RegularTest
|
|
8
8
|
{
|
9
9
|
f: :+,
|
10
10
|
g: :*,
|
11
|
-
h:
|
11
|
+
h: :-
|
12
12
|
}.each_pair do |name, op|
|
13
13
|
case op
|
14
14
|
when :+
|
data/test/encoding_test.rb
CHANGED
data/test/error_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
class ErrorTest < RegularTest
|
6
6
|
def test_multiple_lambda_same_line
|
@@ -70,12 +70,12 @@ class ErrorTest < RegularTest
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
def
|
73
|
+
def test_reload_with_raw_eval_one
|
74
74
|
ast_eval("lambda { }", binding)
|
75
75
|
eval("lambda { }")
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
78
|
+
def test_reload_with_raw_eval_two
|
79
79
|
c = ast_eval %{
|
80
80
|
Class.new do
|
81
81
|
def f
|
data/test/eval_test.rb
CHANGED
data/test/flush_cache_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
# test for flushing side-effects: unsort this TestCase from other
|
6
6
|
# TestCases.
|
@@ -18,6 +18,7 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
|
|
18
18
|
def uncached_method_from_require
|
19
19
|
klass = Class.new do
|
20
20
|
def f; end
|
21
|
+
|
21
22
|
def g; end
|
22
23
|
end
|
23
24
|
|
@@ -69,6 +70,7 @@ define_unsorted_test_case "FlushCacheTest", RegularTest do
|
|
69
70
|
def lost_method_from_require
|
70
71
|
klass = Class.new do
|
71
72
|
def f; end
|
73
|
+
|
72
74
|
def g; end
|
73
75
|
end
|
74
76
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "main"
|
4
4
|
|
5
5
|
class FullReplaceEvalTest < ReplaceEvalTest
|
6
6
|
RESULT = {}
|
@@ -71,7 +71,7 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
71
71
|
assert_equal 33, RESULT[:new]
|
72
72
|
end
|
73
73
|
|
74
|
-
def
|
74
|
+
def test_const_lookup_two
|
75
75
|
Class.new do
|
76
76
|
eval %{
|
77
77
|
def f
|
@@ -108,7 +108,7 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
|
-
def
|
111
|
+
def test_const_lookup_three
|
112
112
|
DEFINE_QS.call
|
113
113
|
Q::R.new.f
|
114
114
|
S::T.new.f
|
@@ -141,7 +141,7 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def test_instance_eval_arg_error_no_block
|
144
|
-
[[], (
|
144
|
+
[[], ("a".."z").to_a].each do |args|
|
145
145
|
orig = assert_raises ArgumentError do
|
146
146
|
Object.new.live_ast_original_instance_eval(*args)
|
147
147
|
end
|
@@ -173,7 +173,7 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
173
173
|
|
174
174
|
describe "instance_eval argument errors" do
|
175
175
|
before do
|
176
|
-
require
|
176
|
+
require "live_ast/full"
|
177
177
|
end
|
178
178
|
|
179
179
|
let(:orig) {
|
@@ -188,7 +188,7 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
188
188
|
}
|
189
189
|
|
190
190
|
describe "when the second argument is nil" do
|
191
|
-
let(:args) { [
|
191
|
+
let(:args) { ["1", nil] }
|
192
192
|
it "raises the same error as the original" do
|
193
193
|
assert_equal orig.message, live.message
|
194
194
|
assert_equal orig.class, live.class
|
@@ -198,10 +198,10 @@ class FullReplaceEvalTest < ReplaceEvalTest
|
|
198
198
|
|
199
199
|
def test_instance_eval_arg_error_with_block
|
200
200
|
orig = assert_raises ArgumentError do
|
201
|
-
Object.new.live_ast_original_instance_eval(3, 4, 5) {}
|
201
|
+
Object.new.live_ast_original_instance_eval(3, 4, 5) { nil }
|
202
202
|
end
|
203
203
|
live = assert_raises ArgumentError do
|
204
|
-
Object.new.instance_eval(3, 4, 5) {}
|
204
|
+
Object.new.instance_eval(3, 4, 5) { nil }
|
205
205
|
end
|
206
206
|
assert_equal orig.message, live.message
|
207
207
|
end
|
data/test/irb_test.rb
CHANGED
data/test/lambda_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
class LambdaTest < RegularTest
|
6
6
|
def test_block_braces_multiline
|
@@ -31,7 +31,7 @@ class LambdaTest < RegularTest
|
|
31
31
|
def test_stabby_lambda
|
32
32
|
a = ->(x, y) { x - y }
|
33
33
|
|
34
|
-
expected =
|
34
|
+
expected = binop_lambda(:-)
|
35
35
|
assert_equal expected, a.to_ast
|
36
36
|
end
|
37
37
|
|
data/test/load_path_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
4
|
|
5
5
|
class LoadPathTest < BaseTest
|
6
6
|
include FileUtils
|
@@ -68,7 +68,7 @@ class LoadPathTest < BaseTest
|
|
68
68
|
"",
|
69
69
|
"/usr",
|
70
70
|
".",
|
71
|
-
".."
|
71
|
+
".."
|
72
72
|
].each do |file|
|
73
73
|
compare_load_errors(file)
|
74
74
|
end
|
data/test/load_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
3
|
+
require_relative "main"
|
4
|
+
require_relative "../devel/levitate"
|
5
5
|
|
6
6
|
class LoadFileTest < BaseTest
|
7
7
|
class << self
|
@@ -80,7 +80,7 @@ class LoadFileTest < BaseTest
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def test_verbose_respected
|
83
|
-
lib = File.expand_path(File.dirname(__FILE__)
|
83
|
+
lib = File.expand_path("../lib", File.dirname(__FILE__))
|
84
84
|
|
85
85
|
[
|
86
86
|
# respects a loaded file setting $VERBOSE = true
|
data/test/main.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)
|
3
|
+
$LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
4
4
|
|
5
5
|
# require first for stdlib_test
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
6
|
+
require "pp"
|
7
|
+
require "find"
|
8
|
+
require "fileutils"
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
10
|
+
require "minitest/mock"
|
11
|
+
require "minitest/autorun"
|
12
12
|
|
13
13
|
$VERBOSE = true
|
14
14
|
|
15
|
-
require
|
15
|
+
require "live_ast/base"
|
16
16
|
|
17
17
|
def define_unsorted_test_case(name, superclass, &block)
|
18
18
|
klass = Class.new superclass, &block
|
19
|
-
letter = (
|
19
|
+
letter = ("A".."Z").to_a[rand(26)]
|
20
20
|
Object.const_set "#{letter}#{name}", klass
|
21
21
|
end
|
22
22
|
|
@@ -37,7 +37,7 @@ class JLMiniTest < MiniTest::Test
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def mu_pp(obj)
|
40
|
-
+
|
40
|
+
+"" <<
|
41
41
|
delim("_") <<
|
42
42
|
obj.pretty_inspect.chomp <<
|
43
43
|
delim("=")
|
@@ -52,9 +52,9 @@ class JLMiniTest < MiniTest::Test
|
|
52
52
|
def assert_nothing_raised
|
53
53
|
yield
|
54
54
|
assert_nil nil
|
55
|
-
rescue StandardError =>
|
55
|
+
rescue StandardError => e
|
56
56
|
raise MiniTest::Assertion,
|
57
|
-
|
57
|
+
exception_details(e, "Expected nothing raised, but got:")
|
58
58
|
end
|
59
59
|
|
60
60
|
%w(
|
@@ -68,15 +68,15 @@ end
|
|
68
68
|
class BaseTest < JLMiniTest
|
69
69
|
include LiveAST.parser::Test
|
70
70
|
|
71
|
-
DATA_DIR = File.expand_path(File.dirname(__FILE__)
|
71
|
+
DATA_DIR = File.expand_path("data", File.dirname(__FILE__))
|
72
72
|
|
73
73
|
def self.stdlib_has_source?
|
74
74
|
RUBY_ENGINE != "jruby"
|
75
75
|
end
|
76
76
|
|
77
77
|
def temp_file(code, basename = nil)
|
78
|
-
basename ||= (
|
79
|
-
path = DATA_DIR
|
78
|
+
basename ||= ("a".."z").to_a.shuffle.join + ".rb"
|
79
|
+
path = File.join(DATA_DIR, basename)
|
80
80
|
|
81
81
|
write_file path, code if code
|
82
82
|
begin
|
@@ -106,7 +106,7 @@ end
|
|
106
106
|
class RegularTest < BaseTest
|
107
107
|
def setup
|
108
108
|
super
|
109
|
-
require
|
109
|
+
require "live_ast"
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
@@ -114,10 +114,10 @@ class ReplaceEvalTest < BaseTest
|
|
114
114
|
def initialize(*args)
|
115
115
|
super
|
116
116
|
ok = begin
|
117
|
-
require
|
117
|
+
require "live_ast/full"
|
118
118
|
true
|
119
119
|
rescue LoadError
|
120
|
-
raise "need: gem install
|
120
|
+
raise "need: gem install bindings" if RUBY_ENGINE == "ruby"
|
121
121
|
|
122
122
|
false
|
123
123
|
end
|
@@ -127,7 +127,7 @@ class ReplaceEvalTest < BaseTest
|
|
127
127
|
self.class.class_eval do
|
128
128
|
instance_methods(false).each do |m|
|
129
129
|
remove_method(m)
|
130
|
-
define_method(m) {}
|
130
|
+
define_method(m) { nil }
|
131
131
|
end
|
132
132
|
end
|
133
133
|
end
|