proxy_machine 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.rdoc +54 -1
- data/VERSION +1 -1
- data/lib/proxy_machine/proxy.rb +21 -52
- data/proxy_machine.gemspec +2 -2
- data/spec/proxy_spec.rb +47 -0
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -12,7 +12,11 @@ A cool proxy implementation pattern in ruby
|
|
12
12
|
|
13
13
|
p = proxy_for [1, 2, 3]
|
14
14
|
p.reverse => [3, 2, 1]
|
15
|
-
|
15
|
+
|
16
|
+
=== Defining callbefores and callafters in method level
|
17
|
+
|
18
|
+
Callbefores:
|
19
|
+
|
16
20
|
p = proxy_for [1, 2, 3], :before => {
|
17
21
|
:reverse => lambda {|obj| puts 'before reverse'}
|
18
22
|
}
|
@@ -20,6 +24,55 @@ A cool proxy implementation pattern in ruby
|
|
20
24
|
p.reverse => before reverse
|
21
25
|
[3, 2, 1]
|
22
26
|
|
27
|
+
Callafters:
|
28
|
+
|
29
|
+
p = proxy_for [1, 2, 3], :after => {
|
30
|
+
:reverse => lambda {|obj, result| result.sort}
|
31
|
+
}
|
32
|
+
|
33
|
+
p.reverse => [1, 2, 3] # We reordered the list
|
34
|
+
|
35
|
+
=== Defining callbefores and callafters in all method calls
|
36
|
+
|
37
|
+
Callbefores:
|
38
|
+
|
39
|
+
p = proxy_for [1, 2, 3], :before_all => lambda {|obj| puts 'before all'}
|
40
|
+
p.reverse => before all
|
41
|
+
[3, 2, 1]
|
42
|
+
|
43
|
+
p.size => before all
|
44
|
+
3
|
45
|
+
|
46
|
+
Callafters:
|
47
|
+
|
48
|
+
p = proxy_for [1, 2, 3], :after_all => lambda {|obj, result| puts result}
|
49
|
+
p.reverse => [1, 2, 3]
|
50
|
+
[1, 2, 3] # puts
|
51
|
+
|
52
|
+
p.size => 3
|
53
|
+
3 # puts
|
54
|
+
|
55
|
+
=== Registering a class to perform the callafter or callbefore
|
56
|
+
|
57
|
+
The constructor will receive the object, in case of a callback it will receive the result too.
|
58
|
+
You need to have a 'call' method. The ProxyMachine will create a new instance of the class
|
59
|
+
every time it need to use it.
|
60
|
+
|
61
|
+
# Example of class
|
62
|
+
class SortPerformer
|
63
|
+
def initialize object, result = nil
|
64
|
+
@object = object; @result = result
|
65
|
+
end
|
66
|
+
|
67
|
+
def call; @object.sort! end
|
68
|
+
end
|
69
|
+
|
70
|
+
p = proxy_for [1, 2, 3], :after => {
|
71
|
+
:reverse => SortPerformer
|
72
|
+
}
|
73
|
+
|
74
|
+
p.reverse => [1, 2, 3]
|
75
|
+
|
23
76
|
=== How to detect that the object is a proxy?
|
24
77
|
|
25
78
|
The beautiful way
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/proxy_machine/proxy.rb
CHANGED
@@ -1,38 +1,7 @@
|
|
1
1
|
module ProxyMachine
|
2
2
|
|
3
3
|
class Proxy < BasicObject
|
4
|
-
|
5
|
-
# Examples:
|
6
|
-
# 1º - Creates a proxy for the informed object
|
7
|
-
#
|
8
|
-
# p = Proxy.new [1,2,3]
|
9
|
-
# p.size => 3
|
10
|
-
#
|
11
|
-
# 2º - A proxy with a before callback.
|
12
|
-
#
|
13
|
-
# p = Proxy.new [1,2,3], :before => {
|
14
|
-
# :size => lambda {|obj| puts "before: #{obj.inspect}"}
|
15
|
-
# }
|
16
|
-
# p.size => before: [1, 2, 3]
|
17
|
-
# 3
|
18
|
-
#
|
19
|
-
# 3º - A proxy with a after callback
|
20
|
-
#
|
21
|
-
# p = Proxy.new [1,2,3], :after => {
|
22
|
-
# :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
|
23
|
-
# }
|
24
|
-
# p.size => after: [1, 2, 3]: result => 3
|
25
|
-
# 3
|
26
|
-
#
|
27
|
-
# 4º - Both
|
28
|
-
#
|
29
|
-
# p = Proxy.new [1,2,3],
|
30
|
-
# :before => {
|
31
|
-
# :size => lambda {|obj| puts "before: #{obj.inspect}"}
|
32
|
-
# }, :after => {
|
33
|
-
# :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
|
34
|
-
# }
|
35
|
-
#
|
4
|
+
|
36
5
|
def initialize object, calls = nil
|
37
6
|
@object = object
|
38
7
|
@before = @before_all = @after = @after_all = nil
|
@@ -45,42 +14,38 @@ module ProxyMachine
|
|
45
14
|
end
|
46
15
|
end
|
47
16
|
|
48
|
-
def method_missing(symbol, *args)
|
17
|
+
def method_missing(symbol, *args)
|
18
|
+
@symbol = symbol
|
49
19
|
method = symbol.to_s
|
50
20
|
raise NoMethodError.new(method) unless @object.methods.member?(method)
|
51
21
|
|
52
|
-
execute_call(@before_all,
|
53
|
-
execute_call(@before,
|
22
|
+
execute_call(@before_all, @object)
|
23
|
+
execute_call(@before, @object)
|
54
24
|
|
55
|
-
result = @object.send(method, *args)
|
25
|
+
@result = @object.send(method, *args)
|
56
26
|
|
57
|
-
result_after =
|
58
|
-
result_after_all =
|
27
|
+
result_after = execute_call(@after, @object, @result)
|
28
|
+
result_after_all = execute_call(@after_all, @object, @result)
|
59
29
|
|
60
30
|
return result_after_all if result_after_all
|
61
31
|
return result_after if result_after
|
62
|
-
result
|
32
|
+
@result
|
63
33
|
end
|
64
34
|
|
65
35
|
def proxied_class?; true end
|
66
36
|
|
67
37
|
private
|
68
|
-
def execute_call container,
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
def execute_call_with_result container, method_symbol, result
|
75
|
-
if block = get_block(container, method_symbol) and proc?(block)
|
76
|
-
block.call(@object, result)
|
77
|
-
end
|
38
|
+
def execute_call container, *args
|
39
|
+
executor = get_executor(container)
|
40
|
+
|
41
|
+
return executor.send :call, *args if proc?(executor)
|
42
|
+
return executor.send(:new, *args).send :call if class?(executor)
|
78
43
|
end
|
79
44
|
|
80
|
-
def
|
45
|
+
def get_executor container
|
81
46
|
if container
|
82
|
-
return container if container
|
83
|
-
return container[
|
47
|
+
return container if proc?(container) or class?(container)
|
48
|
+
return container[@symbol]
|
84
49
|
end
|
85
50
|
end
|
86
51
|
|
@@ -88,6 +53,10 @@ module ProxyMachine
|
|
88
53
|
block and block.class == Proc
|
89
54
|
end
|
90
55
|
|
56
|
+
def class? param
|
57
|
+
param and param.class == Class
|
58
|
+
end
|
59
|
+
|
91
60
|
end
|
92
61
|
|
93
62
|
end
|
data/proxy_machine.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{proxy_machine}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["T\303\272lio Ornelas"]
|
12
|
-
s.date = %q{2010-10-
|
12
|
+
s.date = %q{2010-10-19}
|
13
13
|
s.description = %q{A cool proxy implementation pattern in ruby}
|
14
14
|
s.email = %q{ornelas.tulio@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/spec/proxy_spec.rb
CHANGED
@@ -12,6 +12,12 @@ describe Proxy do
|
|
12
12
|
proxy.proxied_class?.should be_true
|
13
13
|
end
|
14
14
|
|
15
|
+
it 'should detect a proxy object with proxied_class? method' do
|
16
|
+
array = [1, 2, 3]
|
17
|
+
proxy = Proxy.new array
|
18
|
+
(defined? proxy.proxied_class?).should_not be_nil
|
19
|
+
end
|
20
|
+
|
15
21
|
context 'for a certain method' do
|
16
22
|
|
17
23
|
it 'should add a callbefore' do
|
@@ -113,6 +119,47 @@ describe Proxy do
|
|
113
119
|
end
|
114
120
|
|
115
121
|
end
|
122
|
+
|
123
|
+
context 'for object method' do
|
124
|
+
|
125
|
+
it 'should detect proxied objects' do
|
126
|
+
array1 = [1, 2, 3]
|
127
|
+
array1.proxied?.should be_false
|
128
|
+
array2 = proxy_for [1, 2, 3]
|
129
|
+
array2.proxied?.should be_true
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when registering a class' do
|
135
|
+
# Example of class
|
136
|
+
class SortPerformer
|
137
|
+
def initialize object, result = nil
|
138
|
+
@object = object; @result = result
|
139
|
+
end
|
140
|
+
|
141
|
+
def call; @object.sort! end
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should use a instance of the registered class for a callafter' do
|
145
|
+
array = [1, 2, 3]
|
146
|
+
proxy = proxy_for array, :after => {
|
147
|
+
:reverse => SortPerformer
|
148
|
+
}
|
149
|
+
proxy.should_not be_nil
|
150
|
+
proxy.reverse.should == [1, 2, 3]
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should use a instance of the registered class for a callbefore' do
|
154
|
+
array = [3, 2, 1]
|
155
|
+
proxy = proxy_for array, :before => {
|
156
|
+
:reverse => SortPerformer
|
157
|
+
}
|
158
|
+
proxy.should_not be_nil
|
159
|
+
proxy.reverse.should == [3, 2, 1]
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
116
163
|
|
117
164
|
end
|
118
165
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proxy_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "T\xC3\xBAlio Ornelas"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-10-
|
18
|
+
date: 2010-10-19 00:00:00 -02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|