ruby_decorators 0.0.2 → 0.0.3
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/README.md +8 -1
- data/lib/ruby_decorator.rb +2 -2
- data/lib/ruby_decorators.rb +22 -24
- data/lib/ruby_decorators/version.rb +1 -1
- data/spec/ruby_decorators_spec.rb +38 -0
- metadata +3 -4
- data/lib/ruby_decorators/stack.rb +0 -7
data/README.md
CHANGED
@@ -26,6 +26,12 @@ Or install it yourself as:
|
|
26
26
|
## Usage
|
27
27
|
|
28
28
|
```ruby
|
29
|
+
class Hi < RubyDecorator
|
30
|
+
def call(this, *args, &blk)
|
31
|
+
this.call(*args, &blk).sub('hello', 'hi')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
29
35
|
class Batman < RubyDecorator
|
30
36
|
def call(this, *args, &blk)
|
31
37
|
this.call(*args, &blk).sub('world', 'batman')
|
@@ -58,6 +64,7 @@ class World
|
|
58
64
|
@greeting
|
59
65
|
end
|
60
66
|
|
67
|
+
+Hi
|
61
68
|
+Catwoman
|
62
69
|
def hello_catwoman
|
63
70
|
@greeting
|
@@ -73,7 +80,7 @@ world = World.new
|
|
73
80
|
|
74
81
|
world.hello_world # => "hello world"
|
75
82
|
world.hello_batman # => "hello batman"
|
76
|
-
world.hello_catwoman # => "
|
83
|
+
world.hello_catwoman # => "hi catwoman"
|
77
84
|
world.hello_super_catwoman # => "hello super catwoman"
|
78
85
|
```
|
79
86
|
|
data/lib/ruby_decorator.rb
CHANGED
data/lib/ruby_decorators.rb
CHANGED
@@ -1,43 +1,41 @@
|
|
1
1
|
require "ruby_decorators/version"
|
2
2
|
require "ruby_decorator"
|
3
|
-
require "ruby_decorators/stack"
|
4
3
|
|
5
4
|
module RubyDecorators
|
6
|
-
|
7
|
-
|
5
|
+
class Stack
|
6
|
+
def self.all
|
7
|
+
@all ||= []
|
8
|
+
end
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
@__decorated_methods.include?(method_name)
|
11
|
+
def method_added(method_name)
|
12
|
+
super
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
@methods ||= {}
|
15
|
+
@decorators ||= {}
|
15
16
|
|
16
|
-
|
17
|
-
alias_method :__undecorated_#{method_name}, :#{method_name}
|
17
|
+
return if RubyDecorators::Stack.all.empty?
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
@methods[method_name] = instance_method(method_name)
|
20
|
+
@decorators[method_name] = RubyDecorators::Stack.all.pop(42)
|
21
21
|
|
22
|
-
|
22
|
+
class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
|
23
|
+
#{method_visibility_for(method_name)}
|
23
24
|
def #{method_name}(*args, &blk)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
decorator.
|
29
|
-
|
30
|
-
|
31
|
-
end
|
25
|
+
decorators = self.class.instance_variable_get(:@decorators)[:#{method_name}]
|
26
|
+
method = self.class.instance_variable_get(:@methods)[:#{method_name}]
|
27
|
+
|
28
|
+
decorators.inject(method.bind(self)) do |method, decorator|
|
29
|
+
decorator = decorator.new if decorator.respond_to?(:new)
|
30
|
+
lambda { |*a, &b| decorator.call(method, *a, &b) }
|
31
|
+
end.call(*args, &blk)
|
32
32
|
end
|
33
33
|
RUBY_EVAL
|
34
|
-
|
35
|
-
@__decorated_methods << method_name
|
36
34
|
end
|
37
35
|
|
38
36
|
private
|
39
37
|
|
40
|
-
def
|
38
|
+
def method_visibility_for(method_name)
|
41
39
|
if private_method_defined?(method_name)
|
42
40
|
:private
|
43
41
|
elsif protected_method_defined?(method_name)
|
@@ -7,6 +7,12 @@ describe RubyDecorators do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
class Hi < RubyDecorator
|
11
|
+
def call(this, *args, &blk)
|
12
|
+
this.call(*args, &blk).sub('hello', 'hi')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
10
16
|
class Batman < RubyDecorator
|
11
17
|
def call(this, *args, &blk)
|
12
18
|
this.call(*args, &blk).sub('world', 'batman')
|
@@ -23,6 +29,15 @@ describe RubyDecorators do
|
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
32
|
+
class DummyClass2
|
33
|
+
extend RubyDecorators
|
34
|
+
|
35
|
+
+Hi
|
36
|
+
def hi
|
37
|
+
'hello'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
26
41
|
class DummyClass
|
27
42
|
extend RubyDecorators
|
28
43
|
|
@@ -68,6 +83,18 @@ describe RubyDecorators do
|
|
68
83
|
@greeting
|
69
84
|
end
|
70
85
|
|
86
|
+
+Hi
|
87
|
+
+Batman
|
88
|
+
def hi_batman
|
89
|
+
@greeting
|
90
|
+
end
|
91
|
+
|
92
|
+
+Hi
|
93
|
+
+Catwoman.new('super', 'catwoman')
|
94
|
+
def hi_super_catwoman(arg1)
|
95
|
+
"#{@greeting}#{arg1}"
|
96
|
+
end
|
97
|
+
|
71
98
|
protected
|
72
99
|
|
73
100
|
+Batman
|
@@ -86,6 +113,7 @@ describe RubyDecorators do
|
|
86
113
|
subject { DummyClass.new }
|
87
114
|
|
88
115
|
it "#hello_world" do
|
116
|
+
DummyClass2.new.hi.must_equal 'hi'
|
89
117
|
subject.hello_world.must_equal 'hello world'
|
90
118
|
end
|
91
119
|
|
@@ -126,4 +154,14 @@ describe RubyDecorators do
|
|
126
154
|
subject.hello_super_catwoman.must_equal 'hello super catwoman'
|
127
155
|
end
|
128
156
|
end
|
157
|
+
|
158
|
+
describe "multiple decorators" do
|
159
|
+
it "decorates a simple method" do
|
160
|
+
subject.hi_batman.must_equal 'hi batman'
|
161
|
+
end
|
162
|
+
|
163
|
+
it "decorates a method with args" do
|
164
|
+
subject.hi_super_catwoman('!').must_equal 'hi super catwoman!'
|
165
|
+
end
|
166
|
+
end
|
129
167
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_decorators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -72,7 +72,6 @@ files:
|
|
72
72
|
- Rakefile
|
73
73
|
- lib/ruby_decorator.rb
|
74
74
|
- lib/ruby_decorators.rb
|
75
|
-
- lib/ruby_decorators/stack.rb
|
76
75
|
- lib/ruby_decorators/version.rb
|
77
76
|
- ruby_decorators.gemspec
|
78
77
|
- spec/ruby_decorators_spec.rb
|
@@ -91,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
90
|
version: '0'
|
92
91
|
segments:
|
93
92
|
- 0
|
94
|
-
hash: -
|
93
|
+
hash: -1045434834331850826
|
95
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
95
|
none: false
|
97
96
|
requirements:
|
@@ -100,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
99
|
version: '0'
|
101
100
|
segments:
|
102
101
|
- 0
|
103
|
-
hash: -
|
102
|
+
hash: -1045434834331850826
|
104
103
|
requirements: []
|
105
104
|
rubyforge_project:
|
106
105
|
rubygems_version: 1.8.24
|