mvz-live_ast 1.3.0 → 2.1.0

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +21 -1
  3. data/README.rdoc +17 -3
  4. data/lib/live_ast/ast_eval.rb +3 -1
  5. data/lib/live_ast/ast_load.rb +3 -1
  6. data/lib/live_ast/base.rb +20 -19
  7. data/lib/live_ast/common.rb +11 -1
  8. data/lib/live_ast/error.rb +2 -0
  9. data/lib/live_ast/evaler.rb +5 -3
  10. data/lib/live_ast/full.rb +4 -2
  11. data/lib/live_ast/irb_spy.rb +7 -5
  12. data/lib/live_ast/linker.rb +6 -2
  13. data/lib/live_ast/loader.rb +7 -2
  14. data/lib/live_ast/reader.rb +4 -3
  15. data/lib/live_ast/replace_caller.rb +14 -0
  16. data/lib/live_ast/replace_eval.rb +15 -14
  17. data/lib/live_ast/replace_load.rb +3 -1
  18. data/lib/live_ast/replace_raise.rb +5 -3
  19. data/lib/live_ast/ruby_parser/test.rb +13 -0
  20. data/lib/live_ast/ruby_parser/unparser.rb +3 -1
  21. data/lib/live_ast/ruby_parser.rb +6 -4
  22. data/lib/live_ast/to_ast.rb +15 -18
  23. data/lib/live_ast/to_ruby.rb +10 -18
  24. data/lib/live_ast/version.rb +3 -1
  25. data/lib/live_ast.rb +6 -4
  26. metadata +106 -134
  27. data/Rakefile +0 -60
  28. data/devel/levitate.rb +0 -184
  29. data/devel/levitate_config.rb +0 -4
  30. data/test/alias_test.rb +0 -23
  31. data/test/ast_eval/ast_eval_test.rb +0 -11
  32. data/test/ast_load/ast_load_test.rb +0 -45
  33. data/test/attr_test.rb +0 -24
  34. data/test/backtrace_test.rb +0 -159
  35. data/test/base/noninvasive_test.rb +0 -53
  36. data/test/base/reload_test.rb +0 -41
  37. data/test/covert_define_method_test.rb +0 -23
  38. data/test/def_test.rb +0 -35
  39. data/test/define_method_test.rb +0 -67
  40. data/test/define_singleton_method_test.rb +0 -15
  41. data/test/encoding_test/bad.rb +0 -1
  42. data/test/encoding_test/cp932.rb +0 -6
  43. data/test/encoding_test/default.rb +0 -5
  44. data/test/encoding_test/eucjp.rb +0 -6
  45. data/test/encoding_test/koi8.rb +0 -6
  46. data/test/encoding_test/koi8_shebang.rb +0 -7
  47. data/test/encoding_test/koi8_with_utf8bom.rb +0 -6
  48. data/test/encoding_test/usascii.rb +0 -6
  49. data/test/encoding_test/usascii_with_utf8bom.rb +0 -6
  50. data/test/encoding_test/utf8.rb +0 -6
  51. data/test/encoding_test/utf8bom.rb +0 -6
  52. data/test/encoding_test/utf8bom_only.rb +0 -5
  53. data/test/encoding_test/utf8dos.rb +0 -6
  54. data/test/encoding_test/utf8mac.rb +0 -6
  55. data/test/encoding_test/utf8mac_alt.rb +0 -6
  56. data/test/encoding_test/utf8unix.rb +0 -6
  57. data/test/encoding_test.rb +0 -52
  58. data/test/error_test.rb +0 -116
  59. data/test/eval_test.rb +0 -269
  60. data/test/flush_cache_test.rb +0 -98
  61. data/test/full/ast_reload_test.rb +0 -39
  62. data/test/full/replace_eval_test.rb +0 -431
  63. data/test/irb_test.rb +0 -41
  64. data/test/lambda_test.rb +0 -63
  65. data/test/load_path_test.rb +0 -75
  66. data/test/load_test.rb +0 -123
  67. data/test/main.rb +0 -129
  68. data/test/nested_test.rb +0 -29
  69. data/test/readme_test.rb +0 -14
  70. data/test/recursive_eval_test.rb +0 -51
  71. data/test/redefine_method_test.rb +0 -83
  72. data/test/rubygems_test.rb +0 -25
  73. data/test/rubyspec_test.rb +0 -37
  74. data/test/singleton_test.rb +0 -25
  75. data/test/stdlib_test.rb +0 -13
  76. data/test/thread_test.rb +0 -43
  77. data/test/to_ast/to_ast_feature_test.rb +0 -11
  78. data/test/to_ruby/to_ruby_feature_test.rb +0 -11
  79. data/test/to_ruby/to_ruby_test.rb +0 -99
data/test/main.rb DELETED
@@ -1,129 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
-
3
- # require first for stdlib_test
4
- require 'pp'
5
- require 'find'
6
- require 'fileutils'
7
-
8
- require 'minitest/mock'
9
- require 'minitest/autorun'
10
-
11
- $VERBOSE = true
12
-
13
- require 'live_ast/base'
14
-
15
- def define_unsorted_test_case(name, superclass, &block)
16
- klass = Class.new superclass, &block
17
- letter = ('A'..'Z').to_a[rand(26)]
18
- Object.const_set "#{letter}#{name}", klass
19
- end
20
-
21
- class JLMiniTest < MiniTest::Test
22
- def self.test_methods
23
- default = super
24
- onlies = default.select { |m| m =~ /__only\Z/ }
25
- if onlies.empty?
26
- default
27
- else
28
- puts "\nNOTE: running ONLY *__only tests for #{self}"
29
- onlies
30
- end
31
- end
32
-
33
- def delim(char)
34
- "\n" << (char * 72) << "\n"
35
- end
36
-
37
- def mu_pp(obj)
38
- delim("_") <<
39
- obj.pretty_inspect.chomp <<
40
- delim("=")
41
- end
42
-
43
- def unfixable
44
- yield
45
- raise "claimed to be unfixable, but assertion succeeded"
46
- rescue MiniTest::Assertion
47
- end
48
-
49
- def assert_nothing_raised
50
- yield
51
- assert_nil nil
52
- rescue StandardError => ex
53
- raise MiniTest::Assertion,
54
- exception_details(ex, "Expected nothing raised, but got:")
55
- end
56
-
57
- %w(
58
- empty equal in_delta in_epsilon includes instance_of
59
- kind_of match nil operator respond_to same
60
- ).each { |name|
61
- alias_method "assert_not_#{name}", "refute_#{name}"
62
- }
63
- end
64
-
65
- class BaseTest < JLMiniTest
66
- include LiveAST.parser::Test
67
-
68
- DATA_DIR = File.expand_path(File.dirname(__FILE__) + "/data")
69
-
70
- def self.stdlib_has_source?
71
- RUBY_ENGINE != "jruby"
72
- end
73
-
74
- def temp_file(code, basename = nil)
75
- basename ||= ('a'..'z').to_a.shuffle.join + ".rb"
76
- path = DATA_DIR + "/" + basename
77
-
78
- write_file path, code if code
79
- begin
80
- yield path
81
- ensure
82
- FileUtils.rm_f path
83
- end
84
- end
85
-
86
- def write_file(file, contents)
87
- File.open(file, "w") { |f| f.print contents }
88
- end
89
-
90
- def return_block(&block)
91
- block
92
- end
93
-
94
- def exception_backtrace
95
- yield
96
- rescue Exception => e
97
- e.backtrace
98
- end
99
-
100
- def ignore(*_args); end
101
- end
102
-
103
- class RegularTest < BaseTest
104
- def setup
105
- super
106
- require 'live_ast'
107
- end
108
- end
109
-
110
- class ReplaceEvalTest < BaseTest
111
- def initialize(*args)
112
- super
113
- ok = begin
114
- require 'live_ast/full'
115
- true
116
- rescue LoadError
117
- raise "need: gem install binding_of_caller" if RUBY_ENGINE == "ruby"
118
- false
119
- end
120
-
121
- return if ok
122
- self.class.class_eval do
123
- instance_methods(false).each do |m|
124
- remove_method(m)
125
- define_method(m) {}
126
- end
127
- end
128
- end
129
- end
data/test/nested_test.rb DELETED
@@ -1,29 +0,0 @@
1
- require_relative 'main'
2
-
3
- class NestedTest < RegularTest
4
- def test_lambda
5
- a = lambda {
6
- lambda {
7
- "33"
8
- }
9
- }
10
-
11
- assert_equal nested_lambdas("33"), a.to_ast
12
- assert_equal no_arg_block(:lambda, "33"), a.call.to_ast
13
- end
14
-
15
- class A
16
- def f
17
- Class.new do
18
- def g
19
- "44"
20
- end
21
- end
22
- end
23
- end
24
-
25
- def test_defs
26
- assert_equal nested_defs(:f, :g, "44"), A.instance_method(:f).to_ast
27
- assert_equal no_arg_def(:g, "44"), A.new.f.instance_method(:g).to_ast
28
- end
29
- end
data/test/readme_test.rb DELETED
@@ -1,14 +0,0 @@
1
- require_relative 'main'
2
- require_relative '../devel/levitate'
3
-
4
- if RUBY_ENGINE != "jruby" # jruby takes about a minute
5
- sections = [
6
- "Synopsis",
7
- "+to_ruby+",
8
- "Noninvasive Interface",
9
- "Pure Ruby and +ast_eval+",
10
- "Full Integration",
11
- ]
12
-
13
- Levitate.doc_to_test("README.rdoc", *sections)
14
- end
@@ -1,51 +0,0 @@
1
- require_relative 'main'
2
-
3
- class RecursiveEvalTest < RegularTest
4
- DEFINE = lambda do
5
- ast_eval %{
6
- class A
7
- ast_eval %{
8
- def f
9
- "A#f"
10
- end
11
- }, binding
12
-
13
- ast_eval %{
14
- ast_eval %{
15
- remove_method :f
16
- def f(x, y)
17
- x + y
18
- end
19
-
20
- def g
21
- "A#g"
22
- end
23
- }, binding
24
-
25
- LAMBDA = ast_eval %{
26
- lambda { |x, y| x * y }
27
- }, binding
28
- }, binding
29
- end
30
- }, binding
31
- end
32
-
33
- def test_method
34
- defined?(A) or DEFINE.call
35
- assert_equal "#{self.class}::A", A.name
36
-
37
- assert_equal binop_def(:f, :+),
38
- A.instance_method(:f).to_ast
39
-
40
- assert_equal no_arg_def(:g, "A#g"),
41
- A.instance_method(:g).to_ast
42
- end
43
-
44
- def test_lambda
45
- defined?(A) or DEFINE.call
46
- assert_equal "#{self.class}::A", A.name
47
-
48
- assert_equal binop_block(:lambda, :*),
49
- A::LAMBDA.to_ast
50
- end
51
- end
@@ -1,83 +0,0 @@
1
- require_relative 'main'
2
-
3
- class RedefineMethodTest < RegularTest
4
- DEFINE_A = lambda do
5
- class A
6
- def f
7
- "old A#f"
8
- end
9
-
10
- PREVIOUS_Af = instance_method(:f)
11
- remove_method :f
12
-
13
- def f(x, y)
14
- x * y
15
- end
16
- end
17
- end
18
-
19
- def test_inclass_redef
20
- DEFINE_A.call
21
-
22
- assert_equal binop_def(:f, :*),
23
- A.instance_method(:f).to_ast
24
-
25
- assert_equal no_arg_def(:f, "old A#f"),
26
- A::PREVIOUS_Af.to_ast
27
- end
28
-
29
- DEFINE_B = lambda do
30
- class B
31
- def f
32
- "old B#f"
33
- end
34
- end
35
- end
36
-
37
- def test_dynamic_redef
38
- DEFINE_B.call
39
-
40
- assert_equal "old B#f", B.new.f
41
- assert_equal no_arg_def(:f, "old B#f"), B.instance_method(:f).to_ast
42
-
43
- B.class_eval do
44
- remove_method :f
45
- define_method :f do |x, y|
46
- x - y
47
- end
48
- end
49
-
50
- assert_equal 11, B.new.f(44, 33)
51
-
52
- assert_equal binop_define_method(:f, :-),
53
- B.instance_method(:f).to_ast
54
- end
55
-
56
- DEFINE_C = lambda do
57
- class C
58
- def f
59
- "old C#f"
60
- end
61
- end
62
- end
63
-
64
- def test_dynamic_redef_with_eval
65
- DEFINE_C.call
66
-
67
- assert_equal "old C#f", C.new.f
68
-
69
- C.class_eval do
70
- ast_eval %{
71
- remove_method :f
72
- define_method :f do |x, y|
73
- x * y
74
- end
75
- }, binding
76
- end
77
-
78
- assert_equal 12, C.new.f(3, 4)
79
-
80
- assert_equal binop_define_method(:f, :*),
81
- C.instance_method(:f).to_ast
82
- end
83
- end
@@ -1,25 +0,0 @@
1
- require_relative 'main'
2
- require_relative '../devel/levitate'
3
-
4
- class RubygemsTest < RegularTest
5
- def test_rubygems
6
- lib = File.expand_path(File.dirname(__FILE__) + "/../lib")
7
- extra_req =
8
- if defined?(LiveASTRipper) && LiveAST.parser == LiveASTRipper
9
- %{require 'live_ast_ripper'}
10
- else
11
- ""
12
- end
13
- result = Levitate.run_code_and_capture %{
14
- $LOAD_PATH.unshift '#{lib}'
15
- #{extra_req}
16
- require 'live_ast/full'
17
- LiveAST.parser::Test
18
- f = eval %{
19
- lambda { 'abc' }
20
- }
21
- p f.to_ast
22
- }
23
- assert_equal no_arg_block(:lambda, 'abc').to_s, result.chomp
24
- end
25
- end
@@ -1,37 +0,0 @@
1
- require_relative 'main'
2
- require_relative '../devel/levitate'
3
-
4
- #
5
- # Tests against rubyspec branch which discards '|ast@' tokens
6
- #
7
- if ENV["LIVE_AST_RUBYSPEC_HOME"]
8
- class RubySpecTest < RegularTest
9
- FILES = [
10
- 'core/basicobject/instance_eval_spec.rb',
11
- 'core/binding/eval_spec.rb',
12
- 'core/kernel/eval_spec.rb',
13
- 'core/kernel/instance_eval_spec.rb',
14
- 'core/module/class_eval_spec.rb',
15
- 'core/module/module_eval_spec.rb',
16
- ].freeze
17
-
18
- def setup
19
- super
20
- puts "\n==== rubyspec"
21
- end
22
-
23
- FILES.each do |file|
24
- mname = "test_" + file.tr("/", "_").chop!.chop!.chop!
25
- define_method mname do
26
- Dir.chdir ENV["LIVE_AST_RUBYSPEC_HOME"] do
27
- cmd =
28
- ["mspec", "-t", Levitate.ruby_bin] +
29
- (["-T"] * Levitate.ruby_opts.size).zip(Levitate.ruby_opts).flatten +
30
- [file]
31
-
32
- assert system(*cmd)
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,25 +0,0 @@
1
- require_relative 'main'
2
-
3
- class SingletonTest < RegularTest
4
- class A
5
- def self.f
6
- "A.f"
7
- end
8
- end
9
-
10
- def test_self_dot
11
- expected = singleton_no_arg_def(:f, "A.f")
12
- assert_equal expected, A.method(:f).to_ast
13
- end
14
-
15
- class B
16
- def B.f(x, y)
17
- x + y
18
- end
19
- end
20
-
21
- def test_name_dot
22
- expected = singleton_binop_def(:B, :f, :+)
23
- assert_equal expected, B.method(:f).to_ast
24
- end
25
- end
data/test/stdlib_test.rb DELETED
@@ -1,13 +0,0 @@
1
- require_relative 'main'
2
-
3
- class StdlibTest < RegularTest
4
- if stdlib_has_source?
5
- def test_pp
6
- assert_not_nil method(:pp).to_ast
7
- end
8
-
9
- def test_find
10
- assert_not_nil Find.method(:find).to_ast
11
- end
12
- end
13
- end
data/test/thread_test.rb DELETED
@@ -1,43 +0,0 @@
1
- require_relative 'main'
2
-
3
- require 'thread'
4
-
5
- class ThreadTest < RegularTest
6
- def test_threads
7
- klass = nil
8
- mutex = Mutex.new
9
- stop = false
10
- results = []
11
- num_threads = 50
12
-
13
- workers = (0...num_threads).map {
14
- Thread.new {
15
- until stop
16
- if klass
17
- found = klass.instance_method(:f).to_ast
18
- mutex.synchronize {
19
- results << found
20
- }
21
- break
22
- end
23
- end
24
- }
25
- }
26
-
27
- klass = Class.new do
28
- def f
29
- "anon#f"
30
- end
31
- end
32
-
33
- sleep(0.2)
34
- stop = true
35
-
36
- workers.each(&:join)
37
-
38
- assert_equal num_threads, results.size
39
- results.each { |result|
40
- assert_equal no_arg_def(:f, "anon#f"), result
41
- }
42
- end
43
- end
@@ -1,11 +0,0 @@
1
- require 'main'
2
-
3
- require 'live_ast/to_ast'
4
-
5
- class ToASTFeatureTest < BaseTest
6
- def test_require
7
- [Method, UnboundMethod, Proc].each { |obj|
8
- assert obj.instance_methods.include?(:to_ast)
9
- }
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- require 'main'
2
-
3
- require 'live_ast/to_ruby'
4
-
5
- class ToRubyFeatureTest < BaseTest
6
- def test_defines_to_ruby
7
- [Method, UnboundMethod, Proc].each { |obj|
8
- assert obj.instance_methods.include?(:to_ruby)
9
- }
10
- end
11
- end
@@ -1,99 +0,0 @@
1
- require 'main'
2
-
3
- if LiveAST.parser::Test.respond_to?(:unparser_matches_ruby2ruby?) &&
4
- LiveAST.parser::Test.unparser_matches_ruby2ruby?
5
- class ToRubyTest < RegularTest
6
- def setup
7
- super
8
- require 'live_ast/to_ruby'
9
- end
10
-
11
- def test_lambda_0
12
- src = %{lambda { "moo" }}
13
- dst = ast_eval(src, binding).to_ruby
14
- assert_equal src, dst
15
- end
16
-
17
- def test_lambda_1
18
- src = %{lambda { |x| (x ** 2) }}
19
- dst = ast_eval(src, binding).to_ruby
20
- assert_equal src, dst
21
- end
22
-
23
- def test_lambda_2
24
- src = %{lambda { |x, y| (x + y) }}
25
- dst = ast_eval(src, binding).to_ruby
26
- assert_equal src, dst
27
- end
28
-
29
- def test_proc_0
30
- src = %{proc { "moo" }}
31
- dst = ast_eval(src, binding).to_ruby
32
- assert_equal src, dst
33
- end
34
-
35
- def test_proc_1
36
- src = %{proc { |x| (x ** 2) }}
37
- dst = ast_eval(src, binding).to_ruby
38
- assert_equal src, dst
39
- end
40
-
41
- def test_proc_2
42
- src = %{proc { |x, y| (x * y) }}
43
- dst = ast_eval(src, binding).to_ruby
44
- assert_equal src, dst
45
- end
46
-
47
- def test_block_0
48
- src = %{return_block { "moo" }}
49
- dst = ast_eval(src, binding).to_ruby
50
- assert_equal src, dst
51
- end
52
-
53
- def test_block_1
54
- src = %{return_block { |x| (x ** 2) }}
55
- dst = ast_eval(src, binding).to_ruby
56
- assert_equal src, dst
57
- end
58
-
59
- def test_block_2
60
- src = %{return_block { |x, y| (x - y) }}
61
- dst = ast_eval(src, binding).to_ruby
62
- assert_equal src, dst
63
- end
64
-
65
- def test_method_0
66
- src = %{def f\n "moo"\nend}
67
- dst = Class.new do
68
- ast_eval(src, binding)
69
- end.instance_method(:f).to_ruby
70
- assert_equal src, dst
71
- end
72
-
73
- def test_method_1
74
- src = %{def f(x)\n (x ** 2)\nend}
75
- dst = Class.new do
76
- ast_eval(src, binding)
77
- end.instance_method(:f).to_ruby
78
- assert_equal src, dst
79
- end
80
-
81
- def test_method_2
82
- src = %{def f(x, y)\n (x / y)\nend}
83
- dst = Class.new do
84
- ast_eval(src, binding)
85
- end.instance_method(:f).to_ruby
86
- assert_equal src, dst
87
- end
88
-
89
- def test_to_ast_after_to_ruby
90
- src = %{lambda { "moo" }}
91
- expected_ast = ast_eval(src, binding).to_ast
92
-
93
- lmb = ast_eval(src, binding)
94
- lmb.to_ruby
95
-
96
- assert_equal expected_ast, lmb.to_ast
97
- end
98
- end
99
- end