proxeze 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +13 -17
- data/VERSION +1 -1
- data/lib/proxeze/class_methods.rb +4 -4
- data/lib/proxeze/delegator_blocks.rb +4 -4
- data/lib/proxeze/instance_methods.rb +6 -6
- data/proxeze.gemspec +1 -1
- data/spec/proxeze_spec.rb +53 -14
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -121,14 +121,16 @@ The special case to this is that class methods defined in Object are not proxied
|
|
121
121
|
Note: I don't recommend overriding the #hash method on your class, this serves only as an example.
|
122
122
|
|
123
123
|
== Method Interceptions
|
124
|
-
Proxeze has the ability to surround instance method calls with _before_ and _after_ callbacks. This support was lifted straight from proxy_machine (https://github.com/tulios/proxy_machine).
|
124
|
+
Proxeze has the ability to surround instance method calls with _before_ and _after_ callbacks. This support was lifted straight from proxy_machine (https://github.com/tulios/proxy_machine). Unlike proxy_machine, all callbacks receive the same set of parameters:
|
125
|
+
a reference to the object, the arguments passed, the symbol of the called method, and the result of execution (this result could be nil,
|
126
|
+
and necessarily *will* be nil in _before_ and _before_all_ interceptions).
|
125
127
|
|
126
128
|
=== Defining callbacks at the method level
|
127
129
|
|
128
130
|
==== before
|
129
131
|
|
130
132
|
p = Proxeze.for [0, 1, 2, 3] do
|
131
|
-
before :reverse do |obj, args|
|
133
|
+
before :reverse do |obj, args, mid, result|
|
132
134
|
obj << obj.length
|
133
135
|
end
|
134
136
|
end
|
@@ -138,24 +140,20 @@ Proxeze has the ability to surround instance method calls with _before_ and _aft
|
|
138
140
|
==== after
|
139
141
|
|
140
142
|
p = Proxeze.for [4, 2, 3] do
|
141
|
-
after :reverse do |obj,
|
143
|
+
after :reverse do |obj, args, mid, result|
|
142
144
|
result.sort
|
143
145
|
end
|
144
146
|
end
|
145
147
|
|
146
|
-
p.reverse => [4, 3, 2] # We reordered the list
|
147
|
-
|
148
|
-
You will always receive the arguments passed to the original method.
|
148
|
+
p.reverse => [4, 3, 2] # We reordered the list
|
149
149
|
|
150
150
|
=== Defining callbacks for all method calls
|
151
151
|
|
152
152
|
==== before_all
|
153
|
-
This callback will receive a reference of the object, the symbol of the called method and the
|
154
|
-
original arguments passed.
|
155
153
|
|
156
154
|
logged = nil
|
157
155
|
p = Proxeze.for [0, 1, 2, 3] do
|
158
|
-
before_all do |obj, method,
|
156
|
+
before_all do |obj, args, method, result|
|
159
157
|
logged = "before #{method} on #{obj.inspect} with args[#{args.inspect}]"
|
160
158
|
end
|
161
159
|
end
|
@@ -169,12 +167,10 @@ original arguments passed.
|
|
169
167
|
logged # => before unshift on [0, 1, 2, 3] with args[[9]]
|
170
168
|
|
171
169
|
==== after_all
|
172
|
-
This callback will receive a reference of the object, the result of execution (this result could be nil),
|
173
|
-
the symbol of the called method and the arguments passed.
|
174
170
|
|
175
171
|
logged = nil
|
176
172
|
p = Proxeze.for [1, 2, 3] do
|
177
|
-
after_all do |obj,
|
173
|
+
after_all do |obj, args, method, result|
|
178
174
|
logged = "after #{method} on #{obj.inspect} with args[#{args.inspect}], result is now [#{result}]"
|
179
175
|
result
|
180
176
|
end
|
@@ -187,14 +183,14 @@ the symbol of the called method and the arguments passed.
|
|
187
183
|
|
188
184
|
=== Registering a class to perform a callback
|
189
185
|
|
190
|
-
The
|
191
|
-
|
192
|
-
|
186
|
+
The initializer will receive an extra parameter, the type of the callback (one of #before, #before_all, #after, or #after_all).
|
187
|
+
In addition it also receives the object, the arguments passed to the method, the method called, and a result (which is populated for #after and
|
188
|
+
#after_all hooks). You will also need to define a #call method. Proxeze will create a new instance of the class every time it needs to use it.
|
193
189
|
|
194
190
|
# Example of class
|
195
191
|
class SortPerformer
|
196
|
-
def initialize object,
|
197
|
-
@object = object; @
|
192
|
+
def initialize callback_type, object, args = nil, method = nil, result = nil
|
193
|
+
@object = object; @args = args; @method = method; @result = result
|
198
194
|
end
|
199
195
|
|
200
196
|
def call; @object.sort! end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
@@ -14,8 +14,8 @@ module Proxeze
|
|
14
14
|
# The after_all hook will receive 4 arguments:
|
15
15
|
# target, result, method id, and any arguments
|
16
16
|
# to the method that was called.
|
17
|
-
def after_all &blk
|
18
|
-
insert_into_callback_chain :hook => :after_all, :blk => blk
|
17
|
+
def after_all *args, &blk
|
18
|
+
insert_into_callback_chain :hook => :after_all, :blk => blk, :args => args
|
19
19
|
end
|
20
20
|
|
21
21
|
# The before hook will receive 2 arguments:
|
@@ -28,8 +28,8 @@ module Proxeze
|
|
28
28
|
# The before_all hook will receive 3 arguments:
|
29
29
|
# target, method id, and any arguments to the
|
30
30
|
# method that is being called.
|
31
|
-
def before_all &blk
|
32
|
-
insert_into_callback_chain :hook => :before_all, :blk => blk
|
31
|
+
def before_all *args, &blk
|
32
|
+
insert_into_callback_chain :hook => :before_all, :blk => blk, :args => args
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
@@ -12,12 +12,12 @@ def Delegator.delegating_block mid
|
|
12
12
|
before_all = self.class.hooks[:before_all]
|
13
13
|
before = self.class.hooks[:before] ? self.class.hooks[:before][mid] : nil
|
14
14
|
|
15
|
-
execute_call(before_all, target,
|
16
|
-
execute_call(before, target, args)
|
15
|
+
execute_call(before_all, :before_all, target, args, mid)
|
16
|
+
execute_call(before, :before, target, args, mid)
|
17
17
|
|
18
18
|
result = target.__send__(mid, *args, &block)
|
19
|
-
result_after = execute_call(after, target,
|
20
|
-
result_after_all = execute_call(after_all, target,
|
19
|
+
result_after = execute_call(after, :after, target, args, mid, result)
|
20
|
+
result_after_all = execute_call(after_all, :after_all, target, args, mid, result)
|
21
21
|
return result_after_all if result_after_all
|
22
22
|
return result_after if result_after
|
23
23
|
result
|
@@ -19,16 +19,16 @@ module Proxeze
|
|
19
19
|
self.class.after mid, *args, &blk
|
20
20
|
end
|
21
21
|
|
22
|
-
def after_all &blk
|
23
|
-
self.class.after_all &blk
|
22
|
+
def after_all *args, &blk
|
23
|
+
self.class.after_all *args, &blk
|
24
24
|
end
|
25
25
|
|
26
26
|
def before mid, *args, &blk
|
27
27
|
self.class.before mid, *args, &blk
|
28
28
|
end
|
29
29
|
|
30
|
-
def before_all &blk
|
31
|
-
self.class.before_all &blk
|
30
|
+
def before_all *args, &blk
|
31
|
+
self.class.before_all *args, &blk
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
@@ -37,13 +37,13 @@ module Proxeze
|
|
37
37
|
result = nil
|
38
38
|
if executor.respond_to? :each
|
39
39
|
executor.each do |e|
|
40
|
-
result = e.send :call, *args if proc?(e)
|
40
|
+
result = e.send :call, *args[1..-1] if proc?(e)
|
41
41
|
result = e.send(:new, *args).call if class?(e)
|
42
42
|
end
|
43
43
|
return result
|
44
44
|
end
|
45
45
|
|
46
|
-
return executor.send :call, *args if proc?(executor)
|
46
|
+
return executor.send :call, *args[1..-1] if proc?(executor)
|
47
47
|
return executor.send(:new, *args).call if class?(executor)
|
48
48
|
end
|
49
49
|
|
data/proxeze.gemspec
CHANGED
data/spec/proxeze_spec.rb
CHANGED
@@ -177,8 +177,8 @@ describe Proxeze do
|
|
177
177
|
it "should run 'before' callbacks" do
|
178
178
|
baz_method_args = nil
|
179
179
|
Proxeze.proxy( ClassWhereinWeMeetBeforeBlocks ) do
|
180
|
-
before :baz do
|
181
|
-
baz_method_args = args
|
180
|
+
before :baz do |target, args, mid, result|
|
181
|
+
baz_method_args = args
|
182
182
|
end
|
183
183
|
end
|
184
184
|
instance = ClassWhereinWeMeetBeforeBlocks.new
|
@@ -191,9 +191,8 @@ describe Proxeze do
|
|
191
191
|
it "should run 'before_all' callbacks" do
|
192
192
|
callbacks = {}
|
193
193
|
Proxeze.proxy( ClassWhereinWeMeetBeforeBlocks ) do
|
194
|
-
before_all do
|
195
|
-
|
196
|
-
callbacks[mid] = arguments
|
194
|
+
before_all do |target, args, mid, result|
|
195
|
+
callbacks[mid] = args
|
197
196
|
end
|
198
197
|
end
|
199
198
|
instance = ClassWhereinWeMeetBeforeBlocks.new
|
@@ -210,9 +209,9 @@ describe Proxeze do
|
|
210
209
|
it "should run 'after' callbacks" do
|
211
210
|
callbacks = {}
|
212
211
|
Proxeze.proxy( ClassWhereinWeMeetBeforeBlocks ) do
|
213
|
-
after :foo do
|
214
|
-
callbacks[
|
215
|
-
|
212
|
+
after :foo do |target, args, mid, result|
|
213
|
+
callbacks[mid] = args
|
214
|
+
result
|
216
215
|
end
|
217
216
|
end
|
218
217
|
instance = ClassWhereinWeMeetBeforeBlocks.new
|
@@ -227,8 +226,7 @@ describe Proxeze do
|
|
227
226
|
it "should run 'after_all' callbacks" do
|
228
227
|
callbacks = {}
|
229
228
|
Proxeze.proxy( ClassWhereinWeMeetBeforeBlocks ) do
|
230
|
-
after_all do
|
231
|
-
target, result, mid, arguments = *args
|
229
|
+
after_all do |target, arguments, mid, result|
|
232
230
|
callbacks[mid] = result
|
233
231
|
result * 2
|
234
232
|
end
|
@@ -246,14 +244,13 @@ describe Proxeze do
|
|
246
244
|
|
247
245
|
it "should be able to add hooks to a proxied instance" do
|
248
246
|
a = Proxeze.for [0, 1, 3, 2, 5, 4] do
|
249
|
-
before :reverse do |target,
|
247
|
+
before :reverse do |target, arguments, mid|
|
250
248
|
target << target.length
|
251
249
|
end
|
252
250
|
end
|
253
251
|
a.reverse.should == [6, 4, 5, 2, 3, 1, 0]
|
254
252
|
|
255
|
-
a.after :sort do
|
256
|
-
target, result, arguments = *args
|
253
|
+
a.after :sort do |target, arguments, mid, result|
|
257
254
|
result << result.length
|
258
255
|
end
|
259
256
|
a.sort.should == [0, 1, 2, 3, 4, 5, 6, 7]
|
@@ -267,7 +264,7 @@ describe Proxeze do
|
|
267
264
|
|
268
265
|
it "should accept a class for the callbacks" do
|
269
266
|
class SortPerformer
|
270
|
-
def initialize object,
|
267
|
+
def initialize callback_type, object, args = nil, method = nil, result = nil
|
271
268
|
@object = object; @result = result; @method = method, @args = args
|
272
269
|
end
|
273
270
|
|
@@ -278,4 +275,46 @@ describe Proxeze do
|
|
278
275
|
end
|
279
276
|
p.reverse.should == [1, 2, 3]
|
280
277
|
end
|
278
|
+
|
279
|
+
it "should accept a class for before_all and after_all callbacks" do
|
280
|
+
class MyClass
|
281
|
+
attr_accessor :foo
|
282
|
+
def inspect
|
283
|
+
'an instance of MyClass'
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
class DebugLogInterceptor
|
288
|
+
def self.logger
|
289
|
+
@logger ||= []
|
290
|
+
@logger
|
291
|
+
end
|
292
|
+
|
293
|
+
def initialize callback_type, object, args = nil, method = nil, result = nil
|
294
|
+
@callback_type = callback_type
|
295
|
+
@object = object
|
296
|
+
@result = result
|
297
|
+
@method = method
|
298
|
+
@args = args
|
299
|
+
end
|
300
|
+
|
301
|
+
def call
|
302
|
+
self.class.logger << log_message
|
303
|
+
end
|
304
|
+
|
305
|
+
def log_message
|
306
|
+
"#{@callback_type}: #{@method} on #{@object.inspect} with args[#{@args.inspect}], result is [#{@result}]"
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
Proxeze.proxy MyClass do
|
311
|
+
after_all DebugLogInterceptor
|
312
|
+
before_all DebugLogInterceptor
|
313
|
+
end
|
314
|
+
|
315
|
+
o = MyClass.new
|
316
|
+
o.foo = 2
|
317
|
+
DebugLogInterceptor.logger.should == ["before_all: foo= on an instance of MyClass with args[[2]], result is []",
|
318
|
+
"after_all: foo= on an instance of MyClass with args[[2]], result is [2]"]
|
319
|
+
end
|
281
320
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: proxeze
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jason Rogers
|
@@ -192,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
192
192
|
requirements:
|
193
193
|
- - ">="
|
194
194
|
- !ruby/object:Gem::Version
|
195
|
-
hash:
|
195
|
+
hash: 1901228362628821152
|
196
196
|
segments:
|
197
197
|
- 0
|
198
198
|
version: "0"
|