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.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.rdoc +27 -1
  3. data/README.rdoc +12 -12
  4. data/Rakefile +22 -20
  5. data/lib/live_ast.rb +6 -4
  6. data/lib/live_ast/ast_eval.rb +3 -1
  7. data/lib/live_ast/ast_load.rb +3 -1
  8. data/lib/live_ast/base.rb +22 -19
  9. data/lib/live_ast/common.rb +16 -13
  10. data/lib/live_ast/error.rb +3 -1
  11. data/lib/live_ast/evaler.rb +6 -4
  12. data/lib/live_ast/full.rb +4 -2
  13. data/lib/live_ast/irb_spy.rb +19 -14
  14. data/lib/live_ast/linker.rb +6 -4
  15. data/lib/live_ast/loader.rb +11 -9
  16. data/lib/live_ast/reader.rb +5 -3
  17. data/lib/live_ast/replace_eval.rb +20 -36
  18. data/lib/live_ast/replace_load.rb +4 -2
  19. data/lib/live_ast/replace_raise.rb +6 -4
  20. data/lib/live_ast/ruby_parser.rb +9 -8
  21. data/lib/live_ast/ruby_parser/test.rb +17 -4
  22. data/lib/live_ast/ruby_parser/unparser.rb +3 -1
  23. data/lib/live_ast/to_ast.rb +15 -18
  24. data/lib/live_ast/to_ruby.rb +10 -18
  25. data/lib/live_ast/version.rb +3 -1
  26. data/test/alias_test.rb +3 -2
  27. data/test/ast_eval/ast_eval_test.rb +4 -2
  28. data/test/ast_load/ast_load_test.rb +8 -6
  29. data/test/attr_test.rb +3 -1
  30. data/test/backtrace_test.rb +7 -5
  31. data/test/base/noninvasive_test.rb +3 -1
  32. data/test/base/reload_test.rb +7 -5
  33. data/test/covert_define_method_test.rb +3 -1
  34. data/test/def_test.rb +3 -1
  35. data/test/define_method_test.rb +4 -2
  36. data/test/define_singleton_method_test.rb +3 -1
  37. data/test/encoding_test.rb +20 -24
  38. data/test/error_test.rb +5 -3
  39. data/test/eval_test.rb +3 -1
  40. data/test/flush_cache_test.rb +5 -1
  41. data/test/full/ast_reload_test.rb +7 -5
  42. data/test/full/replace_eval_test.rb +21 -13
  43. data/test/irb_test.rb +28 -10
  44. data/test/lambda_test.rb +4 -2
  45. data/test/load_path_test.rb +10 -11
  46. data/test/load_test.rb +5 -3
  47. data/test/main.rb +27 -25
  48. data/test/nested_test.rb +3 -1
  49. data/test/readme_test.rb +5 -3
  50. data/test/recursive_eval_test.rb +3 -1
  51. data/test/redefine_method_test.rb +3 -1
  52. data/test/rubygems_test.rb +6 -4
  53. data/test/rubyspec_test.rb +29 -29
  54. data/test/singleton_test.rb +3 -1
  55. data/test/stdlib_test.rb +3 -1
  56. data/test/thread_test.rb +5 -3
  57. data/test/to_ast/to_ast_feature_test.rb +4 -2
  58. data/test/to_ruby/to_ruby_feature_test.rb +4 -2
  59. data/test/to_ruby/to_ruby_test.rb +100 -96
  60. metadata +85 -73
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 53bc1d58d2c1645ff3d34a4f5f6df3e34a8fb352
4
- data.tar.gz: 6e52ea854d98d13be30b16bd6e3e2acb9933b9ba
2
+ SHA256:
3
+ metadata.gz: e96ab3dab36ef2a9b745f3a878b71b79bb8b8ecfd870b0c8ad29dcef5520a943
4
+ data.tar.gz: b8b7f606c175caff1522b70db8287392160d8352e44f57fca8e6709011599bd5
5
5
  SHA512:
6
- metadata.gz: 139a51f52879ec099027541c3826d807eafff81b0e2d06352d7c62ba5d971c143608224213e7fa2a6f1273a5b4eff5d4c2456c7c56e2614714489d9ffc44e5d0
7
- data.tar.gz: 9c7397ca3f90654b71cc0ef9c904f7432e5548a249a1c69200eda4f17e8ade860fd0c4f1ac59cac8c0f93d6ddfe1d268986468220f31cdfe422bb4674fc14461
6
+ metadata.gz: ac889c697aa0c722078437135a3c57db7b05126178920e1224e4728616ab38cabbcb682d6eae3194a9361f2032400a6b55d2e89726f95abe006fa33d9e8c6ef9
7
+ data.tar.gz: ecc774511be6e4bb0d89559c8e6186ec766aa30ad31376f6e310ef5e9d0e116f603b648ce1a8f8a722116daadc1150913bdcbb977ed653c2784b0e84525c59c7
@@ -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
@@ -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), s(:args), s(:str, "foo"))
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), s(:args), s(:str, "bar"))
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), s(:args), s(:str, "dynamic3"))
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), s(:args), s(:str, "dynamic1"))
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 1.9.2 or higher is required.
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), s(:args), s(:str, "dynamic3"))
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 +binding_of_caller+ gem
133
- (https://github.com/banister/binding_of_caller).
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), s(:args), s(:str, "dynamic1"))
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
- +binding_of_caller+ should work with <code>live_ast/full</code>.
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), s(:args))
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), s(:args))
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
- require 'rake/clean'
2
- require 'bundler/gem_tasks'
3
- require 'rake/testtask'
4
- require 'rdoc/task'
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 'run tests'
9
+ desc "run tests"
8
10
  Rake::TestTask.new(:main) do |t|
9
- t.libs = ['lib']
11
+ t.libs = ["lib"]
10
12
  t.ruby_opts += ["-w -Itest"]
11
- t.test_files = FileList['test/*_test.rb']
13
+ t.test_files = FileList["test/*_test.rb"]
12
14
  end
13
15
 
14
16
  Rake::TestTask.new(:base) do |t|
15
- t.libs = ['lib']
17
+ t.libs = ["lib"]
16
18
  t.ruby_opts += ["-w -Itest"]
17
- t.test_files = FileList['test/base/*_test.rb']
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 = ['lib']
23
+ t.libs = ["lib"]
22
24
  t.ruby_opts += ["-w -Itest"]
23
- t.test_files = FileList['test/ast_load/*_test.rb']
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 = ['lib']
29
+ t.libs = ["lib"]
28
30
  t.ruby_opts += ["-w -Itest"]
29
- t.test_files = FileList['test/ast_eval/*_test.rb']
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 = ['lib']
35
+ t.libs = ["lib"]
34
36
  t.ruby_opts += ["-w -Itest"]
35
- t.test_files = FileList['test/to_ast/*_test.rb']
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 = ['lib']
41
+ t.libs = ["lib"]
40
42
  t.ruby_opts += ["-w -Itest"]
41
- t.test_files = FileList['test/to_ruby/*_test.rb']
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 = ['lib']
47
+ t.libs = ["lib"]
46
48
  t.ruby_opts += ["-w -Itest"]
47
- t.test_files = FileList['test/full/*_test.rb']
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: 'test:all'
62
+ task default: "test:all"
@@ -1,4 +1,6 @@
1
- require 'live_ast/base'
2
- require 'live_ast/to_ast'
3
- require 'live_ast/ast_eval'
4
- require 'live_ast/replace_load'
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"
@@ -1,4 +1,6 @@
1
- require 'live_ast/base'
1
+ # frozen_string_literal: true
2
+
3
+ require "live_ast/base"
2
4
 
3
5
  module Kernel
4
6
  private
@@ -1,4 +1,6 @@
1
- require 'live_ast/base'
1
+ # frozen_string_literal: true
2
+
3
+ require "live_ast/base"
2
4
 
3
5
  module Kernel
4
6
  private
@@ -1,24 +1,27 @@
1
- require 'thread'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'live_ast/common'
4
- require 'live_ast/reader'
5
- require 'live_ast/evaler'
6
- require 'live_ast/linker'
7
- require 'live_ast/loader'
8
- require 'live_ast/error'
9
- require 'live_ast/irb_spy' if defined?(IRB)
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) #:nodoc:
14
+ NATIVE_EVAL = Kernel.method(:eval) #:nodoc:
13
15
 
14
16
  class << self
15
- attr_writer :parser #:nodoc:
17
+ attr_writer :parser #:nodoc:
16
18
 
17
- def parser #:nodoc:
18
- @parser ||= (
19
- require 'live_ast/ruby_parser'
20
- LiveAST::RubyParser
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) #:nodoc:
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) #:nodoc:
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) #:nodoc:
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) #:nodoc:
72
+ def strip_token(file) #:nodoc:
70
73
  file.sub(/#{Regexp.quote Linker::REVISION_TOKEN}[a-z]+/, "")
71
74
  end
72
75
  end
@@ -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 = if RUBY_VERSION < "2.0.0"
12
- "can't convert #{thing.inspect} into String"
13
- else
14
- "no implicit conversion of #{thing.inspect} into String"
15
- end
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
- raise ArgumentError,
25
- "wrong number of arguments (#{args.size} for #{range})"
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
- message = if RUBY_VERSION < "2.1.0"
31
- "wrong argument type #{obj.class} (expected Binding)"
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
- NATIVE_EVAL.call("[__FILE__, __LINE__]", bind)
47
+ bind.source_location
45
48
  when 1
46
49
  [location.first, 1]
47
50
  else
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LiveAST
2
- class MultipleDefinitionsOnSameLineError < ScriptError
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."
@@ -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, _ = Linker.new_cache_synced(parser_source, file, line, false)
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 => ex
17
- ex.backtrace.map! { |s| LiveAST.strip_token s }
18
- raise ex
18
+ rescue Exception => e
19
+ e.backtrace.map! { |s| LiveAST.strip_token s }
20
+ raise e
19
21
  end
20
22
  end
21
23
 
@@ -1,2 +1,4 @@
1
- require 'live_ast'
2
- require 'live_ast/replace_eval'
1
+ # frozen_string_literal: true
2
+
3
+ require "live_ast"
4
+ require "live_ast/replace_eval"
@@ -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
- unless @history
11
- raise NotImplementedError,
12
- "LiveAST cannot access history for this IRB input method"
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
- grow = 0
15
- begin
16
- code = @history[line..(line + grow)].join
17
- LiveAST.parser.new.parse(code) or raise "#{LiveAST.parser} error"
18
- rescue
19
- grow += 1
20
- retry if line + grow < @history.size
21
- raise
22
- end
23
- code
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