method_info 0.1.6 → 0.1.7
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/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.7
|
@@ -115,7 +115,10 @@ module MethodInfo
|
|
115
115
|
|
116
116
|
# Returns the class or module where method is defined
|
117
117
|
def method_owner(method_symbol)
|
118
|
-
|
118
|
+
# Under normal circumstances just calling @object.method(method_symbol) would work,
|
119
|
+
# but this will go wrong if the object has redefined the method method.
|
120
|
+
method = Object.instance_method(:method).bind(@object).call(method_symbol)
|
121
|
+
|
119
122
|
method.owner
|
120
123
|
rescue NameError
|
121
124
|
poor_mans_method_owner(method, method_symbol.to_s)
|
@@ -13,50 +13,60 @@ module MethodInfo
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "method_owner" do
|
16
|
-
it "gets the
|
17
|
-
|
18
|
-
obj.should_receive(:method).with(:to_s).and_return(mock('method', :owner => nil))
|
19
|
-
ams = AncestorMethodStructure.new(obj,
|
16
|
+
it "gets the owner of the method and returns it" do
|
17
|
+
ams = AncestorMethodStructure.new(5,
|
20
18
|
:ancestors_to_show => [],
|
21
19
|
:ancestors_to_exclude => [])
|
22
|
-
ams.send(:method_owner, :
|
20
|
+
ams.send(:method_owner, :ceil).should == Integer
|
23
21
|
end
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
ams.send(:method_owner, :to_s).should == :foo
|
23
|
+
it "can still return the owner of the method if the object has redefined :method" do
|
24
|
+
class MethodRedefinedTestClass
|
25
|
+
def method
|
26
|
+
raise "I do not want to call this method"
|
27
|
+
end
|
28
|
+
|
29
|
+
def foo
|
30
|
+
:foo
|
31
|
+
end
|
35
32
|
end
|
33
|
+
obj = MethodRedefinedTestClass.new
|
34
|
+
|
35
|
+
ams = AncestorMethodStructure.new(obj,
|
36
|
+
:ancestors_to_show => [],
|
37
|
+
:ancestors_to_exclude => [])
|
38
|
+
ams.send(:method_owner, :foo).should == MethodRedefinedTestClass
|
36
39
|
end
|
37
40
|
|
38
41
|
describe "for ruby 1.8.6" do
|
39
42
|
it "should use the poor_mans_method_owner" do
|
40
|
-
obj = mock('object')
|
41
43
|
mock_method = mock('method', :to_s => 'mock_method_name')
|
42
|
-
|
44
|
+
mock_method.stub!(:bind).and_return mock_method
|
45
|
+
mock_method.stub!(:call).and_return mock_method
|
46
|
+
|
43
47
|
mock_method.stub!(:owner).and_raise NameError
|
44
|
-
|
48
|
+
|
49
|
+
Object.stub!(:instance_method).with(:method).and_return mock_method
|
50
|
+
ams = AncestorMethodStructure.new(5,
|
45
51
|
:ancestors_to_show => [],
|
46
52
|
:ancestors_to_exclude => [])
|
47
|
-
ams.should_receive(:poor_mans_method_owner).with(mock_method, "
|
48
|
-
ams.send(:method_owner, :
|
53
|
+
ams.should_receive(:poor_mans_method_owner).with(mock_method, "dup")
|
54
|
+
ams.send(:method_owner, :dup)
|
49
55
|
end
|
50
56
|
|
51
57
|
it "raises an error if an error is raised that is not a NameError" do
|
52
|
-
obj = mock('object')
|
53
58
|
mock_method = mock('method', :to_s => 'mock_method_name')
|
54
|
-
|
55
|
-
mock_method.stub!(:
|
56
|
-
|
59
|
+
mock_method.stub!(:bind).and_return mock_method
|
60
|
+
mock_method.stub!(:call).and_return mock_method
|
61
|
+
|
62
|
+
mock_method.stub!(:owner).and_raise StandardError
|
63
|
+
|
64
|
+
Object.stub!(:instance_method).with(:method).and_return mock_method
|
65
|
+
ams = AncestorMethodStructure.new(5,
|
57
66
|
:ancestors_to_show => [],
|
58
67
|
:ancestors_to_exclude => [])
|
59
|
-
|
68
|
+
|
69
|
+
lambda { ams.send(:method_owner, :to_i) }.should raise_error(StandardError)
|
60
70
|
end
|
61
71
|
|
62
72
|
describe "poor_mans_method_owner" do
|