evalhook 0.5.4 → 0.5.5
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/CHANGELOG +6 -0
- data/Rakefile +1 -1
- data/lib/evalhook.rb +33 -3
- data/spec/call/call_spec.rb +37 -2
- metadata +6 -6
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
data/lib/evalhook.rb
CHANGED
@@ -139,8 +139,15 @@ module EvalHook
|
|
139
139
|
|
140
140
|
def hooked_method(receiver, mname, klass = nil) #:nodoc:
|
141
141
|
m = nil
|
142
|
+
is_method_missing = false
|
143
|
+
|
142
144
|
unless klass
|
143
|
-
m =
|
145
|
+
m = begin
|
146
|
+
receiver.method(mname)
|
147
|
+
rescue
|
148
|
+
is_method_missing = true
|
149
|
+
receiver.public_method(:method_missing)
|
150
|
+
end
|
144
151
|
klass = m.owner
|
145
152
|
else
|
146
153
|
m = klass.instance_method(mname).bind(receiver)
|
@@ -160,6 +167,10 @@ module EvalHook
|
|
160
167
|
end
|
161
168
|
end
|
162
169
|
|
170
|
+
if is_method_missing
|
171
|
+
orig_m = m
|
172
|
+
m = lambda{|*x| orig_m.call(mname,*x) }
|
173
|
+
end
|
163
174
|
m
|
164
175
|
end
|
165
176
|
|
@@ -168,7 +179,14 @@ module EvalHook
|
|
168
179
|
if local_vars.include? mname.to_s
|
169
180
|
HookedCallValue.new( _binding.eval(mname.to_s) )
|
170
181
|
else
|
171
|
-
|
182
|
+
is_method_missing = false
|
183
|
+
m = begin
|
184
|
+
receiver.method(mname)
|
185
|
+
rescue
|
186
|
+
is_method_missing = true
|
187
|
+
receiver.method(:method_missing)
|
188
|
+
end
|
189
|
+
|
172
190
|
klass = m.owner
|
173
191
|
ret = handle_method(klass, receiver, mname )
|
174
192
|
|
@@ -184,6 +202,10 @@ module EvalHook
|
|
184
202
|
end
|
185
203
|
end
|
186
204
|
|
205
|
+
if is_method_missing
|
206
|
+
orig_m = m
|
207
|
+
m = lambda{|*x| orig_m.call(mname,*x) }
|
208
|
+
end
|
187
209
|
m
|
188
210
|
end
|
189
211
|
end
|
@@ -285,7 +307,15 @@ module EvalHook
|
|
285
307
|
end
|
286
308
|
|
287
309
|
def private_method_check(recv, mname)
|
288
|
-
|
310
|
+
begin
|
311
|
+
recv.public_method(mname)
|
312
|
+
rescue NameError
|
313
|
+
begin
|
314
|
+
recv.public_method(:method_missing)
|
315
|
+
rescue NameError
|
316
|
+
raise NoMethodError
|
317
|
+
end
|
318
|
+
end
|
289
319
|
recv
|
290
320
|
end
|
291
321
|
|
data/spec/call/call_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require "evalhook"
|
|
3
3
|
|
4
4
|
describe EvalHook::HookHandler, "hook handler hooks" do
|
5
5
|
|
6
|
-
it "should raise NoMethodError when
|
6
|
+
it "should raise NoMethodError when trying to call private method" do
|
7
7
|
hh = EvalHook::HookHandler.new
|
8
8
|
lambda {
|
9
9
|
hh.evalhook("{}.system('ls -l')", binding)
|
@@ -11,7 +11,7 @@ describe EvalHook::HookHandler, "hook handler hooks" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
|
-
it "should raise NoMethodError when
|
14
|
+
it "should raise NoMethodError when trying to call private method" do
|
15
15
|
hh = EvalHook::HookHandler.new
|
16
16
|
lambda {
|
17
17
|
hh.evalhook("
|
@@ -29,4 +29,39 @@ describe EvalHook::HookHandler, "hook handler hooks" do
|
|
29
29
|
}.should_not raise_error
|
30
30
|
end
|
31
31
|
|
32
|
+
class XDefinedOutside55
|
33
|
+
def method_missing(name)
|
34
|
+
name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
XDefinedOutside55_ins = XDefinedOutside55.new
|
38
|
+
|
39
|
+
context "when there is method_missing defined" do
|
40
|
+
it "shouldn't raise NoMethodError when trying to call a public method NOT defined" do
|
41
|
+
hh = EvalHook::HookHandler.new
|
42
|
+
lambda {
|
43
|
+
hh.evalhook("
|
44
|
+
XDefinedOutside55_ins.foo
|
45
|
+
", binding).should be == :foo
|
46
|
+
}.should_not raise_error
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class XDefinedOutside56
|
51
|
+
def method_missing(name, param1)
|
52
|
+
name
|
53
|
+
end
|
54
|
+
end
|
55
|
+
XDefinedOutside56_ins = XDefinedOutside56.new
|
56
|
+
|
57
|
+
context "when there is method_missing defined (two arguments)" do
|
58
|
+
it "shouldn't raise NoMethodError when trying to call a public method NOT defined" do
|
59
|
+
hh = EvalHook::HookHandler.new
|
60
|
+
lambda {
|
61
|
+
hh.evalhook("
|
62
|
+
XDefinedOutside56_ins.foo(1)
|
63
|
+
", binding).should be == :foo
|
64
|
+
}.should_not raise_error
|
65
|
+
end
|
66
|
+
end
|
32
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: evalhook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-09-
|
12
|
+
date: 2013-09-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: partialruby
|
16
|
-
requirement: &
|
16
|
+
requirement: &71965870 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.2.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *71965870
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby_parser
|
27
|
-
requirement: &
|
27
|
+
requirement: &71965480 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '2.0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *71965480
|
36
36
|
description:
|
37
37
|
email: robertodarioseminara@gmail.com
|
38
38
|
executables: []
|