mvz-live_ast 2.0.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.rdoc +5 -0
  3. data/README.rdoc +14 -0
  4. data/lib/live_ast/base.rb +7 -9
  5. data/lib/live_ast/irb_spy.rb +1 -1
  6. data/lib/live_ast/replace_caller.rb +14 -0
  7. data/lib/live_ast/version.rb +1 -1
  8. metadata +75 -116
  9. data/Rakefile +0 -62
  10. data/devel/levitate.rb +0 -184
  11. data/devel/levitate_config.rb +0 -4
  12. data/test/alias_test.rb +0 -25
  13. data/test/ast_eval/ast_eval_test.rb +0 -13
  14. data/test/ast_load/ast_load_test.rb +0 -47
  15. data/test/attr_test.rb +0 -26
  16. data/test/backtrace_test.rb +0 -161
  17. data/test/base/noninvasive_test.rb +0 -55
  18. data/test/base/reload_test.rb +0 -43
  19. data/test/covert_define_method_test.rb +0 -25
  20. data/test/def_test.rb +0 -37
  21. data/test/define_method_test.rb +0 -69
  22. data/test/define_singleton_method_test.rb +0 -17
  23. data/test/encoding_test/bad.rb +0 -1
  24. data/test/encoding_test/cp932.rb +0 -6
  25. data/test/encoding_test/default.rb +0 -5
  26. data/test/encoding_test/eucjp.rb +0 -6
  27. data/test/encoding_test/koi8.rb +0 -6
  28. data/test/encoding_test/koi8_shebang.rb +0 -7
  29. data/test/encoding_test/koi8_with_utf8bom.rb +0 -6
  30. data/test/encoding_test/usascii.rb +0 -6
  31. data/test/encoding_test/usascii_with_utf8bom.rb +0 -6
  32. data/test/encoding_test/utf8.rb +0 -6
  33. data/test/encoding_test/utf8bom.rb +0 -6
  34. data/test/encoding_test/utf8bom_only.rb +0 -5
  35. data/test/encoding_test/utf8dos.rb +0 -6
  36. data/test/encoding_test/utf8mac.rb +0 -6
  37. data/test/encoding_test/utf8mac_alt.rb +0 -6
  38. data/test/encoding_test/utf8unix.rb +0 -6
  39. data/test/encoding_test.rb +0 -54
  40. data/test/error_test.rb +0 -118
  41. data/test/eval_test.rb +0 -271
  42. data/test/flush_cache_test.rb +0 -102
  43. data/test/full/ast_reload_test.rb +0 -41
  44. data/test/full/replace_eval_test.rb +0 -433
  45. data/test/irb_test.rb +0 -43
  46. data/test/lambda_test.rb +0 -65
  47. data/test/load_path_test.rb +0 -77
  48. data/test/load_test.rb +0 -125
  49. data/test/main.rb +0 -134
  50. data/test/nested_test.rb +0 -31
  51. data/test/readme_test.rb +0 -16
  52. data/test/recursive_eval_test.rb +0 -53
  53. data/test/redefine_method_test.rb +0 -85
  54. data/test/rubygems_test.rb +0 -27
  55. data/test/rubyspec_test.rb +0 -39
  56. data/test/singleton_test.rb +0 -27
  57. data/test/stdlib_test.rb +0 -15
  58. data/test/thread_test.rb +0 -45
  59. data/test/to_ast/to_ast_feature_test.rb +0 -13
  60. data/test/to_ruby/to_ruby_feature_test.rb +0 -13
  61. data/test/to_ruby/to_ruby_test.rb +0 -101
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "main"
4
-
5
- require "live_ast/ast_load"
6
-
7
- class AstLoadTest < BaseTest
8
- include FileUtils
9
-
10
- def test_defines_ast_load
11
- assert private_methods.include?(:ast_load)
12
- end
13
-
14
- def test_reloading
15
- noninvasive_ast_reload
16
- end
17
-
18
- def noninvasive_ast_reload
19
- code1 = %{
20
- class AstLoadTest::B
21
- def f
22
- "first B#f"
23
- end
24
- end
25
- }
26
-
27
- code2 = %{
28
- class AstLoadTest::B
29
- def f
30
- "second B#f"
31
- end
32
- end
33
- }
34
-
35
- temp_file code1 do |file|
36
- load file
37
-
38
- LiveAST.ast(B.instance_method(:f))
39
-
40
- write_file file, code2
41
- ast_load file
42
-
43
- assert_equal no_arg_def(:f, "second B#f"),
44
- LiveAST.ast(B.instance_method(:f))
45
- end
46
- end
47
- end
data/test/attr_test.rb DELETED
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class AttrTest < RegularTest
6
- class A
7
- attr_accessor :f
8
- attr_reader :g
9
- attr_writer :h
10
- end
11
-
12
- def test_attr
13
- assert_raises LiveAST::ASTNotFoundError do
14
- A.instance_method(:f).to_ast
15
- end
16
- assert_raises LiveAST::ASTNotFoundError do
17
- A.instance_method(:f=).to_ast
18
- end
19
- assert_raises LiveAST::ASTNotFoundError do
20
- A.instance_method(:g).to_ast
21
- end
22
- assert_raises LiveAST::ASTNotFoundError do
23
- A.instance_method(:h=).to_ast
24
- end
25
- end
26
- end
@@ -1,161 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- # test for raise redefinition side-effects: unsort this TestCase from
6
- # other TestCases.
7
-
8
- define_unsorted_test_case "BacktraceTest", RegularTest do
9
- def test_raise_in_eval
10
- 3.times do
11
- orig = exception_backtrace do
12
- eval %{
13
-
14
- raise
15
-
16
-
17
- }, binding, "somewhere", 1000
18
- end
19
-
20
- live = exception_backtrace do
21
- ast_eval %{
22
-
23
- raise
24
-
25
-
26
- }, binding, "somewhere", 1000
27
- end
28
-
29
- assert_equal orig.first, live.first
30
- assert_match(/somewhere:1002/, live.first)
31
- end
32
- end
33
-
34
- def test_raise_no_overrides
35
- 3.times do
36
- orig = exception_backtrace do
37
- eval %{
38
-
39
-
40
- raise
41
-
42
- }, binding, __FILE__, (__LINE__ + 9)
43
- end
44
-
45
- live = exception_backtrace do
46
- ast_eval %{
47
-
48
-
49
- raise
50
-
51
- }, binding
52
- end
53
-
54
- assert_equal orig.first, live.first
55
- here = Regexp.quote __FILE__
56
- assert_match(/#{here}/, live.first)
57
- end
58
- end
59
-
60
- def test_raise_using_overrides
61
- 3.times do
62
- orig = exception_backtrace do
63
- eval %{
64
-
65
-
66
- raise
67
-
68
- }, binding, __FILE__, (__LINE__ + 9)
69
- end
70
-
71
- live = exception_backtrace do
72
- ast_eval %{
73
-
74
-
75
- raise
76
-
77
- }, binding, __FILE__, __LINE__
78
- end
79
-
80
- assert_equal orig.first, live.first
81
- here = Regexp.quote __FILE__
82
- assert_match(/#{here}/, live.first)
83
- end
84
- end
85
-
86
- def test_raise_using_only_file_override
87
- 3.times do
88
- orig = exception_backtrace do
89
- eval %{
90
-
91
-
92
- raise
93
-
94
- }, binding, __FILE__
95
- end
96
-
97
- live = exception_backtrace do
98
- ast_eval %{
99
-
100
-
101
- raise
102
-
103
- }, binding, __FILE__
104
- end
105
-
106
- assert_equal orig.first, live.first
107
- here = Regexp.quote __FILE__
108
- assert_match(/#{here}/, live.first)
109
- end
110
- end
111
-
112
- def test_raise_after_eval
113
- raise_after_eval("raise", false)
114
- raise_after_eval("1/0", false)
115
-
116
- require "live_ast/replace_raise"
117
-
118
- raise_after_eval("raise", true)
119
- raise_after_eval("1/0", false)
120
- end
121
-
122
- def raise_after_eval(code, will_succeed)
123
- 3.times do
124
- orig = eval %{
125
-
126
- lambda { #{code} } # lambda { foo }
127
-
128
-
129
- }, binding, "somewhere", 1000
130
-
131
- live = ast_eval %{
132
-
133
- lambda { #{code} } # lambda { foo }
134
-
135
-
136
- }, binding, "somewhere", 1000
137
-
138
- orig_top = exception_backtrace { orig.call }.first
139
- live_top = exception_backtrace { live.call }.first
140
-
141
- assert_equal orig_top, LiveAST.strip_token(live_top)
142
-
143
- if will_succeed
144
- assert_equal orig_top, live_top
145
- assert_match(/somewhere:1002/, live_top)
146
- else
147
- assert_not_equal orig_top, live_top
148
- assert_match(/somewhere.*?:1002/, live_top)
149
- end
150
- end
151
- end
152
-
153
- def test_tokens_stripped
154
- lines = exception_backtrace do
155
- ast_eval %{ ast_eval ' ast_eval "raise", binding ', binding }, binding
156
- end
157
- lines.each do |line|
158
- assert_nil line.index(LiveAST::Linker::REVISION_TOKEN)
159
- end
160
- end
161
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "main"
4
-
5
- class NoninvasiveTest < BaseTest
6
- def test_no_clutter
7
- [Method, UnboundMethod, Proc].each do |klass|
8
- assert !klass.instance_methods.include?(:to_ast)
9
- assert !klass.instance_methods.include?(:to_ruby)
10
- end
11
-
12
- assert !respond_to?(:ast_eval)
13
- assert !private_methods.include?(:ast_eval)
14
- assert !Kernel.respond_to?(:ast_eval)
15
- assert !respond_to?(:ast_load)
16
- assert !private_methods.include?(:ast_load)
17
- assert !Kernel.respond_to?(:ast_load)
18
- end
19
-
20
- DEFINE_A = lambda do
21
- class A
22
- def f
23
- "A#f"
24
- end
25
- end
26
- end
27
-
28
- def test_method
29
- DEFINE_A.call
30
-
31
- expected = no_arg_def(:f, "A#f")
32
- assert_equal expected, LiveAST.ast(A.instance_method(:f))
33
- assert_equal expected, LiveAST.ast(A.new.method(:f))
34
- end
35
-
36
- def test_lambda
37
- a = lambda { |x, y| x**y }
38
-
39
- assert_equal binop_block(:lambda, :**), LiveAST.ast(a)
40
- end
41
-
42
- def test_ast_eval
43
- code = %{ lambda { |x, y| x / y } }
44
-
45
- expected = binop_block(:lambda, :/)
46
- result = LiveAST.ast(LiveAST.eval(code, binding))
47
- assert_equal expected, result
48
- end
49
-
50
- def test_bogus
51
- assert_raises TypeError do
52
- LiveAST.ast(99)
53
- end
54
- end
55
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "main"
4
-
5
- class ReloadTest < BaseTest
6
- include FileUtils
7
-
8
- def test_reloading
9
- raw_reload
10
- end
11
-
12
- def raw_reload
13
- code1 = %{
14
- class ReloadTest::A
15
- def f
16
- "first A#f"
17
- end
18
- end
19
- }
20
-
21
- code2 = %{
22
- class ReloadTest::A
23
- def f
24
- "second A#f"
25
- end
26
- end
27
- }
28
-
29
- temp_file code1 do |file|
30
- load file
31
-
32
- LiveAST.ast(A.instance_method(:f))
33
-
34
- write_file file, code2
35
- load file
36
-
37
- # forced a raw-reload inconsistency -- verify bogus
38
-
39
- assert_equal no_arg_def(:f, "first A#f"),
40
- LiveAST.ast(A.instance_method(:f))
41
- end
42
- end
43
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class CovertDefineMethodTest < RegularTest
6
- DEFINE = lambda do
7
- class A
8
- def A.my_def(*args, &block)
9
- define_method(*args, &block)
10
- end
11
-
12
- my_def :h do |x, y|
13
- x + y
14
- end
15
- end
16
- end
17
-
18
- def test_covert_define_method
19
- DEFINE.call
20
- assert_equal 77, A.new.h(33, 44)
21
-
22
- assert_equal binop_define_method(:h, :+, :my_def),
23
- A.instance_method(:h).to_ast
24
- end
25
- end
data/test/def_test.rb DELETED
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class DefTest < RegularTest
6
- class A
7
- def f
8
- "A#f"
9
- end
10
- end
11
-
12
- def test_def_unbound_method_a
13
- expected = no_arg_def(:f, "A#f")
14
- assert_equal expected, A.instance_method(:f).to_ast
15
- end
16
-
17
- def test_def_method_a
18
- expected = no_arg_def(:f, "A#f")
19
- assert_equal expected, A.new.method(:f).to_ast
20
- end
21
-
22
- class B
23
- def f(x, y)
24
- x + y
25
- end
26
- end
27
-
28
- def test_def_unbound_method_b
29
- expected = binop_def(:f, :+)
30
- assert_equal expected, B.instance_method(:f).to_ast
31
- end
32
-
33
- def test_def_instance_method_b
34
- expected = binop_def(:f, :+)
35
- assert_equal expected, B.new.method(:f).to_ast
36
- end
37
- end
@@ -1,69 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class DefineMethodTest < RegularTest
6
- WITH_BLOCKS = lambda do
7
- class A
8
- {
9
- f: :+,
10
- g: :*,
11
- h: :-
12
- }.each_pair do |name, op|
13
- case op
14
- when :+
15
- define_method name do |x, y|
16
- x + y
17
- end
18
- when :*
19
- define_method name do |x, y|
20
- x * y
21
- end
22
- when :-
23
- define_method name do |x, y|
24
- x - y
25
- end
26
- end
27
- end
28
- end
29
- end
30
-
31
- def test_with_block
32
- WITH_BLOCKS.call
33
-
34
- assert_equal binop_define_method_with_var(:name, :+),
35
- A.instance_method(:f).to_ast
36
-
37
- assert_equal binop_define_method_with_var(:name, :*),
38
- A.instance_method(:g).to_ast
39
-
40
- assert_equal binop_define_method_with_var(:name, :-),
41
- A.instance_method(:h).to_ast
42
- end
43
-
44
- WITH_PROCS = lambda do
45
- class B
46
- op = lambda { |x, y| x / y }
47
-
48
- no_arg = proc { "B#f" }
49
-
50
- define_method :g, &no_arg; define_method :f, &op
51
- end
52
- end
53
-
54
- def test_via_block
55
- WITH_PROCS.call
56
-
57
- assert_equal binop_block(:lambda, :/),
58
- B.instance_method(:f).to_ast
59
-
60
- assert_equal binop_block(:lambda, :/),
61
- B.new.method(:f).to_ast
62
-
63
- assert_equal no_arg_block(:proc, "B#f"),
64
- B.instance_method(:g).to_ast
65
-
66
- assert_equal no_arg_block(:proc, "B#f"),
67
- B.new.method(:g).to_ast
68
- end
69
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class DefineSingletonMethodTest < RegularTest
6
- def test_define_singleton_method
7
- a = Object.new
8
- a.define_singleton_method :f do |x, y|
9
- x + y
10
- end
11
-
12
- assert_equal 77, a.f(33, 44)
13
-
14
- assert_equal binop_define_singleton_method(:f, :+, :a),
15
- a.singleton_class.instance_method(:f).to_ast
16
- end
17
- end
@@ -1 +0,0 @@
1
- # encoding: feynman-diagram
@@ -1,6 +0,0 @@
1
- # -*- coding: cp932 -*-
2
- module EncodingTest
3
- def cp932_string
4
- "�傫�Ȕ��Ƃ˂��B"
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module EncodingTest
2
- def default_string
3
- "Cats and large boxes." # google translate
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- # encoding: euc-jp -*-
2
- module EncodingTest
3
- def eucjp_string
4
- "�礭��Ȣ�Ȥͤ���"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: koi8-r -*-
2
- module EncodingTest
3
- def koi8_string
4
- "� ���������� ������� ���������� �� 20 ��������"
5
- end
6
- end
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: koi8-r -*-
3
- module EncodingTest
4
- def koi8_shebang_string
5
- "� ���������� ������� ���������� �� 20 ��������"
6
- end
7
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: koi8-r -*-
2
- module EncodingTest
3
- def koi8_with_utf8bom_string
4
- "� ���������� ������� ���������� �� 20 ��������"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # encoding: us-ascii
2
- module EncodingTest
3
- def usascii_string
4
- "Cats and large boxes." # google translate
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # encoding: us-ascii
2
- module EncodingTest
3
- def usascii_with_utf8bom_string
4
- "Cats and large boxes."
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module EncodingTest
3
- def utf8_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module EncodingTest
3
- def utf8bom_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- module EncodingTest
2
- def utf8bom_only_string
3
- "大きな箱とねこ。"
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf-8-dos -*-
2
- module EncodingTest
3
- def utf8dos_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf-8-mac -*-
2
- module EncodingTest
3
- def utf8mac_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf8-mac -*-
2
- module EncodingTest
3
- def utf8mac_alt_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # -*- coding: utf-8-unix -*-
2
- module EncodingTest
3
- def utf8unix_string
4
- "大きな箱とねこ。"
5
- end
6
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "main"
4
-
5
- class AllEncodingTest < RegularTest
6
- ENC_TESTS = {
7
- default: "UTF-8",
8
- usascii: "US-ASCII",
9
- utf8: "UTF-8",
10
- utf8unix: "UTF-8",
11
- utf8mac: "UTF-8",
12
- utf8mac_alt: "UTF8-MAC",
13
- utf8dos: "UTF-8",
14
- utf8bom: "UTF-8",
15
- utf8bom_only: "UTF-8",
16
- usascii_with_utf8bom: "US-ASCII",
17
- koi8_with_utf8bom: "KOI8-R",
18
- cp932: "Windows-31J",
19
- eucjp: "EUC-JP",
20
- koi8: "KOI8-R",
21
- koi8_shebang: "KOI8-R"
22
- }.freeze
23
-
24
- ENC_TESTS.each_pair do |abbr, name|
25
- define_method "test_#{abbr}" do
26
- require_relative "encoding_test/#{abbr}"
27
- self.class.class_eval { include EncodingTest }
28
-
29
- str = send("#{abbr}_string")
30
- assert_equal name, str.encoding.to_s
31
-
32
- ast = EncodingTest.instance_method("#{abbr}_string").to_ast
33
- assert_equal "UTF-8", no_arg_def_return(ast).encoding.to_s
34
-
35
- LiveAST.load "./test/encoding_test/#{abbr}.rb"
36
-
37
- ast = EncodingTest.instance_method("#{abbr}_string").to_ast
38
- assert_equal "UTF-8", no_arg_def_return(ast).encoding.to_s
39
- end
40
- end
41
-
42
- def test_bad
43
- orig = assert_raises ArgumentError do
44
- live_ast_original_load "./test/encoding_test/bad.rb"
45
- end
46
- live = assert_raises ArgumentError do
47
- LiveAST.load "./test/encoding_test/bad.rb"
48
- end
49
- # inconsistent punctuation from Ruby
50
- re = /\Aunknown encoding name\s*[-:]\s*feynman-diagram\Z/
51
- assert_match re, orig.message
52
- assert_match re, live.message
53
- end
54
- end