mvz-live_ast 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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