proxeze 1.1.1 → 1.2.0
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 +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"
|