live_ast 0.6.3 → 0.7.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.
@@ -0,0 +1,376 @@
1
+ require_relative 'main'
2
+
3
+ class ZZY_ReplaceEvalTest < ReplaceEvalTest
4
+ RESULT = {}
5
+
6
+ def setup
7
+ RESULT.clear
8
+ end
9
+
10
+ DEFINE_A = lambda do
11
+ class A
12
+ eval %{
13
+ def f(x, y)
14
+ x**y
15
+ end
16
+ }
17
+ end
18
+ end
19
+
20
+ def test_a_def_method
21
+ DEFINE_A.call
22
+ assert_equal binop_def(:f, :**), A.instance_method(:f).to_ast
23
+ end
24
+
25
+ DEFINE_B = lambda do
26
+ eval %{
27
+ class B
28
+ def f(x, y)
29
+ x / y
30
+ end
31
+ end
32
+ }
33
+ end
34
+
35
+ def test_def_class
36
+ DEFINE_B.call
37
+ assert_equal "ZZY_ReplaceEvalTest::B", B.name
38
+ assert_equal binop_def(:f, :/), B.instance_method(:f).to_ast
39
+ end
40
+
41
+ def moo
42
+ a = 22
43
+ binding
44
+ end
45
+
46
+ def test_binding_eval
47
+ assert_equal 22, moo.eval("a")
48
+ assert_equal 22, moo.eval("lambda { a }").call
49
+ end
50
+
51
+ DEFINE_P = lambda do
52
+ class P
53
+ eval %{
54
+ def f
55
+ @x = 33
56
+ RESULT[:old] = live_ast_original_eval("@x")
57
+ RESULT[:new] = eval("@x")
58
+ end
59
+ }
60
+ end
61
+ end
62
+
63
+ def test_const_lookup
64
+ DEFINE_P.call
65
+ P.new.f
66
+
67
+ assert_equal 33, RESULT[:old]
68
+ assert_equal 33, RESULT[:new]
69
+ end
70
+
71
+ def test_const_lookup_2
72
+ Class.new do
73
+ eval %{
74
+ def f
75
+ @x = 44
76
+ RESULT[:old] = live_ast_original_eval("@x")
77
+ RESULT[:new] = eval("@x")
78
+ end
79
+ }
80
+ end.new.f
81
+
82
+ assert_equal 44, RESULT[:old]
83
+ assert_equal 44, RESULT[:new]
84
+ end
85
+
86
+ DEFINE_QS = lambda do
87
+ class Q
88
+ class R
89
+ eval %{
90
+ def f
91
+ RESULT[:qr] = 55
92
+ end
93
+ }
94
+ end
95
+ end
96
+
97
+ module S
98
+ class T
99
+ eval %{
100
+ def f
101
+ RESULT[:st] = 66
102
+ end
103
+ }
104
+ end
105
+ end
106
+ end
107
+
108
+ def test_const_lookup_3
109
+ DEFINE_QS.call
110
+ Q::R.new.f
111
+ S::T.new.f
112
+ assert_equal 55, RESULT[:qr]
113
+ assert_equal 66, RESULT[:st]
114
+ end
115
+
116
+ def test_eval_arg_error
117
+ [[], (1..5).to_a].each do |args|
118
+ orig = assert_raises ArgumentError do
119
+ live_ast_original_eval(*args)
120
+ end
121
+ live = assert_raises ArgumentError do
122
+ eval(*args)
123
+ end
124
+ assert_equal orig.message, live.message
125
+ end
126
+ end
127
+
128
+ def test_singleton_eval_arg_error
129
+ [[], (1..5).to_a].each do |args|
130
+ orig = assert_raises ArgumentError do
131
+ Kernel.live_ast_original_singleton_eval(*args)
132
+ end
133
+ live = assert_raises ArgumentError do
134
+ Kernel.eval(*args)
135
+ end
136
+ assert_equal orig.message, live.message
137
+ end
138
+ end
139
+
140
+ def test_instance_eval_arg_error_no_block
141
+ [[], ('a'..'z').to_a].each do |args|
142
+ orig = assert_raises ArgumentError do
143
+ Object.new.live_ast_original_instance_eval(*args)
144
+ end
145
+ live = assert_raises ArgumentError do
146
+ Object.new.instance_eval(*args)
147
+ end
148
+ assert_equal orig.message, live.message
149
+ end
150
+
151
+ orig = assert_raises TypeError do
152
+ Object.new.live_ast_original_instance_eval(nil)
153
+ end
154
+ live = assert_raises TypeError do
155
+ Object.new.instance_eval(nil)
156
+ end
157
+ assert_equal orig.message, live.message
158
+
159
+ [[nil], [Object.new], [3], [4,3,2], (1..10).to_a].each do |args|
160
+ orig = assert_raises TypeError do
161
+ Object.new.live_ast_original_instance_eval(*args)
162
+ end
163
+ live = assert_raises TypeError do
164
+ Object.new.instance_eval(*args)
165
+ end
166
+ assert_equal orig.message, live.message
167
+ end
168
+ end
169
+
170
+ def test_instance_eval_arg_error_with_block
171
+ orig = assert_raises ArgumentError do
172
+ Object.new.live_ast_original_instance_eval(3,4,5) { }
173
+ end
174
+ live = assert_raises ArgumentError do
175
+ Object.new.instance_eval(3,4,5) { }
176
+ end
177
+ assert_equal orig.message, live.message
178
+ end
179
+
180
+ def test_instance_eval_block
181
+ orig = {}
182
+ orig.live_ast_original_instance_eval do
183
+ self[:x] = 33
184
+ end
185
+ assert_equal 33, orig[:x]
186
+
187
+ live = {}
188
+ live.instance_eval do
189
+ self[:x] = 44
190
+ end
191
+ assert_equal 44, live[:x]
192
+ end
193
+
194
+ def test_instance_eval_string
195
+ orig = {}
196
+ orig.live_ast_original_instance_eval %{
197
+ self[:x] = 33
198
+ }
199
+ assert_equal 33, orig[:x]
200
+
201
+ live = {}
202
+ live.instance_eval %{
203
+ self[:x] = 44
204
+ }
205
+ assert_equal 44, live[:x]
206
+ end
207
+
208
+ def test_instance_eval_binding
209
+ x = 33
210
+ orig = {}
211
+ orig.live_ast_original_instance_eval %{
212
+ self[:x] = x
213
+ self[:f] = lambda { "f" }
214
+ }
215
+ assert_equal x, orig[:x]
216
+
217
+ y = 44
218
+ live = {}
219
+ live.instance_eval %{
220
+ self[:y] = y
221
+ self[:g] = lambda { "g" }
222
+ }
223
+ assert_equal y, live[:y]
224
+
225
+ assert_equal no_arg_block(:lambda, "g"), live[:g].to_ast
226
+ end
227
+
228
+ def test_module_eval_block
229
+ orig = Module.new
230
+ orig.live_ast_original_module_eval do
231
+ def f
232
+ "orig"
233
+ end
234
+ end
235
+ orig.instance_method(:f)
236
+
237
+ live = Module.new
238
+ live.module_eval do
239
+ def f
240
+ "live"
241
+ end
242
+ end
243
+ assert_equal no_arg_def(:f, "live"),
244
+ live.instance_method(:f).to_ast
245
+ end
246
+
247
+ def test_module_eval_string
248
+ orig = Module.new
249
+ orig.live_ast_original_module_eval %{
250
+ def f
251
+ "orig"
252
+ end
253
+ }
254
+ orig.instance_method(:f)
255
+
256
+ live = Module.new
257
+ live.module_eval %{
258
+ def h
259
+ "live h"
260
+ end
261
+ }
262
+ assert_equal no_arg_def(:h, "live h"),
263
+ live.instance_method(:h).to_ast
264
+ end
265
+
266
+ def test_module_eval_binding
267
+ x = 33
268
+ orig = Class.new
269
+ orig.live_ast_original_module_eval %{
270
+ define_method :value do
271
+ x
272
+ end
273
+ define_method :f do
274
+ lambda { }
275
+ end
276
+ }
277
+ assert_equal 33, orig.new.value
278
+ assert orig.new.f.is_a?(Proc)
279
+
280
+ y = 44
281
+ live = Class.new
282
+ live.module_eval %{
283
+ define_method :value do
284
+ y
285
+ end
286
+ define_method :g do
287
+ lambda { "g return" }
288
+ end
289
+ }
290
+ assert_equal 44, live.new.value
291
+ assert live.new.g.is_a?(Proc)
292
+
293
+ assert_equal no_arg_block(:lambda, "g return"),
294
+ live.new.g.to_ast
295
+ end
296
+
297
+ def test_module_eval_file_line
298
+ klass = Module.new
299
+
300
+ orig =
301
+ klass.live_ast_original_module_eval("[__FILE__, __LINE__]", "test", 102)
302
+ live =
303
+ klass.module_eval("[__FILE__, __LINE__]", "test", 102)
304
+
305
+ unfixable do
306
+ assert_equal orig, live
307
+ end
308
+
309
+ live.first.sub!(/#{Regexp.quote LiveAST::Linker::REVISION_TOKEN}.*\Z/, "")
310
+ assert_equal orig, live
311
+ assert_equal ["test", 102], live
312
+ end
313
+
314
+ def test_module_eval_to_str
315
+ file = MiniTest::Mock.new
316
+ file.expect(:to_str, "zebra.rb")
317
+ Class.new.module_eval("33 + 44", file)
318
+ file.verify
319
+ end
320
+
321
+ def test_eval_not_hosed
322
+ assert_equal 3, eval("1 + 2")
323
+ 1.times do
324
+ assert_equal 3, eval("1 + 2")
325
+ end
326
+
327
+ assert_equal(3, eval(%{ eval("1 + 2") }))
328
+ 1.times do
329
+ assert_equal(3, eval(%{ eval("1 + 2") }))
330
+ end
331
+
332
+ x = 5
333
+ eval %{
334
+ assert_equal(3, eval(%{ eval("1 + 2") }))
335
+ x = 6
336
+ }
337
+ assert_equal 6, x
338
+ end
339
+
340
+ def test_local_var_collision
341
+ args = 33
342
+
343
+ assert_equal 33, live_ast_original_eval("args")
344
+ assert_equal 33, eval("args")
345
+
346
+ assert_equal 33, Kernel.live_ast_original_singleton_eval("args")
347
+ assert_equal 33, Kernel.eval("args")
348
+
349
+ assert_equal 33, binding.live_ast_original_binding_eval("args")
350
+ assert_equal 33, binding.eval("args")
351
+
352
+ assert_equal 33, Object.new.live_ast_original_instance_eval("args")
353
+ assert_equal 33, Object.new.instance_eval("args")
354
+
355
+ assert_equal 33, Class.new.live_ast_original_module_eval("args")
356
+ assert_equal 33, Class.new.module_eval("args")
357
+
358
+ assert_equal 33, Class.new.live_ast_original_instance_eval("args")
359
+ assert_equal 33, Class.new.instance_eval("args")
360
+ end
361
+
362
+ def test_location_without_binding
363
+ expected = ["(eval)", 2]
364
+
365
+ assert_equal expected, live_ast_original_eval("\n[__FILE__, __LINE__]")
366
+
367
+ unfixable do
368
+ assert_equal expected, eval("\n[__FILE__, __LINE__]")
369
+ end
370
+
371
+ file, line = eval("\n[__FILE__, __LINE__]")
372
+ file = LiveAST.strip_token file
373
+
374
+ assert_equal expected, [file, line]
375
+ end
376
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'main'
2
+ require_relative '../devel/levitate'
3
+
4
+ class ZZZ_RubySpecTest < ReplaceEvalTest
5
+ def setup
6
+ super
7
+ puts "\n==== rubyspec"
8
+ end
9
+
10
+ FILES = [
11
+ 'core/basicobject/instance_eval_spec.rb',
12
+ 'core/binding/eval_spec.rb',
13
+ 'core/kernel/eval_spec.rb',
14
+ 'core/kernel/instance_eval_spec.rb',
15
+ 'core/module/class_eval_spec.rb',
16
+ 'core/module/module_eval_spec.rb',
17
+ ]
18
+
19
+ def test_rubyspec
20
+ Dir.chdir(ENV["RUBYSPEC_HOME"] || "../rubyspec") do
21
+ FILES.each do |file|
22
+ cmd = %w[mspec -I../live_ast/lib -t] + [Levitate::Ruby.executable, file]
23
+ assert system(*cmd)
24
+ end
25
+ end
26
+ end
27
+ end if ENV["LIVE_AST_RUBYSPEC"]
28
+
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: live_ast
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.3
5
+ version: 0.7.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - James M. Lawrence
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-09 00:00:00 -05:00
13
+ date: 2011-03-15 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -43,12 +43,15 @@ files:
43
43
  - lib/live_ast/ast_eval.rb
44
44
  - lib/live_ast/ast_load.rb
45
45
  - lib/live_ast/base.rb
46
+ - lib/live_ast/common.rb
46
47
  - lib/live_ast/error.rb
47
48
  - lib/live_ast/evaler.rb
49
+ - lib/live_ast/full.rb
48
50
  - lib/live_ast/irb_spy.rb
49
51
  - lib/live_ast/linker.rb
50
52
  - lib/live_ast/loader.rb
51
53
  - lib/live_ast/reader.rb
54
+ - lib/live_ast/replace_eval.rb
52
55
  - lib/live_ast/replace_load.rb
53
56
  - lib/live_ast/replace_raise.rb
54
57
  - lib/live_ast/to_ast.rb
@@ -89,6 +92,8 @@ files:
89
92
  - test/recursive_eval_test.rb
90
93
  - test/redefine_method_test.rb
91
94
  - test/reload_test.rb
95
+ - test/replace_eval_test.rb
96
+ - test/rubyspec_test.rb
92
97
  - test/stdlib_test.rb
93
98
  - test/thread_test.rb
94
99
  - test/to_ast_feature_test.rb
@@ -104,14 +109,18 @@ rdoc_options:
104
109
  - --main
105
110
  - README.rdoc
106
111
  - --title
107
- - "LiveAST: Live Abstract Syntax Trees"
112
+ - "live_ast: Live abstract syntax trees of methods and procs"
108
113
  - --exclude
109
114
  - lib/live_ast/ast_load.rb
110
115
  - --exclude
116
+ - lib/live_ast/common.rb
117
+ - --exclude
111
118
  - lib/live_ast/error.rb
112
119
  - --exclude
113
120
  - lib/live_ast/evaler.rb
114
121
  - --exclude
122
+ - lib/live_ast/full.rb
123
+ - --exclude
115
124
  - lib/live_ast/irb_spy.rb
116
125
  - --exclude
117
126
  - lib/live_ast/linker.rb
@@ -120,6 +129,8 @@ rdoc_options:
120
129
  - --exclude
121
130
  - lib/live_ast/reader.rb
122
131
  - --exclude
132
+ - lib/live_ast/replace_eval.rb
133
+ - --exclude
123
134
  - lib/live_ast/replace_load.rb
124
135
  - --exclude
125
136
  - lib/live_ast/replace_raise.rb
@@ -133,7 +144,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
133
144
  requirements:
134
145
  - - ">="
135
146
  - !ruby/object:Gem::Version
136
- version: "0"
147
+ version: 1.9.2
137
148
  required_rubygems_version: !ruby/object:Gem::Requirement
138
149
  none: false
139
150
  requirements:
@@ -143,9 +154,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
154
  requirements: []
144
155
 
145
156
  rubyforge_project:
146
- rubygems_version: 1.5.3
157
+ rubygems_version: 1.6.2
147
158
  signing_key:
148
159
  specification_version: 3
149
- summary: A pure Ruby library for obtaining live abstract syntax trees of methods and procs.
160
+ summary: Live abstract syntax trees of methods and procs.
150
161
  test_files: []
151
162