mvz-live_ast 1.1.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGES.rdoc +27 -1
- data/README.rdoc +12 -12
- data/Rakefile +22 -20
- data/lib/live_ast.rb +6 -4
- data/lib/live_ast/ast_eval.rb +3 -1
- data/lib/live_ast/ast_load.rb +3 -1
- data/lib/live_ast/base.rb +22 -19
- data/lib/live_ast/common.rb +16 -13
- data/lib/live_ast/error.rb +3 -1
- data/lib/live_ast/evaler.rb +6 -4
- data/lib/live_ast/full.rb +4 -2
- data/lib/live_ast/irb_spy.rb +19 -14
- data/lib/live_ast/linker.rb +6 -4
- data/lib/live_ast/loader.rb +11 -9
- data/lib/live_ast/reader.rb +5 -3
- data/lib/live_ast/replace_eval.rb +20 -36
- data/lib/live_ast/replace_load.rb +4 -2
- data/lib/live_ast/replace_raise.rb +6 -4
- data/lib/live_ast/ruby_parser.rb +9 -8
- data/lib/live_ast/ruby_parser/test.rb +17 -4
- data/lib/live_ast/ruby_parser/unparser.rb +3 -1
- data/lib/live_ast/to_ast.rb +15 -18
- data/lib/live_ast/to_ruby.rb +10 -18
- data/lib/live_ast/version.rb +3 -1
- data/test/alias_test.rb +3 -2
- data/test/ast_eval/ast_eval_test.rb +4 -2
- data/test/ast_load/ast_load_test.rb +8 -6
- data/test/attr_test.rb +3 -1
- data/test/backtrace_test.rb +7 -5
- data/test/base/noninvasive_test.rb +3 -1
- data/test/base/reload_test.rb +7 -5
- data/test/covert_define_method_test.rb +3 -1
- data/test/def_test.rb +3 -1
- data/test/define_method_test.rb +4 -2
- data/test/define_singleton_method_test.rb +3 -1
- data/test/encoding_test.rb +20 -24
- data/test/error_test.rb +5 -3
- data/test/eval_test.rb +3 -1
- data/test/flush_cache_test.rb +5 -1
- data/test/full/ast_reload_test.rb +7 -5
- data/test/full/replace_eval_test.rb +21 -13
- data/test/irb_test.rb +28 -10
- data/test/lambda_test.rb +4 -2
- data/test/load_path_test.rb +10 -11
- data/test/load_test.rb +5 -3
- data/test/main.rb +27 -25
- data/test/nested_test.rb +3 -1
- data/test/readme_test.rb +5 -3
- data/test/recursive_eval_test.rb +3 -1
- data/test/redefine_method_test.rb +3 -1
- data/test/rubygems_test.rb +6 -4
- data/test/rubyspec_test.rb +29 -29
- data/test/singleton_test.rb +3 -1
- data/test/stdlib_test.rb +3 -1
- data/test/thread_test.rb +5 -3
- data/test/to_ast/to_ast_feature_test.rb +4 -2
- data/test/to_ruby/to_ruby_feature_test.rb +4 -2
- data/test/to_ruby/to_ruby_test.rb +100 -96
- metadata +85 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
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,32 @@
|
|
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
|
+
|
11
|
+
== Version 1.3.2
|
12
|
+
|
13
|
+
* Add support for Ruby 2.6
|
14
|
+
|
15
|
+
== Version 1.3.1
|
16
|
+
|
17
|
+
* Loosen dependency on ruby_parser
|
18
|
+
|
19
|
+
== Version 1.3.0
|
20
|
+
|
21
|
+
* Drop support for Rubies below 2.3
|
22
|
+
* Update dependencies
|
23
|
+
|
24
|
+
== Version 1.2.0
|
25
|
+
|
26
|
+
* Drop support for Rubies below 2.1
|
27
|
+
* Handle multi-line definitions in IRB correctly
|
28
|
+
* Tighten and update dependencies
|
29
|
+
|
4
30
|
== Version 1.1.3
|
5
31
|
|
6
32
|
* Keep ASTs in the cache when they are fetched, allowing aliased methods to
|
data/README.rdoc
CHANGED
@@ -25,11 +25,11 @@ Live abstract syntax trees of methods and procs. Fork of +live_ast+
|
|
25
25
|
|
26
26
|
f = lambda { "foo" }
|
27
27
|
p f.to_ast
|
28
|
-
# => s(:iter, s(:call, nil, :lambda),
|
28
|
+
# => s(:iter, s(:call, nil, :lambda), 0, s(:str, "foo"))
|
29
29
|
|
30
30
|
def query(&block)
|
31
31
|
p block.to_ast
|
32
|
-
# => s(:iter, s(:call, nil, :query),
|
32
|
+
# => s(:iter, s(:call, nil, :query), 0, s(:str, "bar"))
|
33
33
|
end
|
34
34
|
|
35
35
|
query do
|
@@ -40,7 +40,7 @@ Live abstract syntax trees of methods and procs. Fork of +live_ast+
|
|
40
40
|
|
41
41
|
u = ast_eval "lambda { 'dynamic3' }", binding
|
42
42
|
p u.to_ast
|
43
|
-
# => s(:iter, s(:call, nil, :lambda),
|
43
|
+
# => s(:iter, s(:call, nil, :lambda), 0, s(:str, "dynamic3"))
|
44
44
|
|
45
45
|
ast_eval "def v ; 'dynamic4' ; end", binding
|
46
46
|
p method(:v).to_ast
|
@@ -52,7 +52,7 @@ Live abstract syntax trees of methods and procs. Fork of +live_ast+
|
|
52
52
|
|
53
53
|
f = eval "lambda { 'dynamic1' }"
|
54
54
|
p f.to_ast
|
55
|
-
# => s(:iter, s(:call, nil, :lambda),
|
55
|
+
# => s(:iter, s(:call, nil, :lambda), 0, s(:str, "dynamic1"))
|
56
56
|
|
57
57
|
eval "def g ; 'dynamic2' ; end"
|
58
58
|
p method(:g).to_ast
|
@@ -80,7 +80,7 @@ sexps used by tools such as <code>ruby2ruby</code>.
|
|
80
80
|
|
81
81
|
LiveAST is thread-safe.
|
82
82
|
|
83
|
-
Ruby
|
83
|
+
Ruby 2.3.0 or higher is required.
|
84
84
|
|
85
85
|
== Links
|
86
86
|
|
@@ -124,13 +124,13 @@ semantics as +eval+ except that the binding argument is required.
|
|
124
124
|
|
125
125
|
u = ast_eval "lambda { 'dynamic3' }", binding
|
126
126
|
p u.to_ast
|
127
|
-
# => s(:iter, s(:call, nil, :lambda),
|
127
|
+
# => s(:iter, s(:call, nil, :lambda), 0, s(:str, "dynamic3"))
|
128
128
|
|
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
|
|
@@ -146,10 +146,10 @@ below for details).
|
|
146
146
|
|
147
147
|
f = eval "lambda { 'dynamic1' }"
|
148
148
|
p f.to_ast
|
149
|
-
# => s(:iter, s(:call, nil, :lambda),
|
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
|
|
@@ -277,12 +277,12 @@ The following alternative interface is available.
|
|
277
277
|
# => s(:defn, :f, s(:args), s(:str, "A#f"))
|
278
278
|
|
279
279
|
p LiveAST.ast(lambda { })
|
280
|
-
# => s(:iter, s(:call, nil, :lambda),
|
280
|
+
# => s(:iter, s(:call, nil, :lambda), 0)
|
281
281
|
|
282
282
|
f = LiveAST.eval("lambda { }", binding)
|
283
283
|
|
284
284
|
p LiveAST.ast(f)
|
285
|
-
# => s(:iter, s(:call, nil, :lambda),
|
285
|
+
# => s(:iter, s(:call, nil, :lambda), 0)
|
286
286
|
|
287
287
|
ast_eval # => raises NameError
|
288
288
|
|
data/Rakefile
CHANGED
@@ -1,50 +1,52 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rake/clean"
|
4
|
+
require "bundler/gem_tasks"
|
5
|
+
require "rake/testtask"
|
6
|
+
require "rdoc/task"
|
5
7
|
|
6
8
|
namespace :test do
|
7
|
-
desc
|
9
|
+
desc "run tests"
|
8
10
|
Rake::TestTask.new(:main) do |t|
|
9
|
-
t.libs = [
|
11
|
+
t.libs = ["lib"]
|
10
12
|
t.ruby_opts += ["-w -Itest"]
|
11
|
-
t.test_files = FileList[
|
13
|
+
t.test_files = FileList["test/*_test.rb"]
|
12
14
|
end
|
13
15
|
|
14
16
|
Rake::TestTask.new(:base) do |t|
|
15
|
-
t.libs = [
|
17
|
+
t.libs = ["lib"]
|
16
18
|
t.ruby_opts += ["-w -Itest"]
|
17
|
-
t.test_files = FileList[
|
19
|
+
t.test_files = FileList["test/base/*_test.rb"]
|
18
20
|
end
|
19
21
|
|
20
22
|
Rake::TestTask.new(:ast_load) do |t|
|
21
|
-
t.libs = [
|
23
|
+
t.libs = ["lib"]
|
22
24
|
t.ruby_opts += ["-w -Itest"]
|
23
|
-
t.test_files = FileList[
|
25
|
+
t.test_files = FileList["test/ast_load/*_test.rb"]
|
24
26
|
end
|
25
27
|
|
26
28
|
Rake::TestTask.new(:ast_eval) do |t|
|
27
|
-
t.libs = [
|
29
|
+
t.libs = ["lib"]
|
28
30
|
t.ruby_opts += ["-w -Itest"]
|
29
|
-
t.test_files = FileList[
|
31
|
+
t.test_files = FileList["test/ast_eval/*_test.rb"]
|
30
32
|
end
|
31
33
|
|
32
34
|
Rake::TestTask.new(:to_ast) do |t|
|
33
|
-
t.libs = [
|
35
|
+
t.libs = ["lib"]
|
34
36
|
t.ruby_opts += ["-w -Itest"]
|
35
|
-
t.test_files = FileList[
|
37
|
+
t.test_files = FileList["test/to_ast/*_test.rb"]
|
36
38
|
end
|
37
39
|
|
38
40
|
Rake::TestTask.new(:to_ruby) do |t|
|
39
|
-
t.libs = [
|
41
|
+
t.libs = ["lib"]
|
40
42
|
t.ruby_opts += ["-w -Itest"]
|
41
|
-
t.test_files = FileList[
|
43
|
+
t.test_files = FileList["test/to_ruby/*_test.rb"]
|
42
44
|
end
|
43
45
|
|
44
46
|
Rake::TestTask.new(:full) do |t|
|
45
|
-
t.libs = [
|
47
|
+
t.libs = ["lib"]
|
46
48
|
t.ruby_opts += ["-w -Itest"]
|
47
|
-
t.test_files = FileList[
|
49
|
+
t.test_files = FileList["test/full/*_test.rb"]
|
48
50
|
end
|
49
51
|
|
50
52
|
task all: [:main, :base, :ast_load, :to_ast, :to_ruby, :full]
|
@@ -57,4 +59,4 @@ RDoc::Task.new(:rdoc) do |t|
|
|
57
59
|
t.rdoc_files.include("README.rdoc", "CHANGES.rdoc", "lib")
|
58
60
|
end
|
59
61
|
|
60
|
-
task default:
|
62
|
+
task default: "test:all"
|
data/lib/live_ast.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
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,24 +1,27 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
3
|
+
require "thread"
|
4
|
+
|
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)
|
10
12
|
|
11
13
|
module LiveAST
|
12
|
-
NATIVE_EVAL = Kernel.method(:eval)
|
14
|
+
NATIVE_EVAL = Kernel.method(:eval) #:nodoc:
|
13
15
|
|
14
16
|
class << self
|
15
|
-
attr_writer :parser
|
17
|
+
attr_writer :parser #:nodoc:
|
16
18
|
|
17
|
-
def parser
|
18
|
-
@parser ||=
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
def parser #:nodoc:
|
20
|
+
@parser ||=
|
21
|
+
begin
|
22
|
+
require "live_ast/ruby_parser"
|
23
|
+
LiveAST::RubyParser
|
24
|
+
end
|
22
25
|
end
|
23
26
|
|
24
27
|
#
|
@@ -26,7 +29,7 @@ module LiveAST
|
|
26
29
|
#
|
27
30
|
# Equivalent to <code>obj.to_ast</code>.
|
28
31
|
#
|
29
|
-
def ast(obj)
|
32
|
+
def ast(obj) #:nodoc:
|
30
33
|
case obj
|
31
34
|
when Method, UnboundMethod
|
32
35
|
Linker.find_method_ast(obj.owner, obj.name, *obj.source_location)
|
@@ -50,7 +53,7 @@ module LiveAST
|
|
50
53
|
#
|
51
54
|
# Equivalent to <code>Kernel#ast_eval</code>.
|
52
55
|
#
|
53
|
-
def eval(*args)
|
56
|
+
def eval(*args) #:nodoc:
|
54
57
|
Evaler.eval(args[0], *args)
|
55
58
|
end
|
56
59
|
|
@@ -59,14 +62,14 @@ module LiveAST
|
|
59
62
|
#
|
60
63
|
# Equivalent to <code>Kernel#ast_load</code>.
|
61
64
|
#
|
62
|
-
def load(file, wrap = false)
|
65
|
+
def load(file, wrap = false) #:nodoc:
|
63
66
|
Loader.load(file, wrap)
|
64
67
|
end
|
65
68
|
|
66
69
|
#
|
67
70
|
# strip the revision token from a string
|
68
71
|
#
|
69
|
-
def strip_token(file)
|
72
|
+
def strip_token(file) #:nodoc:
|
70
73
|
file.sub(/#{Regexp.quote Linker::REVISION_TOKEN}[a-z]+/, "")
|
71
74
|
end
|
72
75
|
end
|
data/lib/live_ast/common.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
module LiveAST
|
3
4
|
module Common
|
@@ -8,11 +9,16 @@ module LiveAST
|
|
8
9
|
rescue NameError
|
9
10
|
thing = arg.nil? ? nil : arg.class
|
10
11
|
|
11
|
-
message =
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
message = "no implicit conversion of #{thing.inspect} into String"
|
13
|
+
raise TypeError, message
|
14
|
+
end
|
15
|
+
|
16
|
+
def arg_to_str2(arg)
|
17
|
+
arg.to_str
|
18
|
+
rescue NameError
|
19
|
+
thing = arg.nil? ? nil : arg.class
|
20
|
+
|
21
|
+
message = "wrong argument type #{thing.inspect} (expected String)"
|
16
22
|
raise TypeError, message
|
17
23
|
end
|
18
24
|
|
@@ -21,17 +27,14 @@ module LiveAST
|
|
21
27
|
|
22
28
|
range = 0 if range == (0..0)
|
23
29
|
|
24
|
-
|
25
|
-
|
30
|
+
message = "wrong number of arguments (given #{args.size}, expected #{range})"
|
31
|
+
raise ArgumentError, message
|
26
32
|
end
|
27
33
|
|
28
34
|
def check_is_binding(obj)
|
29
35
|
return if obj.is_a? Binding
|
30
|
-
|
31
|
-
|
32
|
-
else
|
33
|
-
"wrong argument type #{obj.class} (expected binding)"
|
34
|
-
end
|
36
|
+
|
37
|
+
message = "wrong argument type #{obj.class} (expected binding)"
|
35
38
|
raise TypeError, message
|
36
39
|
end
|
37
40
|
|
@@ -41,7 +44,7 @@ module LiveAST
|
|
41
44
|
if bind
|
42
45
|
case location.size
|
43
46
|
when 0
|
44
|
-
|
47
|
+
bind.source_location
|
45
48
|
when 1
|
46
49
|
[location.first, 1]
|
47
50
|
else
|
data/lib/live_ast/error.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module LiveAST
|
2
|
-
class MultipleDefinitionsOnSameLineError <
|
4
|
+
class MultipleDefinitionsOnSameLineError < RuntimeError
|
3
5
|
def message
|
4
6
|
"AST requested for a method or block that shares a line " \
|
5
7
|
"with another method or block."
|
data/lib/live_ast/evaler.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module LiveAST
|
2
4
|
module Evaler
|
3
5
|
class << self
|
@@ -9,13 +11,13 @@ module LiveAST
|
|
9
11
|
file, line = location_for_eval(bind, *rest)
|
10
12
|
file = LiveAST.strip_token(file)
|
11
13
|
|
12
|
-
key,
|
14
|
+
key, = Linker.new_cache_synced(parser_source, file, line, false)
|
13
15
|
|
14
16
|
begin
|
15
17
|
NATIVE_EVAL.call(evaler_source, bind, key, line)
|
16
|
-
rescue Exception =>
|
17
|
-
|
18
|
-
raise
|
18
|
+
rescue Exception => e
|
19
|
+
e.backtrace.map! { |s| LiveAST.strip_token s }
|
20
|
+
raise e
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
data/lib/live_ast/full.rb
CHANGED
data/lib/live_ast/irb_spy.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
module LiveAST
|
3
4
|
@history = nil
|
@@ -7,20 +8,24 @@ module LiveAST
|
|
7
8
|
attr_writer :history
|
8
9
|
|
9
10
|
def code_at(line)
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
code = +""
|
12
|
+
checked_history[line..].each do |code_line|
|
13
|
+
code << code_line << "\n"
|
14
|
+
return code if can_parse code
|
13
15
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
end
|
17
|
+
|
18
|
+
def can_parse(code)
|
19
|
+
LiveAST.parser.new.parse(code)
|
20
|
+
rescue StandardError
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
def checked_history
|
25
|
+
return @history if @history
|
26
|
+
|
27
|
+
raise NotImplementedError,
|
28
|
+
"LiveAST cannot access history for this IRB input method"
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -28,7 +33,7 @@ end
|
|
28
33
|
|
29
34
|
[
|
30
35
|
defined?(IRB::StdioInputMethod) ? IRB::StdioInputMethod : nil,
|
31
|
-
defined?(IRB::ReadlineInputMethod) ? IRB::ReadlineInputMethod : nil
|
36
|
+
defined?(IRB::ReadlineInputMethod) ? IRB::ReadlineInputMethod : nil
|
32
37
|
].compact.each do |klass|
|
33
38
|
klass.module_eval do
|
34
39
|
alias_method :live_ast_original_gets, :gets
|