proxy_machine 0.0.5 → 0.0.6

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.
@@ -1,38 +1,85 @@
1
1
  = proxy_machine
2
2
 
3
- == Description
4
-
5
3
  A cool proxy implementation pattern in ruby
6
4
 
5
+ == Details
6
+
7
+ Proxy Machine is a proxy/delegate framework. It can create a proxy for standalone objects or change the behavior of the entire class, also it is possible to create an execution stack with the proxy life cycle.
8
+
7
9
  == Install
8
10
 
9
11
  sudo gem install proxy_machine
10
12
 
11
13
  == Example usage
12
14
 
13
- === The awesome way:
15
+ === Proxy standalone objects
14
16
 
15
17
  p = proxy_for [1, 2, 3]
16
- p.reverse => [3, 2, 1]
18
+ p.proxied? # => true
19
+ p.reverse # => [3, 2, 1]
20
+
21
+ === Proxy the entire class
22
+
23
+ class MyClass
24
+ attr_accessor :name
25
+
26
+ # Configuring the proxy
27
+ auto_proxy do
28
+ before :name => lambda {|obj, args| puts "old name: #{obj.name}"}
29
+ end
30
+
31
+ end
32
+
33
+ obj = MyClass.new
34
+ obj.proxied? # => true
35
+ obj.name # => old name: nil
36
+ nil
17
37
 
18
38
  === Defining callbefores and callafters in method level
19
39
 
20
40
  Callbefores:
21
41
 
42
+ ==== Standalone way
22
43
  p = proxy_for [1, 2, 3], :before => {
23
44
  :reverse => lambda {|obj, args| puts 'before reverse'}
24
45
  }
25
46
 
26
- p.reverse => before reverse
27
- [3, 2, 1]
47
+ p.reverse # => before reverse
48
+ [3, 2, 1]
49
+
50
+ ==== Class way
51
+
52
+ class MyClass
53
+ # ...
54
+ auto_proxy do
55
+ before :method => lambda {|obj, args| puts 'implementation'}
56
+ end
57
+ # ...
58
+ end
59
+
60
+ obj = MyClass.new
61
+ obj.proxied? # => true
62
+
63
+ Every instance of "MyClass" will be proxied
28
64
 
29
65
  Callafters:
30
-
66
+
67
+ ==== Standalone way
31
68
  p = proxy_for [1, 2, 3], :after => {
32
69
  :reverse => lambda {|obj, result, args| result.sort}
33
70
  }
34
71
 
35
- p.reverse => [1, 2, 3] # We reordered the list
72
+ p.reverse # => [1, 2, 3] # We reordered the list
73
+
74
+ ==== Class way
75
+
76
+ class MyClass
77
+ # ...
78
+ auto_proxy do
79
+ after :method => lambda {|obj, result, args| puts 'implementation'}
80
+ end
81
+ # ...
82
+ end
36
83
 
37
84
  You will always receive the arguments passed to the original method.
38
85
 
@@ -42,23 +89,47 @@ Callbefores:
42
89
  This callback will receive a reference of the object, the symbol of the called method and the
43
90
  original arguments passed.
44
91
 
92
+ ==== Standalone way
93
+
45
94
  p = proxy_for [1, 2, 3], :before_all => lambda {|obj, method, args| puts 'before all'}
46
- p.reverse => before all
47
- [3, 2, 1]
95
+ p.reverse # => before all
96
+ [3, 2, 1]
48
97
 
49
- p.size => before all
50
- 3
98
+ p.size # => before all
99
+ 3
51
100
 
101
+ ==== Class way
102
+
103
+ class MyClass
104
+ # ...
105
+ auto_proxy do
106
+ before_all {|obj, method, args| puts 'implementation'}
107
+ end
108
+ # ...
109
+ end
110
+
52
111
  Callafters:
53
112
  This callback will receive a reference of the object, the result of execution (this result could be nil),
54
113
  the symbol of the called method and the arguments passed.
114
+
115
+ ==== Standalone way
55
116
 
56
117
  p = proxy_for [1, 2, 3], :after_all => lambda {|obj, result, method, args| puts result}
57
- p.reverse => [1, 2, 3]
58
- [1, 2, 3] # puts
118
+ p.reverse # => [1, 2, 3]
119
+ [1, 2, 3] # puts
59
120
 
60
- p.size => 3
61
- 3 # puts
121
+ p.size # => 3
122
+ 3 # puts
123
+
124
+ ==== Class way
125
+
126
+ class MyClass
127
+ # ...
128
+ auto_proxy do
129
+ after_all {|obj, result, method, args| puts 'implementation'}
130
+ end
131
+ # ...
132
+ end
62
133
 
63
134
  === Registering a class to perform the callafter or callbefore
64
135
 
@@ -74,12 +145,24 @@ every time it need to use it. You could use this feature with the before_all and
74
145
 
75
146
  def call; @object.sort! end
76
147
  end
148
+
149
+ ==== Standalone way
77
150
 
78
151
  p = proxy_for [1, 2, 3], :after => {
79
152
  :reverse => SortPerformer
80
153
  }
81
154
 
82
- p.reverse => [1, 2, 3]
155
+ p.reverse # => [1, 2, 3]
156
+
157
+ ==== Class way
158
+
159
+ class MyClass
160
+ # ...
161
+ auto_proxy do
162
+ after :method => Performer
163
+ end
164
+ # ...
165
+ end
83
166
 
84
167
  === Controlling the method execution with regexp
85
168
 
@@ -93,27 +176,56 @@ For before_all and after_all you could use regexp to configure which methods wil
93
176
  def another_method; @value ? @value : 'another' end
94
177
  def crazy_one; @value ? @value : 'crazy' end
95
178
  end
179
+
180
+ ==== Standalone way
96
181
 
97
182
  p = proxy_for MyRegexMethods.new, :before_all => [
98
183
  [/^get_/, lambda {|obj, method, args| obj.value = 'gotcha!' }]
99
184
  ]
100
185
 
101
- p.get_value1 => gotcha!
102
- p.get_value2 => gotcha!
103
- p.another_method => 'another
104
- proxy.crazy_one => 'crazy'
186
+ p.get_value1 # => gotcha!
187
+ p.get_value2 # => gotcha!
188
+ p.another_method # => 'another
189
+ proxy.crazy_one # => 'crazy'
190
+
191
+ ==== Class way
192
+
193
+ class MyRegexMethods
194
+ # ...
195
+ auto_proxy do
196
+ before_all [
197
+ [/^get_/, lambda {|obj, method, args| obj.value = 'gotcha!' }]
198
+ ]
199
+ end
200
+ # ...
201
+ end
105
202
 
106
203
  You could use many definitions if you want, the calls will happen in the declared order.
107
204
 
205
+ ==== Standalone way
206
+
108
207
  p = proxy_for MyRegexMethods.new, :before_all => [
109
208
  [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
110
209
  [/value/, lambda {|obj, method, args| obj.value = "#{obj.value}works"}]
111
210
  ]
112
211
 
113
- p.get_value1 => it_works
114
- p.get_value2 => it_works
115
- p.another_method => another
116
- p.crazy_one => crazy
212
+ p.get_value1 # => it_works
213
+ p.get_value2 # => it_works
214
+ p.another_method # => another
215
+ p.crazy_one # => crazy
216
+
217
+ ==== Class way
218
+
219
+ class MyRegexMethods
220
+ # ...
221
+ auto_proxy do
222
+ before_all [
223
+ [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
224
+ [/value/, lambda {|obj, method, args| obj.value = "#{obj.value}works"}]
225
+ ]
226
+ end
227
+ # ...
228
+ end
117
229
 
118
230
  It is also possible to use classes instead of procs.
119
231
 
@@ -131,10 +243,10 @@ It is also possible to use classes instead of procs.
131
243
  [/value/, Change2Performer]
132
244
  ]
133
245
 
134
- p.get_value1 => it_works
135
- p.get_value2 => it_works
136
- p.another_method => another
137
- p.crazy_one => crazy
246
+ p.get_value1 # => it_works
247
+ p.get_value2 # => it_works
248
+ p.another_method # => another
249
+ p.crazy_one # => crazy
138
250
 
139
251
  === Building an execution stack
140
252
 
@@ -160,18 +272,20 @@ It is also possible to use classes instead of procs.
160
272
  :company_name => [make_lower, make_round_brackets2]
161
273
  }
162
274
 
163
- p.name => (IMPORTANT-NAME)
164
- p.company_name => [company name]
275
+ p.name # => (IMPORTANT-NAME)
276
+ p.company_name # => [company name]
165
277
 
166
278
  === How to detect that the object is a proxy?
167
279
 
168
280
  The beautiful way:
169
281
 
170
282
  o1 = [1, 2, 3]
171
- o1.proxied? => false
283
+ o1.proxied? # => false
172
284
 
173
285
  o2 = proxy_for [1, 2, 3]
174
- o2.proxied? => true
286
+ o2.proxied? # => true
287
+
288
+ It will work with +auto_proxy+ usage too.
175
289
 
176
290
  Other way:
177
291
 
@@ -183,8 +297,10 @@ Other way:
183
297
  Call original_object method in the proxy object.
184
298
 
185
299
  proxy = proxy_for [1, 2, 3]
186
- proxy.proxied? => true
187
- proxy.original_object.proxied? => false
300
+ proxy.proxied? # => true
301
+ proxy.original_object.proxied? # => false
302
+
303
+ It will work with +auto_proxy+ usage too.
188
304
 
189
305
  === Special options
190
306
 
@@ -197,15 +313,30 @@ Default is false.
197
313
  attr_accessor :value
198
314
  def method_missing(symbol, *args); 'nice!'; end
199
315
  end
316
+
317
+ ==== Standalone way
200
318
 
201
319
  p = proxy_for MyClass.new, :allow_dinamic => true, :before => {
202
320
  :magic_method => lambda {|obj| obj.value = 'other value' }
203
321
  }
204
322
 
205
- p.magic_method => 'other value'
323
+ p.magic_method # => 'other value'
324
+
325
+ ==== Class way
326
+
327
+ class MyClass
328
+ # ...
329
+ auto_proxy do
330
+ allow_dinamic true
331
+ before :magic_method => lambda {|obj| obj.value = 'other value' }
332
+ end
333
+ # ...
334
+ end
206
335
 
207
336
  2 - avoid_original_execution: When this option is enabled, proxy_machine will not call the original method.
208
337
  Default is false.
338
+
339
+ ==== Standalone way
209
340
 
210
341
  p = proxy_for [3, 2, 1],
211
342
  :avoid_original_execution => true,
@@ -213,21 +344,39 @@ Default is false.
213
344
  :empty? => lambda {|obj| obj.sort!}
214
345
  }
215
346
 
216
- p.empty? => nil
217
- p.original_object => [1, 2, 3]
347
+ p.empty? # => nil
348
+ p.original_object # => [1, 2, 3]
349
+
350
+ ==== Class way
351
+
352
+ class MyClass
353
+ # ...
354
+ auto_proxy do
355
+ avoid_original_execution true
356
+ end
357
+ # ...
358
+ end
218
359
 
219
360
  === Trying it in irb
220
361
 
221
362
  irb
222
363
  require 'proxy_machine'
364
+
223
365
  proxy_for...
224
366
 
367
+ class XYZ
368
+ auto_proxy do
369
+ ...
370
+ end
371
+ ...
372
+ end
373
+
225
374
  === Other ways:
226
375
 
227
376
  1º - Creates a proxy for the informed object
228
377
 
229
378
  p = Proxy.new [1,2,3]
230
- p.size => 3
379
+ p.size # => 3
231
380
 
232
381
  2º - A proxy with a before callback.
233
382
 
@@ -235,8 +384,8 @@ Default is false.
235
384
  :size => lambda {|obj| puts "before: #{obj.inspect}"}
236
385
  }
237
386
 
238
- p.size => before: [1, 2, 3]
239
- 3
387
+ p.size # => before: [1, 2, 3]
388
+ 3
240
389
 
241
390
  3º - A proxy with a after callback
242
391
 
@@ -244,8 +393,8 @@ Default is false.
244
393
  :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
245
394
  }
246
395
 
247
- p.size => after: [1, 2, 3]: result => 3
248
- 3
396
+ p.size # => after: [1, 2, 3]: result => 3
397
+ 3
249
398
 
250
399
  4º - Both
251
400
 
@@ -258,4 +407,4 @@ Default is false.
258
407
 
259
408
  == Copyright
260
409
 
261
- Copyright (c) 2010 Túlio Ornelas. See LICENSE for details.
410
+ Copyright (c) 2010, 2011 Túlio Ornelas. See LICENSE for details.
data/Rakefile CHANGED
@@ -14,4 +14,19 @@ begin
14
14
  Jeweler::GemcutterTasks.new
15
15
  rescue LoadError
16
16
  puts "Jeweler not available. Install it with: gem install jeweler"
17
- end
17
+ end
18
+
19
+ require 'rspec/core'
20
+ require 'rspec/core/rake_task'
21
+ RSpec::Core::RakeTask.new(:spec) do |spec|
22
+ spec.pattern = FileList['spec/**/*_spec.rb']
23
+ spec.rspec_opts = '-c --format documentation'
24
+ end
25
+
26
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
27
+ spec.pattern = 'spec/**/*_spec.rb'
28
+ spec.rcov = true
29
+ spec.rspec_opts = '-c --format documentation'
30
+ end
31
+
32
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -3,7 +3,18 @@ require 'proxy_machine'
3
3
  module Kernel
4
4
 
5
5
  def proxy_for object, callbacks = nil
6
- Proxy.new object, callbacks
6
+ ProxyMachine::Proxy.new object, callbacks
7
+ end
8
+
9
+ def auto_proxy &block
10
+ @proxy_machine_config = ProxyMachine::Config.new
11
+ @proxy_machine_config.apply!(&block)
12
+
13
+ def self.new(*args)
14
+ obj = allocate
15
+ obj.send(:initialize, *args)
16
+ proxy_for obj, @proxy_machine_config.callbacks
17
+ end
7
18
  end
8
19
 
9
20
  end
@@ -10,4 +10,5 @@ require 'kernel'
10
10
  require 'object'
11
11
  require 'symbol'
12
12
  require 'proxy_machine/proxy'
13
+ require 'proxy_machine/config'
13
14
  include ProxyMachine
@@ -0,0 +1,38 @@
1
+ module ProxyMachine
2
+ class Config
3
+
4
+ attr_reader :callbacks
5
+ def initialize
6
+ @callbacks = {}
7
+ end
8
+
9
+ def apply! &block
10
+ instance_exec(&block)
11
+ end
12
+
13
+ def allow_dinamic boolean
14
+ @callbacks[:allow_dinamic] = boolean
15
+ end
16
+
17
+ def avoid_original_execution boolean
18
+ @callbacks[:avoid_original_execution] = boolean
19
+ end
20
+
21
+ def before hash
22
+ @callbacks[:before] = hash
23
+ end
24
+
25
+ def before_all params = nil, &block
26
+ @callbacks[:before_all] = params ? params : block
27
+ end
28
+
29
+ def after hash
30
+ @callbacks[:after] = hash
31
+ end
32
+
33
+ def after_all params = nil, &block
34
+ @callbacks[:after_all] = params ? params : block
35
+ end
36
+
37
+ end
38
+ end
@@ -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.5"
8
+ s.version = "0.0.6"
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-11-02}
12
+ s.date = %q{2011-03-23}
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 = [
@@ -26,23 +26,24 @@ Gem::Specification.new do |s|
26
26
  "lib/kernel.rb",
27
27
  "lib/object.rb",
28
28
  "lib/proxy_machine.rb",
29
+ "lib/proxy_machine/config.rb",
29
30
  "lib/proxy_machine/proxy.rb",
30
31
  "lib/symbol.rb",
31
32
  "proxy_machine.gemspec",
32
33
  "script/console",
33
- "spec/proxy_spec.rb"
34
+ "spec/proxy_spec.rb",
35
+ "spec/spec_helper.rb"
34
36
  ]
35
37
  s.homepage = %q{http://github.com/tulios/proxy_machine}
36
38
  s.rdoc_options = ["--charset=UTF-8"]
37
39
  s.require_paths = ["lib"]
38
- s.rubygems_version = %q{1.3.7}
40
+ s.rubygems_version = %q{1.4.1}
39
41
  s.summary = %q{A cool proxy implementation pattern in ruby}
40
42
  s.test_files = [
41
43
  "spec/proxy_spec.rb"
42
44
  ]
43
45
 
44
46
  if s.respond_to? :specification_version then
45
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
47
  s.specification_version = 3
47
48
 
48
49
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
@@ -1,6 +1,6 @@
1
- require 'proxy_machine'
1
+ require 'spec_helper'
2
2
 
3
- describe Proxy do
3
+ describe "proxy_machine" do
4
4
 
5
5
  it 'should create a proxy object from the given one' do
6
6
  array = [1, 2, 3]
@@ -128,7 +128,7 @@ describe Proxy do
128
128
 
129
129
  end
130
130
 
131
- context 'for kernel method' do
131
+ context 'for kernel method proxy_for' do
132
132
 
133
133
  it 'should call proxy' do
134
134
  array = [1, 2, 3]
@@ -415,6 +415,268 @@ describe Proxy do
415
415
  end
416
416
 
417
417
  end
418
+
419
+ context 'for kernel method auto_proxy' do
420
+ class ProxiedConstructor
421
+ attr_accessor :name, :count
422
+ def initialize; @count = 0 end
423
+ end
424
+
425
+ context 'when generate a object already proxied' do
426
+
427
+ it 'should work even if the class have a parametrized initialize' do
428
+ class ProxiedConstructorWithArgs
429
+ attr_accessor :var1, :var2
430
+ def initialize(v1, v2); @var1 = v1; @var2 = v2; end
431
+ auto_proxy { before :var1 => lambda {|obj, args| obj.var1 = 'proxied' if obj.var1 == 1} }
432
+ end
433
+
434
+ obj = ProxiedConstructorWithArgs.new(1,2)
435
+ obj.proxied?.should be_true
436
+ obj.send(:var1).should eql(1) # by passing proxy_machine
437
+ obj.var1.should eql('proxied')
438
+ obj.var2.should eql(2)
439
+
440
+ obj = ProxiedConstructorWithArgs.new('a', 'b')
441
+ obj.proxied?.should be_true
442
+ obj.var1.should eql('a')
443
+ obj.var2.should eql('b')
444
+ end
445
+
446
+ context 'for a certain method' do
447
+
448
+ it 'should add a callbefore' do
449
+ class ProxiedConstructor
450
+ auto_proxy { before :name => lambda {|obj, args| obj.name = "#{obj.name}-2"} }
451
+ end
452
+
453
+ obj = ProxiedConstructor.new
454
+ obj.proxied?.should be_true
455
+ obj.name.should eql("-2")
456
+ obj.name = "house"
457
+ obj.name.should eql("house-2")
458
+ end
459
+
460
+ it 'should add a callafter' do
461
+ class ProxiedConstructor
462
+ auto_proxy { after :name => lambda {|obj, result, args| result.chars.to_a.sort.to_s} }
463
+ end
464
+
465
+ obj = ProxiedConstructor.new
466
+ obj.proxied?.should be_true
467
+ obj.name = "tulio"
468
+ obj.name.should eql("ilotu")
469
+ obj.name = "proxy"
470
+ obj.name.should eql("oprxy")
471
+ end
472
+
473
+ end
474
+
475
+ context 'for all methods' do
476
+
477
+ it 'should add a callbefore' do
478
+ class ProxiedConstructor
479
+ auto_proxy { before_all {|obj, method, args| obj.count+=1} }
480
+ end
481
+
482
+ obj = ProxiedConstructor.new
483
+ obj.proxied?.should be_true
484
+ obj.count.should eql(1)
485
+ obj.to_s
486
+ obj.count.should eql(3)
487
+ obj.display
488
+ obj.count.should eql(5)
489
+ end
490
+
491
+ it 'should add a callafter' do
492
+ class ProxiedConstructor
493
+ auto_proxy { after_all {|obj, method, args| obj.count-=1} }
494
+ end
495
+
496
+ obj = ProxiedConstructor.new
497
+ obj.proxied?.should be_true
498
+ obj.count.should eql(-1)
499
+ obj.to_s
500
+ obj.count.should eql(-3)
501
+ obj.display
502
+ obj.count.should eql(-5)
503
+ end
504
+
505
+ end
506
+
507
+ context 'filtering methods by regex' do
508
+ class MyRegexMethodsProxiedConstructor
509
+ attr_accessor :value
510
+ def get_value1; @value ? @value : 'get' end
511
+ def get_value2; @value ? @value : 'get' end
512
+ def another_method; @value ? @value : 'another' end
513
+ def crazy_one; @value ? @value : 'crazy' end
514
+ end
515
+
516
+ it 'should affect just the matched methods on callbefore' do
517
+ class MyRegexMethodsProxiedConstructor
518
+ auto_proxy do
519
+ before_all [
520
+ [/^get_/, lambda {|obj, method, args| obj.value = 'gotcha!' }],
521
+ [/method$/, lambda {|obj, method, args| obj.value = 'another gotcha!' }]
522
+ ]
523
+ end
524
+ end
525
+
526
+ obj = MyRegexMethodsProxiedConstructor.new
527
+ obj.proxied?.should be_true
528
+
529
+ obj.original_object.value = nil
530
+ obj.get_value1.should == 'gotcha!'
531
+
532
+ obj.original_object.value = nil
533
+ obj.get_value2.should == 'gotcha!'
534
+
535
+ obj.original_object.value = nil
536
+ obj.another_method.should == 'another gotcha!'
537
+
538
+ obj.original_object.value = nil
539
+ obj.crazy_one.should == 'crazy'
540
+ end
541
+
542
+ it 'should affect just the matched methods on callafter' do
543
+ class MyRegexMethodsProxiedConstructor
544
+ auto_proxy do
545
+ after_all [
546
+ [/^get_/, lambda {|obj, result, method, args| obj.value = 'gotcha!' }],
547
+ [/method$/, lambda {|obj, result, method, args| obj.value = 'another gotcha!'}]
548
+ ]
549
+ end
550
+ end
551
+
552
+ obj = MyRegexMethodsProxiedConstructor.new
553
+ obj.proxied?.should be_true
554
+
555
+ obj.original_object.value = nil
556
+ obj.get_value1.should == 'gotcha!'
557
+
558
+ obj.original_object.value = nil
559
+ obj.get_value2.should == 'gotcha!'
560
+
561
+ obj.original_object.value = nil
562
+ obj.another_method.should == 'another gotcha!'
563
+
564
+ obj.original_object.value = nil
565
+ obj.crazy_one.should == 'crazy'
566
+ end
567
+
568
+ end
569
+
570
+ end
571
+
572
+ context 'with dinamic methods' do
573
+ class MyClassProxiedConstructed
574
+ attr_accessor :value
575
+ auto_proxy do
576
+ allow_dinamic true
577
+ before :crazy_method => lambda {|obj, args| obj.value = "proxied value!" }
578
+ end
579
+ def method_missing(symbol, *args); @value; end
580
+ end
581
+
582
+ it 'should allow dinamic methods' do
583
+ obj = MyClassProxiedConstructed.new
584
+ obj.proxied?.should be_true
585
+
586
+ obj.value = "Crazy Value"
587
+ obj.value.should == "Crazy Value"
588
+ obj.crazy_method.should == "proxied value!"
589
+ obj.value.should == "proxied value!"
590
+ end
591
+ end
592
+
593
+ context 'avoiding original execution' do
594
+ class AvoidOriginalProxiedConstructed
595
+ attr_accessor :value
596
+ auto_proxy do
597
+ avoid_original_execution true
598
+ after_all {|obj, result, method, args| "avoided"}
599
+ end
600
+ def do_something; @value = "original" end
601
+ end
602
+
603
+ it 'should happen' do
604
+ obj = AvoidOriginalProxiedConstructed.new
605
+ obj.proxied?.should be_true
606
+
607
+ obj.do_something.should == "avoided"
608
+ obj.original_object.value.should be_nil
609
+ end
610
+ end
611
+
612
+ context 'when registering a class' do
613
+ class CounterPerformer
614
+ def initialize object, result = nil, method = nil, args = nil
615
+ @object = object; @result = result; @method = method, @args = args
616
+ end
617
+
618
+ def call; @object.count = @object.count ? @object.count+1 : 0 end
619
+ end
620
+ class RegisteredProxiedConstructed; attr_accessor :count; end
621
+
622
+ it 'should use a instance of the registered class for a callbefore' do
623
+ class RegisteredProxiedConstructed
624
+ auto_proxy {before :to_s => CounterPerformer}
625
+ end
626
+
627
+ obj = RegisteredProxiedConstructed.new
628
+ obj.proxied?.should be_true
629
+ obj.count.should eql(nil)
630
+ obj.to_s
631
+ obj.count.should eql(0)
632
+ obj.to_s
633
+ obj.count.should eql(1)
634
+ end
635
+
636
+ it 'should use a instance of the registered class for a callafter' do
637
+ class RegisteredProxiedConstructed
638
+ auto_proxy {after :to_s => CounterPerformer}
639
+ end
640
+
641
+ obj = RegisteredProxiedConstructed.new
642
+ obj.proxied?.should be_true
643
+ obj.count.should eql(nil)
644
+ obj.to_s
645
+ obj.count.should eql(0)
646
+ obj.to_s
647
+ obj.count.should eql(1)
648
+ end
649
+
650
+ it 'should use a instance of the registered class for callbefore_all' do
651
+ class RegisteredProxiedConstructed
652
+ auto_proxy {before_all CounterPerformer}
653
+ end
654
+
655
+ obj = RegisteredProxiedConstructed.new
656
+ obj.proxied?.should be_true
657
+ obj.count.should eql(0)
658
+ obj.to_s
659
+ obj.count.should eql(2)
660
+ obj.display
661
+ obj.count.should eql(4)
662
+ end
663
+
664
+ it 'should use a instance of the registered class for callafter_all' do
665
+ class RegisteredProxiedConstructed
666
+ auto_proxy {after_all CounterPerformer}
667
+ end
668
+
669
+ obj = RegisteredProxiedConstructed.new
670
+ obj.proxied?.should be_true
671
+ obj.count.should eql(0)
672
+ obj.to_s
673
+ obj.count.should eql(2)
674
+ obj.display
675
+ obj.count.should eql(4)
676
+ end
677
+
678
+ end
679
+ end
418
680
 
419
681
  end
420
682
 
@@ -0,0 +1,8 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+
4
+ require 'rspec'
5
+ require 'proxy_machine'
6
+
7
+ RSpec.configure do |config|
8
+ end
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: 21
5
- prerelease: false
4
+ hash: 19
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
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-11-02 00:00:00 -02:00
18
+ date: 2011-03-23 00:00:00 -03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -69,11 +69,13 @@ files:
69
69
  - lib/kernel.rb
70
70
  - lib/object.rb
71
71
  - lib/proxy_machine.rb
72
+ - lib/proxy_machine/config.rb
72
73
  - lib/proxy_machine/proxy.rb
73
74
  - lib/symbol.rb
74
75
  - proxy_machine.gemspec
75
76
  - script/console
76
77
  - spec/proxy_spec.rb
78
+ - spec/spec_helper.rb
77
79
  has_rdoc: true
78
80
  homepage: http://github.com/tulios/proxy_machine
79
81
  licenses: []
@@ -104,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  requirements: []
105
107
 
106
108
  rubyforge_project:
107
- rubygems_version: 1.3.7
109
+ rubygems_version: 1.4.1
108
110
  signing_key:
109
111
  specification_version: 3
110
112
  summary: A cool proxy implementation pattern in ruby