mvz-live_ast 1.1.0

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