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.
- data/CHANGES.rdoc +9 -0
- data/MANIFEST +5 -0
- data/README.rdoc +118 -122
- data/Rakefile +3 -5
- data/devel/levitate.rb +57 -27
- data/lib/live_ast/base.rb +8 -0
- data/lib/live_ast/common.rb +48 -0
- data/lib/live_ast/evaler.rb +11 -45
- data/lib/live_ast/full.rb +2 -0
- data/lib/live_ast/irb_spy.rb +22 -16
- data/lib/live_ast/linker.rb +0 -4
- data/lib/live_ast/replace_eval.rb +118 -0
- data/lib/live_ast/replace_raise.rb +3 -6
- data/lib/live_ast/version.rb +1 -1
- data/test/backtrace_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/main.rb +28 -14
- data/test/readme_test.rb +2 -2
- data/test/replace_eval_test.rb +376 -0
- data/test/rubyspec_test.rb +28 -0
- metadata +17 -6
@@ -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.
|
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-
|
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
|
-
- "
|
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:
|
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.
|
157
|
+
rubygems_version: 1.6.2
|
147
158
|
signing_key:
|
148
159
|
specification_version: 3
|
149
|
-
summary:
|
160
|
+
summary: Live abstract syntax trees of methods and procs.
|
150
161
|
test_files: []
|
151
162
|
|