mvz-live_ast 1.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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.rdoc +93 -0
  3. data/README.rdoc +419 -0
  4. data/Rakefile +21 -0
  5. data/devel/levitate.rb +853 -0
  6. data/devel/levitate_config.rb +4 -0
  7. data/lib/live_ast.rb +4 -0
  8. data/lib/live_ast/ast_eval.rb +11 -0
  9. data/lib/live_ast/ast_load.rb +15 -0
  10. data/lib/live_ast/base.rb +73 -0
  11. data/lib/live_ast/common.rb +48 -0
  12. data/lib/live_ast/error.rb +20 -0
  13. data/lib/live_ast/evaler.rb +32 -0
  14. data/lib/live_ast/full.rb +2 -0
  15. data/lib/live_ast/irb_spy.rb +43 -0
  16. data/lib/live_ast/linker.rb +122 -0
  17. data/lib/live_ast/loader.rb +60 -0
  18. data/lib/live_ast/reader.rb +26 -0
  19. data/lib/live_ast/replace_eval.rb +121 -0
  20. data/lib/live_ast/replace_load.rb +14 -0
  21. data/lib/live_ast/replace_raise.rb +18 -0
  22. data/lib/live_ast/ruby_parser.rb +36 -0
  23. data/lib/live_ast/ruby_parser/test.rb +197 -0
  24. data/lib/live_ast/ruby_parser/unparser.rb +13 -0
  25. data/lib/live_ast/to_ast.rb +26 -0
  26. data/lib/live_ast/to_ruby.rb +24 -0
  27. data/lib/live_ast/version.rb +3 -0
  28. data/test/ast_eval_feature_test.rb +11 -0
  29. data/test/ast_load_feature_test.rb +11 -0
  30. data/test/attr_test.rb +24 -0
  31. data/test/backtrace_test.rb +158 -0
  32. data/test/covert_define_method_test.rb +23 -0
  33. data/test/def_test.rb +35 -0
  34. data/test/define_method_test.rb +67 -0
  35. data/test/define_singleton_method_test.rb +15 -0
  36. data/test/encoding_test.rb +52 -0
  37. data/test/encoding_test/bad.rb +1 -0
  38. data/test/encoding_test/cp932.rb +6 -0
  39. data/test/encoding_test/default.rb +5 -0
  40. data/test/encoding_test/eucjp.rb +6 -0
  41. data/test/encoding_test/koi8.rb +6 -0
  42. data/test/encoding_test/koi8_shebang.rb +7 -0
  43. data/test/encoding_test/koi8_with_utf8bom.rb +6 -0
  44. data/test/encoding_test/usascii.rb +6 -0
  45. data/test/encoding_test/usascii_with_utf8bom.rb +6 -0
  46. data/test/encoding_test/utf8.rb +6 -0
  47. data/test/encoding_test/utf8bom.rb +6 -0
  48. data/test/encoding_test/utf8bom_only.rb +5 -0
  49. data/test/encoding_test/utf8dos.rb +6 -0
  50. data/test/encoding_test/utf8mac.rb +6 -0
  51. data/test/encoding_test/utf8mac_alt.rb +6 -0
  52. data/test/encoding_test/utf8unix.rb +6 -0
  53. data/test/error_test.rb +116 -0
  54. data/test/eval_test.rb +269 -0
  55. data/test/flush_cache_test.rb +98 -0
  56. data/test/irb_test.rb +25 -0
  57. data/test/lambda_test.rb +56 -0
  58. data/test/load_path_test.rb +78 -0
  59. data/test/load_test.rb +123 -0
  60. data/test/main.rb +140 -0
  61. data/test/nested_test.rb +29 -0
  62. data/test/noninvasive_test.rb +51 -0
  63. data/test/readme_test.rb +16 -0
  64. data/test/recursive_eval_test.rb +52 -0
  65. data/test/redefine_method_test.rb +83 -0
  66. data/test/reload_test.rb +105 -0
  67. data/test/replace_eval_test.rb +405 -0
  68. data/test/rubygems_test.rb +25 -0
  69. data/test/rubyspec_test.rb +39 -0
  70. data/test/singleton_test.rb +25 -0
  71. data/test/stdlib_test.rb +13 -0
  72. data/test/thread_test.rb +44 -0
  73. data/test/to_ast_feature_test.rb +15 -0
  74. data/test/to_ruby_feature_test.rb +15 -0
  75. data/test/to_ruby_test.rb +87 -0
  76. metadata +275 -0
@@ -0,0 +1,25 @@
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) and 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
@@ -0,0 +1,39 @@
1
+ require_relative 'main'
2
+ require_relative '../devel/levitate'
3
+
4
+ #
5
+ # Tests against rubyspec branch which discards '|ast@' tokens
6
+ #
7
+ class ZZZ_RubySpecTest < RegularTest
8
+ FILES = [
9
+ 'core/basicobject/instance_eval_spec.rb',
10
+ 'core/binding/eval_spec.rb',
11
+ 'core/kernel/eval_spec.rb',
12
+ 'core/kernel/instance_eval_spec.rb',
13
+ 'core/module/class_eval_spec.rb',
14
+ 'core/module/module_eval_spec.rb',
15
+ ]
16
+
17
+ def setup
18
+ super
19
+ puts "\n==== rubyspec"
20
+ end
21
+
22
+ FILES.each do |file|
23
+ mname = "test_" + file.gsub("/", "_").chop!.chop!.chop!
24
+ define_method mname do
25
+ Dir.chdir ENV["LIVE_AST_RUBYSPEC_HOME"] do
26
+ cmd =
27
+ ["mspec", "-t", Levitate.ruby_bin] +
28
+
29
+ (["-T"]*Levitate.ruby_opts.size).
30
+ zip(Levitate.ruby_opts).
31
+ flatten +
32
+
33
+ [file]
34
+
35
+ assert system(*cmd)
36
+ end
37
+ end
38
+ end
39
+ end if ENV["LIVE_AST_RUBYSPEC_HOME"]
@@ -0,0 +1,25 @@
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
@@ -0,0 +1,13 @@
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
@@ -0,0 +1,44 @@
1
+ require_relative 'main'
2
+
3
+ require 'thread'
4
+
5
+ class ThreadTest < RegularTest
6
+
7
+ def test_threads
8
+ klass = nil
9
+ mutex = Mutex.new
10
+ stop = false
11
+ results = []
12
+ num_threads = 50
13
+
14
+ workers = (0...num_threads).map {
15
+ Thread.new {
16
+ until stop
17
+ if klass
18
+ found = klass.instance_method(:f).to_ast
19
+ mutex.synchronize {
20
+ results << found
21
+ }
22
+ break
23
+ end
24
+ end
25
+ }
26
+ }
27
+
28
+ klass = Class.new do
29
+ def f
30
+ "anon#f"
31
+ end
32
+ end
33
+
34
+ sleep(0.2)
35
+ stop = true
36
+
37
+ workers.each { |t| t.join }
38
+
39
+ assert_equal num_threads, results.size
40
+ results.each { |result|
41
+ assert_equal no_arg_def(:f, "anon#f"), result
42
+ }
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'main'
2
+
3
+ class AAB_ToASTFeatureTest < BaseTest
4
+ def test_require
5
+ [Method, UnboundMethod, Proc].each { |obj|
6
+ assert !obj.instance_methods.include?(:to_ast)
7
+ }
8
+
9
+ require 'live_ast/to_ast'
10
+
11
+ [Method, UnboundMethod, Proc].each { |obj|
12
+ assert obj.instance_methods.include?(:to_ast)
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'main'
2
+
3
+ class AAB_ToRubyFeatureTest < BaseTest
4
+ def test_require
5
+ [Method, UnboundMethod, Proc].each { |obj|
6
+ assert !obj.instance_methods.include?(:to_ruby)
7
+ }
8
+
9
+ require 'live_ast/to_ruby'
10
+
11
+ [Method, UnboundMethod, Proc].each { |obj|
12
+ assert obj.instance_methods.include?(:to_ruby)
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,87 @@
1
+ require_relative 'main'
2
+
3
+ class AAC_ToRubyTest < RegularTest
4
+ def setup
5
+ super
6
+ require 'live_ast/to_ruby'
7
+ end
8
+
9
+ def test_lambda_0
10
+ src = %{lambda { "moo" }}
11
+ dst = ast_eval(src, binding).to_ruby
12
+ assert_equal src, dst
13
+ end
14
+
15
+ def test_lambda_1
16
+ src = %{lambda { |x| (x ** 2) }}
17
+ dst = ast_eval(src, binding).to_ruby
18
+ assert_equal src, dst
19
+ end
20
+
21
+ def test_lambda_2
22
+ src = %{lambda { |x, y| (x + y) }}
23
+ dst = ast_eval(src, binding).to_ruby
24
+ assert_equal src, dst
25
+ end
26
+
27
+ def test_proc_0
28
+ src = %{proc { "moo" }}
29
+ dst = ast_eval(src, binding).to_ruby
30
+ assert_equal src, dst
31
+ end
32
+
33
+ def test_proc_1
34
+ src = %{proc { |x| (x ** 2) }}
35
+ dst = ast_eval(src, binding).to_ruby
36
+ assert_equal src, dst
37
+ end
38
+
39
+ def test_proc_2
40
+ src = %{proc { |x, y| (x * y) }}
41
+ dst = ast_eval(src, binding).to_ruby
42
+ assert_equal src, dst
43
+ end
44
+
45
+ def test_block_0
46
+ src = %{return_block { "moo" }}
47
+ dst = ast_eval(src, binding).to_ruby
48
+ assert_equal src, dst
49
+ end
50
+
51
+ def test_block_1
52
+ src = %{return_block { |x| (x ** 2) }}
53
+ dst = ast_eval(src, binding).to_ruby
54
+ assert_equal src, dst
55
+ end
56
+
57
+ def test_block_2
58
+ src = %{return_block { |x, y| (x - y) }}
59
+ dst = ast_eval(src, binding).to_ruby
60
+ assert_equal src, dst
61
+ end
62
+
63
+ def test_method_0
64
+ src = %{def f\n "moo"\nend}
65
+ dst = Class.new do
66
+ ast_eval(src, binding)
67
+ end.instance_method(:f).to_ruby
68
+ assert_equal src, dst
69
+ end
70
+
71
+ def test_method_1
72
+ src = %{def f(x)\n (x ** 2)\nend}
73
+ dst = Class.new do
74
+ ast_eval(src, binding)
75
+ end.instance_method(:f).to_ruby
76
+ assert_equal src, dst
77
+ end
78
+
79
+ def test_method_2
80
+ src = %{def f(x, y)\n (x / y)\nend}
81
+ dst = Class.new do
82
+ ast_eval(src, binding)
83
+ end.instance_method(:f).to_ruby
84
+ assert_equal src, dst
85
+ end
86
+ end if LiveAST.parser::Test.respond_to?(:unparser_matches_ruby2ruby?) &&
87
+ LiveAST.parser::Test.unparser_matches_ruby2ruby?
metadata ADDED
@@ -0,0 +1,275 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mvz-live_ast
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James M. Lawrence
8
+ - Matijs van Zuijlen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ruby_parser
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 3.2.2
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: 3.2.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: ruby2ruby
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: binding_of_caller
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '1.3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '1.3'
70
+ - !ruby/object:Gem::Dependency
71
+ name: minitest
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '4.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '4.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rake
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rdoc
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: |2
113
+ LiveAST enables a program to find the ASTs of objects created by dynamically
114
+ generated code.
115
+ email: matijs@matijs.net
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files:
119
+ - README.rdoc
120
+ - CHANGES.rdoc
121
+ files:
122
+ - devel/levitate_config.rb
123
+ - devel/levitate.rb
124
+ - lib/live_ast/full.rb
125
+ - lib/live_ast/common.rb
126
+ - lib/live_ast/loader.rb
127
+ - lib/live_ast/ast_eval.rb
128
+ - lib/live_ast/to_ruby.rb
129
+ - lib/live_ast/base.rb
130
+ - lib/live_ast/evaler.rb
131
+ - lib/live_ast/ast_load.rb
132
+ - lib/live_ast/replace_eval.rb
133
+ - lib/live_ast/error.rb
134
+ - lib/live_ast/ruby_parser.rb
135
+ - lib/live_ast/to_ast.rb
136
+ - lib/live_ast/ruby_parser/unparser.rb
137
+ - lib/live_ast/ruby_parser/test.rb
138
+ - lib/live_ast/replace_raise.rb
139
+ - lib/live_ast/irb_spy.rb
140
+ - lib/live_ast/version.rb
141
+ - lib/live_ast/linker.rb
142
+ - lib/live_ast/reader.rb
143
+ - lib/live_ast/replace_load.rb
144
+ - lib/live_ast.rb
145
+ - test/covert_define_method_test.rb
146
+ - test/noninvasive_test.rb
147
+ - test/singleton_test.rb
148
+ - test/irb_test.rb
149
+ - test/stdlib_test.rb
150
+ - test/rubygems_test.rb
151
+ - test/to_ruby_test.rb
152
+ - test/to_ast_feature_test.rb
153
+ - test/flush_cache_test.rb
154
+ - test/to_ruby_feature_test.rb
155
+ - test/eval_test.rb
156
+ - test/readme_test.rb
157
+ - test/def_test.rb
158
+ - test/replace_eval_test.rb
159
+ - test/attr_test.rb
160
+ - test/thread_test.rb
161
+ - test/reload_test.rb
162
+ - test/load_path_test.rb
163
+ - test/rubyspec_test.rb
164
+ - test/redefine_method_test.rb
165
+ - test/ast_load_feature_test.rb
166
+ - test/lambda_test.rb
167
+ - test/ast_eval_feature_test.rb
168
+ - test/error_test.rb
169
+ - test/recursive_eval_test.rb
170
+ - test/define_singleton_method_test.rb
171
+ - test/encoding_test/utf8bom_only.rb
172
+ - test/encoding_test/utf8unix.rb
173
+ - test/encoding_test/eucjp.rb
174
+ - test/encoding_test/usascii_with_utf8bom.rb
175
+ - test/encoding_test/utf8bom.rb
176
+ - test/encoding_test/utf8mac_alt.rb
177
+ - test/encoding_test/default.rb
178
+ - test/encoding_test/usascii.rb
179
+ - test/encoding_test/cp932.rb
180
+ - test/encoding_test/koi8_shebang.rb
181
+ - test/encoding_test/utf8.rb
182
+ - test/encoding_test/bad.rb
183
+ - test/encoding_test/utf8mac.rb
184
+ - test/encoding_test/koi8_with_utf8bom.rb
185
+ - test/encoding_test/utf8dos.rb
186
+ - test/encoding_test/koi8.rb
187
+ - test/load_test.rb
188
+ - test/nested_test.rb
189
+ - test/main.rb
190
+ - test/define_method_test.rb
191
+ - test/backtrace_test.rb
192
+ - test/encoding_test.rb
193
+ - README.rdoc
194
+ - CHANGES.rdoc
195
+ - Rakefile
196
+ homepage: https://github.com/mvz/live_ast
197
+ licenses:
198
+ - MIT
199
+ metadata: {}
200
+ post_install_message:
201
+ rdoc_options:
202
+ - --main
203
+ - README.rdoc
204
+ - --title
205
+ - 'LiveAST: Live Abstract Syntax Trees'
206
+ - --visibility
207
+ - private
208
+ require_paths:
209
+ - lib
210
+ required_ruby_version: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - '>='
213
+ - !ruby/object:Gem::Version
214
+ version: 1.9.2
215
+ required_rubygems_version: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - '>='
218
+ - !ruby/object:Gem::Version
219
+ version: '0'
220
+ requirements: []
221
+ rubyforge_project:
222
+ rubygems_version: 2.0.14
223
+ signing_key:
224
+ specification_version: 4
225
+ summary: Live abstract syntax trees of methods and procs.
226
+ test_files:
227
+ - test/covert_define_method_test.rb
228
+ - test/noninvasive_test.rb
229
+ - test/singleton_test.rb
230
+ - test/irb_test.rb
231
+ - test/stdlib_test.rb
232
+ - test/rubygems_test.rb
233
+ - test/to_ruby_test.rb
234
+ - test/to_ast_feature_test.rb
235
+ - test/flush_cache_test.rb
236
+ - test/to_ruby_feature_test.rb
237
+ - test/eval_test.rb
238
+ - test/readme_test.rb
239
+ - test/def_test.rb
240
+ - test/replace_eval_test.rb
241
+ - test/attr_test.rb
242
+ - test/thread_test.rb
243
+ - test/reload_test.rb
244
+ - test/load_path_test.rb
245
+ - test/rubyspec_test.rb
246
+ - test/redefine_method_test.rb
247
+ - test/ast_load_feature_test.rb
248
+ - test/lambda_test.rb
249
+ - test/ast_eval_feature_test.rb
250
+ - test/error_test.rb
251
+ - test/recursive_eval_test.rb
252
+ - test/define_singleton_method_test.rb
253
+ - test/encoding_test/utf8bom_only.rb
254
+ - test/encoding_test/utf8unix.rb
255
+ - test/encoding_test/eucjp.rb
256
+ - test/encoding_test/usascii_with_utf8bom.rb
257
+ - test/encoding_test/utf8bom.rb
258
+ - test/encoding_test/utf8mac_alt.rb
259
+ - test/encoding_test/default.rb
260
+ - test/encoding_test/usascii.rb
261
+ - test/encoding_test/cp932.rb
262
+ - test/encoding_test/koi8_shebang.rb
263
+ - test/encoding_test/utf8.rb
264
+ - test/encoding_test/bad.rb
265
+ - test/encoding_test/utf8mac.rb
266
+ - test/encoding_test/koi8_with_utf8bom.rb
267
+ - test/encoding_test/utf8dos.rb
268
+ - test/encoding_test/koi8.rb
269
+ - test/load_test.rb
270
+ - test/nested_test.rb
271
+ - test/main.rb
272
+ - test/define_method_test.rb
273
+ - test/backtrace_test.rb
274
+ - test/encoding_test.rb
275
+ has_rdoc: