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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e96ab3dab36ef2a9b745f3a878b71b79bb8b8ecfd870b0c8ad29dcef5520a943
|
4
|
+
data.tar.gz: b8b7f606c175caff1522b70db8287392160d8352e44f57fca8e6709011599bd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac889c697aa0c722078437135a3c57db7b05126178920e1224e4728616ab38cabbcb682d6eae3194a9361f2032400a6b55d2e89726f95abe006fa33d9e8c6ef9
|
7
|
+
data.tar.gz: ecc774511be6e4bb0d89559c8e6186ec766aa30ad31376f6e310ef5e9d0e116f603b648ce1a8f8a722116daadc1150913bdcbb977ed653c2784b0e84525c59c7
|
data/CHANGES.rdoc
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
-
|
2
1
|
= live_ast Changes
|
3
2
|
|
3
|
+
== Version 2.0.0
|
4
|
+
|
5
|
+
* Breaking change: Use bindings gem instead of binding_of_caller.
|
6
|
+
If you've been using the full integration mode, you will have to replace
|
7
|
+
binding_of_caller with bindings.
|
8
|
+
* Add support for Ruby 3.0
|
9
|
+
* Drop support for Ruby 2.3, 2.4 and 2.5
|
10
|
+
|
4
11
|
== Version 1.3.2
|
5
12
|
|
6
13
|
* Add support for Ruby 2.6
|
data/README.rdoc
CHANGED
@@ -129,8 +129,8 @@ semantics as +eval+ except that the binding argument is required.
|
|
129
129
|
== Full Integration
|
130
130
|
|
131
131
|
In order for LiveAST to be transparent to the user, +eval+ must be
|
132
|
-
replaced. This is accomplished with the help of the +
|
133
|
-
(https://github.com/
|
132
|
+
replaced. This is accomplished with the help of the +bindings+ gem
|
133
|
+
(https://github.com/shreeve/bindings).
|
134
134
|
|
135
135
|
To replace +eval+,
|
136
136
|
|
@@ -149,7 +149,7 @@ below for details).
|
|
149
149
|
# => s(:iter, s(:call, nil, :lambda), 0, s(:str, "dynamic1"))
|
150
150
|
|
151
151
|
Since LiveAST itself is pure ruby, any platforms supported by
|
152
|
-
+
|
152
|
+
+bindings+ should work with <code>live_ast/full</code>.
|
153
153
|
|
154
154
|
== Limitations
|
155
155
|
|
data/Rakefile
CHANGED
@@ -1,52 +1,52 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "rake/clean"
|
4
|
+
require "bundler/gem_tasks"
|
5
|
+
require "rake/testtask"
|
6
|
+
require "rdoc/task"
|
7
7
|
|
8
8
|
namespace :test do
|
9
|
-
desc
|
9
|
+
desc "run tests"
|
10
10
|
Rake::TestTask.new(:main) do |t|
|
11
|
-
t.libs = [
|
11
|
+
t.libs = ["lib"]
|
12
12
|
t.ruby_opts += ["-w -Itest"]
|
13
|
-
t.test_files = FileList[
|
13
|
+
t.test_files = FileList["test/*_test.rb"]
|
14
14
|
end
|
15
15
|
|
16
16
|
Rake::TestTask.new(:base) do |t|
|
17
|
-
t.libs = [
|
17
|
+
t.libs = ["lib"]
|
18
18
|
t.ruby_opts += ["-w -Itest"]
|
19
|
-
t.test_files = FileList[
|
19
|
+
t.test_files = FileList["test/base/*_test.rb"]
|
20
20
|
end
|
21
21
|
|
22
22
|
Rake::TestTask.new(:ast_load) do |t|
|
23
|
-
t.libs = [
|
23
|
+
t.libs = ["lib"]
|
24
24
|
t.ruby_opts += ["-w -Itest"]
|
25
|
-
t.test_files = FileList[
|
25
|
+
t.test_files = FileList["test/ast_load/*_test.rb"]
|
26
26
|
end
|
27
27
|
|
28
28
|
Rake::TestTask.new(:ast_eval) do |t|
|
29
|
-
t.libs = [
|
29
|
+
t.libs = ["lib"]
|
30
30
|
t.ruby_opts += ["-w -Itest"]
|
31
|
-
t.test_files = FileList[
|
31
|
+
t.test_files = FileList["test/ast_eval/*_test.rb"]
|
32
32
|
end
|
33
33
|
|
34
34
|
Rake::TestTask.new(:to_ast) do |t|
|
35
|
-
t.libs = [
|
35
|
+
t.libs = ["lib"]
|
36
36
|
t.ruby_opts += ["-w -Itest"]
|
37
|
-
t.test_files = FileList[
|
37
|
+
t.test_files = FileList["test/to_ast/*_test.rb"]
|
38
38
|
end
|
39
39
|
|
40
40
|
Rake::TestTask.new(:to_ruby) do |t|
|
41
|
-
t.libs = [
|
41
|
+
t.libs = ["lib"]
|
42
42
|
t.ruby_opts += ["-w -Itest"]
|
43
|
-
t.test_files = FileList[
|
43
|
+
t.test_files = FileList["test/to_ruby/*_test.rb"]
|
44
44
|
end
|
45
45
|
|
46
46
|
Rake::TestTask.new(:full) do |t|
|
47
|
-
t.libs = [
|
47
|
+
t.libs = ["lib"]
|
48
48
|
t.ruby_opts += ["-w -Itest"]
|
49
|
-
t.test_files = FileList[
|
49
|
+
t.test_files = FileList["test/full/*_test.rb"]
|
50
50
|
end
|
51
51
|
|
52
52
|
task all: [:main, :base, :ast_load, :to_ast, :to_ruby, :full]
|
@@ -59,4 +59,4 @@ RDoc::Task.new(:rdoc) do |t|
|
|
59
59
|
t.rdoc_files.include("README.rdoc", "CHANGES.rdoc", "lib")
|
60
60
|
end
|
61
61
|
|
62
|
-
task default:
|
62
|
+
task default: "test:all"
|
data/lib/live_ast.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require "live_ast/base"
|
4
|
+
require "live_ast/to_ast"
|
5
|
+
require "live_ast/ast_eval"
|
6
|
+
require "live_ast/replace_load"
|
data/lib/live_ast/ast_eval.rb
CHANGED
data/lib/live_ast/ast_load.rb
CHANGED
data/lib/live_ast/base.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "thread"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
5
|
+
require "live_ast/common"
|
6
|
+
require "live_ast/reader"
|
7
|
+
require "live_ast/evaler"
|
8
|
+
require "live_ast/linker"
|
9
|
+
require "live_ast/loader"
|
10
|
+
require "live_ast/error"
|
11
|
+
require "live_ast/irb_spy" if defined?(IRB)
|
12
12
|
|
13
13
|
module LiveAST
|
14
14
|
NATIVE_EVAL = Kernel.method(:eval) #:nodoc:
|
@@ -17,10 +17,11 @@ module LiveAST
|
|
17
17
|
attr_writer :parser #:nodoc:
|
18
18
|
|
19
19
|
def parser #:nodoc:
|
20
|
-
@parser ||=
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
@parser ||=
|
21
|
+
begin
|
22
|
+
require "live_ast/ruby_parser"
|
23
|
+
LiveAST::RubyParser
|
24
|
+
end
|
24
25
|
end
|
25
26
|
|
26
27
|
#
|
data/lib/live_ast/common.rb
CHANGED
@@ -18,11 +18,7 @@ module LiveAST
|
|
18
18
|
rescue NameError
|
19
19
|
thing = arg.nil? ? nil : arg.class
|
20
20
|
|
21
|
-
message =
|
22
|
-
"wrong argument type #{thing.inspect} (expected String)"
|
23
|
-
else
|
24
|
-
"no implicit conversion of #{thing.inspect} into String"
|
25
|
-
end
|
21
|
+
message = "wrong argument type #{thing.inspect} (expected String)"
|
26
22
|
raise TypeError, message
|
27
23
|
end
|
28
24
|
|
@@ -48,11 +44,7 @@ module LiveAST
|
|
48
44
|
if bind
|
49
45
|
case location.size
|
50
46
|
when 0
|
51
|
-
|
52
|
-
NATIVE_EVAL.call("[__FILE__, __LINE__]", bind)
|
53
|
-
else
|
54
|
-
bind.source_location
|
55
|
-
end
|
47
|
+
bind.source_location
|
56
48
|
when 1
|
57
49
|
[location.first, 1]
|
58
50
|
else
|
data/lib/live_ast/evaler.rb
CHANGED
@@ -15,9 +15,9 @@ module LiveAST
|
|
15
15
|
|
16
16
|
begin
|
17
17
|
NATIVE_EVAL.call(evaler_source, bind, key, line)
|
18
|
-
rescue Exception =>
|
19
|
-
|
20
|
-
raise
|
18
|
+
rescue Exception => e
|
19
|
+
e.backtrace.map! { |s| LiveAST.strip_token s }
|
20
|
+
raise e
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
data/lib/live_ast/full.rb
CHANGED
data/lib/live_ast/irb_spy.rb
CHANGED
@@ -8,8 +8,8 @@ module LiveAST
|
|
8
8
|
attr_writer :history
|
9
9
|
|
10
10
|
def code_at(line)
|
11
|
-
code = +
|
12
|
-
checked_history[line
|
11
|
+
code = +""
|
12
|
+
checked_history[line..].each do |code_line|
|
13
13
|
code << code_line << "\n"
|
14
14
|
return code if can_parse code
|
15
15
|
end
|
@@ -25,7 +25,7 @@ module LiveAST
|
|
25
25
|
return @history if @history
|
26
26
|
|
27
27
|
raise NotImplementedError,
|
28
|
-
|
28
|
+
"LiveAST cannot access history for this IRB input method"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -33,7 +33,7 @@ end
|
|
33
33
|
|
34
34
|
[
|
35
35
|
defined?(IRB::StdioInputMethod) ? IRB::StdioInputMethod : nil,
|
36
|
-
defined?(IRB::ReadlineInputMethod) ? IRB::ReadlineInputMethod : nil
|
36
|
+
defined?(IRB::ReadlineInputMethod) ? IRB::ReadlineInputMethod : nil
|
37
37
|
].compact.each do |klass|
|
38
38
|
klass.module_eval do
|
39
39
|
alias_method :live_ast_original_gets, :gets
|
data/lib/live_ast/loader.rb
CHANGED
@@ -10,7 +10,7 @@ module LiveAST
|
|
10
10
|
header, footer, warnings_ok = header_footer(wrap)
|
11
11
|
|
12
12
|
parser_src = Reader.read(file)
|
13
|
-
evaler_src = +
|
13
|
+
evaler_src = +"" << header << parser_src << footer
|
14
14
|
|
15
15
|
run = lambda do
|
16
16
|
Evaler.eval(parser_src, evaler_src, TOPLEVEL_BINDING, file, 1)
|
@@ -52,7 +52,7 @@ module LiveAST
|
|
52
52
|
return file if File.file? file
|
53
53
|
|
54
54
|
$LOAD_PATH.each do |path|
|
55
|
-
target = path
|
55
|
+
target = File.join(path, file)
|
56
56
|
return target if File.file? target
|
57
57
|
end
|
58
58
|
nil
|
data/lib/live_ast/reader.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "live_ast/base"
|
4
|
+
require "bindings"
|
5
5
|
|
6
6
|
module LiveAST
|
7
7
|
module ReplaceEval
|
@@ -57,9 +57,8 @@ module Kernel
|
|
57
57
|
LiveAST::Common.check_arity(args, 1..4)
|
58
58
|
LiveAST.eval(
|
59
59
|
args[0],
|
60
|
-
args[1] ||
|
61
|
-
*LiveAST::Common.location_for_eval(*args[1..3])
|
62
|
-
)
|
60
|
+
args[1] || Binding.of_caller(1),
|
61
|
+
*LiveAST::Common.location_for_eval(*args[1..3]))
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
@@ -68,7 +67,7 @@ class Binding
|
|
68
67
|
alias live_ast_original_binding_eval eval
|
69
68
|
|
70
69
|
def eval(*args)
|
71
|
-
LiveAST.eval(args[0], self, *args[1
|
70
|
+
LiveAST.eval(args[0], self, *args[1..])
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
@@ -80,11 +79,11 @@ class BasicObject
|
|
80
79
|
if block
|
81
80
|
live_ast_original_instance_eval(*args, &block)
|
82
81
|
else
|
83
|
-
::LiveAST::ReplaceEval
|
84
|
-
module_or_instance_eval(:instance,
|
85
|
-
|
86
|
-
|
87
|
-
|
82
|
+
::LiveAST::ReplaceEval
|
83
|
+
.module_or_instance_eval(:instance,
|
84
|
+
self,
|
85
|
+
::Binding.of_caller(1),
|
86
|
+
args)
|
88
87
|
end
|
89
88
|
end
|
90
89
|
end
|
@@ -97,8 +96,8 @@ class Module
|
|
97
96
|
if block
|
98
97
|
live_ast_original_module_eval(*args, &block)
|
99
98
|
else
|
100
|
-
LiveAST::ReplaceEval
|
101
|
-
module_or_instance_eval(:module, self,
|
99
|
+
LiveAST::ReplaceEval
|
100
|
+
.module_or_instance_eval(:module, self, Binding.of_caller(1), args)
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "live_ast/base"
|
4
4
|
|
5
5
|
module Kernel
|
6
6
|
private
|
@@ -10,8 +10,8 @@ module Kernel
|
|
10
10
|
def raise(*args)
|
11
11
|
ex = begin
|
12
12
|
live_ast_original_raise(*args)
|
13
|
-
rescue Exception =>
|
14
|
-
|
13
|
+
rescue Exception => e
|
14
|
+
e
|
15
15
|
end
|
16
16
|
ex.backtrace.reject! { |line| line.index __FILE__ }
|
17
17
|
ex.backtrace.map! { |line| LiveAST.strip_token line }
|
data/lib/live_ast/ruby_parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "ruby_parser"
|
4
|
+
require "live_ast/base"
|
5
5
|
|
6
6
|
module LiveAST
|
7
7
|
class RubyParser
|
@@ -33,7 +33,7 @@ module LiveAST
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
LiveAST::RubyParser.autoload :Unparser,
|
37
|
-
LiveAST::RubyParser.autoload :Test,
|
36
|
+
LiveAST::RubyParser.autoload :Unparser, "live_ast/ruby_parser/unparser"
|
37
|
+
LiveAST::RubyParser.autoload :Test, "live_ast/ruby_parser/test"
|
38
38
|
|
39
39
|
LiveAST.parser = LiveAST::RubyParser
|
@@ -150,6 +150,18 @@ module LiveAST
|
|
150
150
|
s(:call, s(:lvar, :x), op, s(:lvar, :y)))
|
151
151
|
end
|
152
152
|
|
153
|
+
#
|
154
|
+
# binop_lambda(:+) returns the ast of
|
155
|
+
#
|
156
|
+
# lambda { |x, y| x + y }
|
157
|
+
#
|
158
|
+
def binop_lambda(op)
|
159
|
+
s(:iter,
|
160
|
+
s(:lambda),
|
161
|
+
s(:args, :x, :y),
|
162
|
+
s(:call, s(:lvar, :x), op, s(:lvar, :y)))
|
163
|
+
end
|
164
|
+
|
153
165
|
#
|
154
166
|
# binop_proc_new(:*) returns the ast of
|
155
167
|
#
|
data/lib/live_ast/to_ast.rb
CHANGED
@@ -1,28 +1,23 @@
|
|
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 MethodToAST
|
7
|
+
# Extract the AST of this object.
|
8
|
+
def to_ast
|
8
9
|
LiveAST::Linker.find_method_ast(owner, name, *source_location)
|
9
10
|
end
|
10
11
|
end
|
11
|
-
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
module ProcToAST
|
14
|
+
# Extract the AST of this object.
|
15
|
+
def to_ast
|
16
|
+
LiveAST::Linker.find_proc_ast(self)
|
17
|
+
end
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
class UnboundMethod
|
26
|
-
# :method: to_ast
|
27
|
-
# Extract the AST of this object.
|
28
|
-
end
|
21
|
+
Method.include LiveAST::MethodToAST
|
22
|
+
UnboundMethod.include LiveAST::MethodToAST
|
23
|
+
Proc.include LiveAST::ProcToAST
|