wrapit 0.2.1 → 0.2.2
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/lib/wrapit.rb +4 -0
- data/lib/wrapit/attr_wrappable.rb +15 -6
- data/lib/wrapit/method_wrappable.rb +30 -8
- data/lib/wrapit/version.rb +1 -1
- data/spec/wrapit/attr_wrappable_spec.rb +9 -0
- data/spec/wrapit/method_wrappable_spec.rb +24 -0
- metadata +4 -4
data/lib/wrapit.rb
CHANGED
@@ -7,13 +7,22 @@ module Wrapit::AttrWrappable
|
|
7
7
|
attr_accessor *args.map { |m| "#{m.to_s}_naked".to_sym }
|
8
8
|
|
9
9
|
args.each do |method|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
aw_create_naked_method(method)
|
11
|
+
aw_create_wrapped_method(method)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def aw_create_naked_method(method)
|
16
|
+
raise Wrapit::InvalidCallerError unless caller[0] =~ /attr_wrappable/
|
17
|
+
define_method method do
|
18
|
+
send(:"#{method}_naked").wrapped
|
19
|
+
end
|
20
|
+
end
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
22
|
+
def aw_create_wrapped_method(method)
|
23
|
+
raise Wrapit::InvalidCallerError unless caller[0] =~ /attr_wrappable/
|
24
|
+
define_method :"#{method}=" do |value|
|
25
|
+
send(:"#{method}_naked=", value)
|
17
26
|
end
|
18
27
|
end
|
19
28
|
end
|
@@ -4,15 +4,37 @@ module Wrapit::MethodWrappable
|
|
4
4
|
private
|
5
5
|
|
6
6
|
def method_wrappable(*args)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
args.each do |method|
|
8
|
+
has_args = (instance_method(method).arity != 0)
|
9
|
+
mw_create_naked_method(method, has_args)
|
10
|
+
mw_create_wrapped_method(method, has_args)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def mw_create_naked_method(method, has_args)
|
15
|
+
raise Wrapit::InvalidCallerError unless caller[0] =~ /method_wrappable/
|
16
|
+
|
17
|
+
if has_args
|
18
|
+
define_method :"#{method}_naked" do |*args|
|
19
|
+
self.class.superclass.instance_method(method).bind(self).call(*args)
|
20
|
+
end
|
21
|
+
else
|
22
|
+
define_method :"#{method}_naked" do
|
23
|
+
self.class.superclass.instance_method(method).bind(self).call
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
12
27
|
|
13
|
-
|
14
|
-
|
15
|
-
|
28
|
+
def mw_create_wrapped_method(method, has_args)
|
29
|
+
raise Wrapit::InvalidCallerError unless caller[0] =~ /method_wrappable/
|
30
|
+
|
31
|
+
if has_args
|
32
|
+
define_method method do |*args|
|
33
|
+
super(*args).wrapped
|
34
|
+
end
|
35
|
+
else
|
36
|
+
define_method method do
|
37
|
+
super().wrapped
|
16
38
|
end
|
17
39
|
end
|
18
40
|
end
|
data/lib/wrapit/version.rb
CHANGED
@@ -49,6 +49,15 @@ describe Wrapit::AttrWrappable do
|
|
49
49
|
destroy_class
|
50
50
|
end
|
51
51
|
|
52
|
+
it "wrapped method should return correct value when unwrapped" do
|
53
|
+
build_class
|
54
|
+
FooBar.module_eval { attr_wrappable :test_method }
|
55
|
+
foo_bar = FooBar.new
|
56
|
+
foo_bar.test_method = "something"
|
57
|
+
expect(foo_bar.test_method.unwrap).to eq "something"
|
58
|
+
destroy_class
|
59
|
+
end
|
60
|
+
|
52
61
|
def build_class
|
53
62
|
define_class 'FooBar', 'Object' do |klass|
|
54
63
|
klass.send :include, Wrapit::AttrWrappable
|
@@ -37,6 +37,14 @@ describe Wrapit::MethodWrappable do
|
|
37
37
|
destroy_class
|
38
38
|
end
|
39
39
|
|
40
|
+
it "wrapped method should return correct value when unwrapped" do
|
41
|
+
build_class
|
42
|
+
Object.module_eval { define_method :test_method do "something"; end }
|
43
|
+
FooBar.module_eval { method_wrappable :test_method }
|
44
|
+
expect(FooBar.new.test_method.unwrap).to eq "something"
|
45
|
+
destroy_class
|
46
|
+
end
|
47
|
+
|
40
48
|
it "wrapped method should return same value as naked method" do
|
41
49
|
build_class
|
42
50
|
Object.module_eval { define_method :test_method do "something"; end }
|
@@ -46,6 +54,22 @@ describe Wrapit::MethodWrappable do
|
|
46
54
|
destroy_class
|
47
55
|
end
|
48
56
|
|
57
|
+
it "method_wrappable should work with methods that have arguments" do
|
58
|
+
build_class
|
59
|
+
Object.module_eval { define_method :test_method do |arg1, arg2| "#{arg1}, #{arg2}"; end }
|
60
|
+
FooBar.module_eval { method_wrappable :test_method }
|
61
|
+
expect(FooBar.new.test_method("hello", "world").unwrap).to eq "hello, world"
|
62
|
+
destroy_class
|
63
|
+
end
|
64
|
+
|
65
|
+
it "method_wrappable should work with methods that have splat arguments" do
|
66
|
+
build_class
|
67
|
+
Object.module_eval { define_method :test_method do |*args| args.join(", "); end }
|
68
|
+
FooBar.module_eval { method_wrappable :test_method }
|
69
|
+
expect(FooBar.new.test_method("hello", "world").unwrap).to eq "hello, world"
|
70
|
+
destroy_class
|
71
|
+
end
|
72
|
+
|
49
73
|
def build_class
|
50
74
|
define_class 'FooBar', 'Object' do |klass|
|
51
75
|
klass.send :include, Wrapit::MethodWrappable
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wrapit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: wrapped
|
@@ -127,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
127
|
version: '0'
|
128
128
|
segments:
|
129
129
|
- 0
|
130
|
-
hash: -
|
130
|
+
hash: -1557926693994722533
|
131
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
132
|
none: false
|
133
133
|
requirements:
|
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
136
|
version: '0'
|
137
137
|
segments:
|
138
138
|
- 0
|
139
|
-
hash: -
|
139
|
+
hash: -1557926693994722533
|
140
140
|
requirements: []
|
141
141
|
rubyforge_project:
|
142
142
|
rubygems_version: 1.8.25
|