proxy_machine 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,3 +1,5 @@
1
+ = proxy_machine
2
+
1
3
  == Description
2
4
 
3
5
  A cool proxy implementation pattern in ruby
@@ -35,8 +37,10 @@ Callafters:
35
37
  === Defining callbefores and callafters in all method calls
36
38
 
37
39
  Callbefores:
40
+ This callback will receive a reference of the object, the symbol of the called method and the
41
+ arguments passed.
38
42
 
39
- p = proxy_for [1, 2, 3], :before_all => lambda {|obj| puts 'before all'}
43
+ p = proxy_for [1, 2, 3], :before_all => lambda {|obj, method, args| puts 'before all'}
40
44
  p.reverse => before all
41
45
  [3, 2, 1]
42
46
 
@@ -44,8 +48,10 @@ Callbefores:
44
48
  3
45
49
 
46
50
  Callafters:
51
+ This callback will receive a reference of the object, the result of execution (this result could be nil),
52
+ the symbol of the called method and the arguments passed.
47
53
 
48
- p = proxy_for [1, 2, 3], :after_all => lambda {|obj, result| puts result}
54
+ p = proxy_for [1, 2, 3], :after_all => lambda {|obj, result, method, args| puts result}
49
55
  p.reverse => [1, 2, 3]
50
56
  [1, 2, 3] # puts
51
57
 
@@ -54,14 +60,14 @@ Callafters:
54
60
 
55
61
  === Registering a class to perform the callafter or callbefore
56
62
 
57
- The constructor will receive the object, in case of a callback it will receive the result too.
63
+ The constructor will receive the object, in case of a callafter it will receive the result too.
58
64
  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.
65
+ every time it need to use it. You could use this feature with the before_all and after_all too.
60
66
 
61
67
  # Example of class
62
68
  class SortPerformer
63
- def initialize object, result = nil
64
- @object = object; @result = result
69
+ def initialize object, result = nil, method = nil, args = nil
70
+ @object = object; @result = result; @method = method, @args = args
65
71
  end
66
72
 
67
73
  def call; @object.sort! end
@@ -72,22 +78,115 @@ every time it need to use it.
72
78
  }
73
79
 
74
80
  p.reverse => [1, 2, 3]
75
-
76
- === How to detect that the object is a proxy?
77
-
78
- The beautiful way
81
+
82
+ === Controlling the method execution with regexp
83
+
84
+ For before_all and after_all you could use regexp to configure whicth methods will be affected.
85
+
86
+ # Example of class
87
+ class MyRegexMethods
88
+ attr_accessor :value
89
+ def get_value1; @value ? @value : 'get' end
90
+ def get_value2; @value ? @value : 'get' end
91
+ def another_method; @value ? @value : 'another' end
92
+ def crazy_one; @value ? @value : 'crazy' end
93
+ end
94
+
95
+ p = proxy_for MyRegexMethods.new, :before_all => {
96
+ :call1 => [/^get_/, lambda {|obj, method, args| obj.value = 'gotcha!' }],
97
+ }
98
+
99
+ p.get_value1 => gotcha!
100
+ p.get_value2 => gotcha!
101
+ p.another_method => 'another
102
+ proxy.crazy_one => 'crazy'
103
+
104
+ You could use many definitions if you want, the calls will happen in alphabetical order of the keys.
105
+
106
+ p = proxy_for MyRegexMethods.new, :before_all => {
107
+ :call2 => [/value/, lambda {|obj, method, args| obj.value = "#{obj.value}works"}],
108
+ :call1 => [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
109
+ }
110
+
111
+ p.get_value1 => it_works
112
+ p.get_value2 => it_works
113
+ p.another_method => another
114
+ p.crazy_one => crazy
115
+
116
+ It is also possible to use classes instead of procs.
117
+
118
+ # Example of class
119
+ class Change2Performer
120
+ def initialize object, result = nil, method = nil, args = nil
121
+ @object = object; @result = result; @method = method, @args = args
122
+ end
123
+
124
+ def call; @object.value = "#{@object.value}works" end
125
+ end
126
+
127
+ p = proxy_for MyRegexMethods.new, :before_all => {
128
+ :call2 => [/value/, Change2Performer],
129
+ :call1 => [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
130
+ }
131
+
132
+ p.get_value1 => it_works
133
+ p.get_value2 => it_works
134
+ p.another_method => another
135
+ p.crazy_one => crazy
79
136
 
137
+ === How to detect that the object is a proxy?
138
+
139
+ The beautiful way:
140
+
80
141
  o1 = [1, 2, 3]
81
142
  o1.proxied? => false
82
-
143
+
83
144
  o2 = proxy_for [1, 2, 3]
84
145
  o2.proxied? => true
85
-
86
- Other way
87
-
146
+
147
+ Other way:
148
+
88
149
  p = proxy_for [1, 2, 3]
89
150
  defined? p.proxied_class?
151
+
152
+ === Getting access to the original object
153
+
154
+ Call original_object method in the proxy object.
155
+
156
+ proxy = proxy_for [1, 2, 3]
157
+ proxy.proxied? => true
158
+ proxy.original_object.proxied? => false
159
+
160
+ === Special options
161
+
162
+ 1 - allow_dinamic: Allow execute methods based on method missing, that do not exists actually.
163
+ When allow_dinamic is enabled, proxy_machine will not check if this method really exists.
164
+ Default is false.
90
165
 
166
+ # Example of class
167
+ class MyClass
168
+ attr_accessor :value
169
+ def method_missing(symbol, *args); 'nice!'; end
170
+ end
171
+
172
+ p = proxy_for MyClass.new, :allow_dinamic => true, :before => {
173
+ :magic_method => lambda {|obj| obj.value = 'other value' }
174
+ }
175
+
176
+ p.magic_method => 'other value'
177
+
178
+ 2 - avoid_original_execution: When this option is enabled, proxy_machine will not call the original method.
179
+ Default is false.
180
+
181
+ p = proxy_for [3, 2, 1],
182
+ :avoid_original_execution => true,
183
+ :before => {
184
+ :empty? => lambda {|obj| obj.sort!}
185
+ }
186
+
187
+ p.empty? => nil
188
+ p.original_object => [1, 2, 3]
189
+
91
190
  === Trying it in irb
92
191
 
93
192
  irb
@@ -126,4 +225,8 @@ Other way
126
225
  :size => lambda {|obj| puts "before: #{obj.inspect}"}
127
226
  }, :after => {
128
227
  :size => lambda {|obj, result| puts "after: #{obj.inspect}: result => #{result}"}
129
- }
228
+ }
229
+
230
+ == Copyright
231
+
232
+ Copyright (c) 2010 Túlio Ornelas. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
data/init.rb CHANGED
@@ -1,5 +1 @@
1
- require 'proxy_machine'
2
- include ProxyMachine
3
-
4
- require 'kernel'
5
- require 'object'
1
+ require 'proxy_machine'
@@ -2,61 +2,100 @@ module ProxyMachine
2
2
 
3
3
  class Proxy < BasicObject
4
4
 
5
- def initialize object, calls = nil
5
+ def initialize object, params = nil
6
6
  @object = object
7
7
  @before = @before_all = @after = @after_all = nil
8
+ @allow_dinamic = false
9
+ @avoid_original_execution = false
8
10
 
9
- if calls
10
- @before = calls[:before]
11
- @before_all = calls[:before_all]
12
- @after = calls[:after]
13
- @after_all = calls[:after_all]
11
+ if params
12
+ @allow_dinamic = params[:allow_dinamic]
13
+ @avoid_original_execution = params[:avoid_original_execution]
14
+ @before = params[:before]
15
+ @before_all = params[:before_all]
16
+ @after = params[:after]
17
+ @after_all = params[:after_all]
14
18
  end
15
19
  end
16
20
 
17
21
  def method_missing(symbol, *args)
18
22
  @symbol = symbol
19
- method = symbol.to_s
20
- raise NoMethodError.new(method) unless @object.methods.member?(method)
21
-
22
- execute_call(@before_all, @object)
23
+ @method = symbol.to_s
24
+
25
+ raise NoMethodError.new(@method) unless @allow_dinamic or @object.methods.member?(@method)
26
+
27
+ execute_call(@before_all, @object, symbol, args)
23
28
  execute_call(@before, @object)
24
-
25
- @result = @object.send(method, *args)
29
+
30
+ @result = @avoid_original_execution ? nil : @object.send(@method, *args)
26
31
 
27
32
  result_after = execute_call(@after, @object, @result)
28
- result_after_all = execute_call(@after_all, @object, @result)
29
-
33
+ result_after_all = execute_call(@after_all, @object, @result, symbol, args)
34
+
30
35
  return result_after_all if result_after_all
31
36
  return result_after if result_after
32
37
  @result
33
38
  end
34
39
 
35
40
  def proxied_class?; true end
36
-
41
+ def original_object; @object end
42
+
37
43
  private
38
44
  def execute_call container, *args
39
45
  executor = get_executor(container)
40
46
 
47
+ result = nil
48
+ if executor.class == Array
49
+ executor.each do |e|
50
+ result = e.send :call, *args if proc?(e)
51
+ result = e.send(:new, *args).send :call if class?(e)
52
+ end
53
+ return result
54
+ end
55
+
41
56
  return executor.send :call, *args if proc?(executor)
42
57
  return executor.send(:new, *args).send :call if class?(executor)
43
58
  end
44
59
 
45
60
  def get_executor container
46
- if container
47
- return container if proc?(container) or class?(container)
48
- return container[@symbol]
61
+ return nil unless container
62
+
63
+ # The content is a proc or a class
64
+ return container if proc?(container) or class?(container)
65
+
66
+ # The content is a hash with an array filled with a regex and a proc or a class
67
+ if hash?(container) and regexp?(container)
68
+ matched = regexp_elements(container).select {|array| get_regexp(array) =~ @method}
69
+ return matched.collect {|array| get_proc_or_class(array)} unless matched.empty?
49
70
  end
71
+
72
+ # Lets assume that the content of the key is a proc
73
+ container[@symbol]
50
74
  end
51
75
 
52
- def proc? block
53
- block and block.class == Proc
76
+ def regexp_elements hash
77
+ elements = hash.keys.sort.collect {|key| array_with_regex?(hash[key]) ? hash[key] : nil}
78
+ compacted_array = elements.compact
79
+ compacted_array.nil? ? [] : compacted_array
80
+ end
81
+
82
+ def get_regexp array
83
+ array.detect {|element| element.class == Regexp}
54
84
  end
55
85
 
56
- def class? param
57
- param and param.class == Class
86
+ def get_proc_or_class array
87
+ array.detect {|element| proc?(element) or class?(element)}
88
+ end
89
+
90
+ def array_with_regex? array
91
+ array.class == Array and array.size == 2 and not get_regexp(array).nil?
58
92
  end
59
93
 
94
+ def proc? block; block and block.class == Proc end
95
+ def class? param; param and param.class == Class end
96
+ def hash? param; param and param.class == Hash end
97
+ def regexp? hash; hash and not regexp_elements(hash).empty? end
98
+
60
99
  end
61
100
 
62
101
  end
data/lib/proxy_machine.rb CHANGED
@@ -5,9 +5,9 @@ module ProxyMachine
5
5
  end unless defined?(BasicObject)
6
6
 
7
7
  end
8
-
9
- require 'proxy_machine/proxy'
10
- include ProxyMachine
11
-
8
+
12
9
  require 'kernel'
13
- require 'object'
10
+ require 'object'
11
+ require 'symbol'
12
+ require 'proxy_machine/proxy'
13
+ include ProxyMachine
data/lib/symbol.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Symbol
2
+ include Comparable
3
+
4
+ def <=>(other)
5
+ self.to_s <=> other.to_s
6
+ end
7
+ 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.3"
8
+ s.version = "0.0.4"
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-19}
12
+ s.date = %q{2010-10-25}
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,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "lib/object.rb",
27
27
  "lib/proxy_machine.rb",
28
28
  "lib/proxy_machine/proxy.rb",
29
+ "lib/symbol.rb",
29
30
  "proxy_machine.gemspec",
30
31
  "spec/proxy_spec.rb"
31
32
  ]
data/spec/proxy_spec.rb CHANGED
@@ -54,21 +54,38 @@ describe Proxy do
54
54
  end
55
55
 
56
56
  context 'for all methods' do
57
+ class AllMethodsClass
58
+ attr_accessor :method, :args
59
+ def do_something; 50 end
60
+ end
57
61
 
58
62
  it 'should add a callbefore' do
59
63
  array = [3, 2, 1]
60
- proxy = Proxy.new array, :before_all => lambda {|obj| obj.sort!}
64
+ proxy = Proxy.new array, :before_all => lambda {|obj, method, args| obj.sort!}
61
65
  proxy.should_not be_nil
62
66
  proxy.reverse.should == [3, 2, 1]
63
67
  proxy.max.should == 3
64
68
  proxy.first.should == 1
65
69
  proxy.to_s.should == "123"
66
70
  end
71
+
72
+ it 'should provide method name and arguments for the block in callbefore' do
73
+ obj = AllMethodsClass.new
74
+ proxy = proxy_for obj, :before_all => lambda {|obj, method, args|
75
+ obj.method = method
76
+ obj.args = args
77
+ }
78
+
79
+ proxy.should_not be_nil
80
+ proxy.do_something.should == 50
81
+ proxy.original_object.method.should == :do_something
82
+ proxy.original_object.args.should be_empty
83
+ end
67
84
 
68
85
  it 'should add a callafter' do
69
86
  array = [1, 2, 3]
70
87
 
71
- proxy = Proxy.new array, :after_all => lambda {|obj, result|
88
+ proxy = Proxy.new array, :after_all => lambda {|obj, result, method, args|
72
89
  return result * 10 if result.class == Fixnum
73
90
  result
74
91
  }
@@ -80,11 +97,25 @@ describe Proxy do
80
97
  proxy.to_s.should == "123"
81
98
  end
82
99
 
100
+ it 'should provide method name and arguments for the block in callafter' do
101
+ obj = AllMethodsClass.new
102
+ proxy = proxy_for obj, :after_all => lambda {|obj, result, method, args|
103
+ obj.method = method
104
+ obj.args = args
105
+ nil
106
+ }
107
+
108
+ proxy.should_not be_nil
109
+ proxy.do_something.should == 50
110
+ proxy.original_object.method.should == :do_something
111
+ proxy.original_object.args.should be_empty
112
+ end
113
+
83
114
  it 'should add both, callbefore and callafter' do
84
115
  array = [3, 2, 1]
85
116
  proxy = Proxy.new array,
86
- :before_all => lambda {|obj| obj.sort!},
87
- :after_all => lambda {|obj, result|
117
+ :before_all => lambda {|obj, method, args| obj.sort!},
118
+ :after_all => lambda {|obj, result, method, args|
88
119
  return result * 10 if result.class == Fixnum
89
120
  result
90
121
  }
@@ -134,8 +165,8 @@ describe Proxy do
134
165
  context 'when registering a class' do
135
166
  # Example of class
136
167
  class SortPerformer
137
- def initialize object, result = nil
138
- @object = object; @result = result
168
+ def initialize object, result = nil, method = nil, args = nil
169
+ @object = object; @result = result; @method = method, @args = args
139
170
  end
140
171
 
141
172
  def call; @object.sort! end
@@ -159,6 +190,219 @@ describe Proxy do
159
190
  proxy.reverse.should == [3, 2, 1]
160
191
  end
161
192
 
193
+ it 'should use a instance of the registered class for callbefore_all' do
194
+ array = [3, 2, 1]
195
+ proxy = proxy_for array, :before_all => SortPerformer
196
+
197
+ proxy.should_not be_nil
198
+ proxy.reverse.should == [3, 2, 1]
199
+ end
200
+
201
+ it 'should use a instance of the registered class for callafter_all' do
202
+ array = [1, 2, 3]
203
+ proxy = proxy_for array, :after_all => SortPerformer
204
+
205
+ proxy.should_not be_nil
206
+ proxy.reverse.should == [1, 2, 3]
207
+ end
208
+
209
+ end
210
+
211
+ context 'with dinamic methods' do
212
+ class MyClass
213
+ attr_accessor :value
214
+ def method_missing(symbol, *args); @value; end
215
+ end
216
+
217
+ it 'should allow dinamic methods' do
218
+ obj = MyClass.new
219
+ obj.value = "Crazy Value"
220
+
221
+ proxy = proxy_for obj, :allow_dinamic => true, :before => {
222
+ :crazy_method => lambda {|obj| obj.value = "proxied value!" }
223
+ }
224
+
225
+ proxy.should_not be_nil
226
+ proxy.crazy_method.should == "proxied value!"
227
+ end
228
+
229
+ end
230
+
231
+ context 'avoiding original execution' do
232
+ class AvoidOriginal
233
+ attr_accessor :value
234
+ def do_something; @value = "original" end
235
+ end
236
+
237
+ it 'should happen' do
238
+ obj = AvoidOriginal.new
239
+ proxy = proxy_for obj, :avoid_original_execution => true, :after_all => lambda {|obj, result, method, args|
240
+ "avoided"
241
+ }
242
+
243
+ proxy.should_not be_nil
244
+ proxy.do_something.should == "avoided"
245
+ proxy.original_object.value.should be_nil
246
+ end
247
+ end
248
+
249
+ context 'filtering methods by regex' do
250
+ class MyRegexMethods
251
+ attr_accessor :value
252
+ def get_value1; @value ? @value : 'get' end
253
+ def get_value2; @value ? @value : 'get' end
254
+ def another_method; @value ? @value : 'another' end
255
+ def crazy_one; @value ? @value : 'crazy' end
256
+ end
257
+
258
+ class Change1Performer
259
+ def initialize object, result = nil, method = nil, args = nil
260
+ @object = object; @result = result; @method = method, @args = args
261
+ end
262
+
263
+ def call; @object.value = 'gotcha!' end
264
+ end
265
+
266
+ class Change2Performer
267
+ def initialize object, result = nil, method = nil, args = nil
268
+ @object = object; @result = result; @method = method, @args = args
269
+ end
270
+
271
+ def call; @object.value = "#{@object.value}works" end
272
+ end
273
+
274
+ it 'should affect just the matched methods on callbefore' do
275
+ obj = MyRegexMethods.new
276
+ proxy = proxy_for obj, :before_all => {
277
+ :call1 => [/^get_/, lambda {|obj, method, args| obj.value = 'gotcha!' }],
278
+ :call2 => [/method$/, lambda {|obj, method, args| obj.value = 'another gotcha!' }]
279
+ }
280
+
281
+ proxy.should_not be_nil
282
+
283
+ proxy.original_object.value = nil
284
+ proxy.get_value1.should == 'gotcha!'
285
+
286
+ proxy.original_object.value = nil
287
+ proxy.get_value2.should == 'gotcha!'
288
+
289
+ proxy.original_object.value = nil
290
+ proxy.another_method.should == 'another gotcha!'
291
+
292
+ proxy.original_object.value = nil
293
+ proxy.crazy_one.should == 'crazy'
294
+ end
295
+
296
+ it 'should affect just the matched methods on callafter' do
297
+ obj = MyRegexMethods.new
298
+ proxy = proxy_for obj, :after_all => {
299
+ :call1 => [/^get_/, lambda {|obj, result, method, args| obj.value = 'gotcha!' }],
300
+ :call2 => [/method$/, lambda {|obj, result, method, args| obj.value = 'another gotcha!'}]
301
+ }
302
+
303
+ proxy.should_not be_nil
304
+
305
+ proxy.original_object.value = nil
306
+ proxy.get_value1.should == 'gotcha!'
307
+
308
+ proxy.original_object.value = nil
309
+ proxy.get_value2.should == 'gotcha!'
310
+
311
+ proxy.original_object.value = nil
312
+ proxy.another_method.should == 'another gotcha!'
313
+
314
+ proxy.original_object.value = nil
315
+ proxy.crazy_one.should == 'crazy'
316
+ end
317
+
318
+ it 'should execute the entire matched stack on callbefore sorted by the key name' do
319
+ obj = MyRegexMethods.new
320
+ proxy = proxy_for obj, :before_all => {
321
+ :call2 => [/value/, lambda {|obj, method, args| obj.value = "#{obj.value}works"}],
322
+ :call1 => [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
323
+ }
324
+
325
+ proxy.should_not be_nil
326
+
327
+ proxy.original_object.value = nil
328
+ proxy.get_value1.should == 'it_works'
329
+
330
+ proxy.original_object.value = nil
331
+ proxy.get_value2.should == 'it_works'
332
+
333
+ proxy.original_object.value = nil
334
+ proxy.another_method.should == 'another'
335
+
336
+ proxy.original_object.value = nil
337
+ proxy.crazy_one.should == 'crazy'
338
+ end
339
+
340
+ it 'should ensure that the last value returned is the value of the last called method' do
341
+ obj = MyRegexMethods.new
342
+ proxy = proxy_for obj, :after_all => {
343
+ :call2 => [/value/, lambda {|obj, result, method, args| 2}],
344
+ :call1 => [/get_/, lambda {|obj, result, method, args| 1}]
345
+ }
346
+
347
+ proxy.should_not be_nil
348
+
349
+ proxy.original_object.value = nil
350
+ proxy.get_value1.should == 2
351
+
352
+ proxy.original_object.value = nil
353
+ proxy.get_value2.should == 2
354
+
355
+ proxy.original_object.value = nil
356
+ proxy.another_method.should == 'another'
357
+
358
+ proxy.original_object.value = nil
359
+ proxy.crazy_one.should == 'crazy'
360
+ end
361
+
362
+ it 'should affect just the matched methods using a registered class' do
363
+ obj = MyRegexMethods.new
364
+ proxy = proxy_for obj, :before_all => {
365
+ :call1 => [/^get_/, Change1Performer],
366
+ :call2 => [/method$/, lambda {|obj, method, args| obj.value = 'another gotcha!' }]
367
+ }
368
+
369
+ proxy.should_not be_nil
370
+
371
+ proxy.original_object.value = nil
372
+ proxy.get_value1.should == 'gotcha!'
373
+
374
+ proxy.original_object.value = nil
375
+ proxy.get_value2.should == 'gotcha!'
376
+
377
+ proxy.original_object.value = nil
378
+ proxy.another_method.should == 'another gotcha!'
379
+
380
+ proxy.original_object.value = nil
381
+ proxy.crazy_one.should == 'crazy'
382
+ end
383
+
384
+ it 'should execute the entire matched stack sorted by the key name using a registered class' do
385
+ obj = MyRegexMethods.new
386
+ proxy = proxy_for obj, :before_all => {
387
+ :call2 => [/value/, Change2Performer],
388
+ :call1 => [/get_/, lambda {|obj, method, args| obj.value = "it_"}]
389
+ }
390
+
391
+ proxy.should_not be_nil
392
+
393
+ proxy.original_object.value = nil
394
+ proxy.get_value1.should == 'it_works'
395
+
396
+ proxy.original_object.value = nil
397
+ proxy.get_value2.should == 'it_works'
398
+
399
+ proxy.original_object.value = nil
400
+ proxy.another_method.should == 'another'
401
+
402
+ proxy.original_object.value = nil
403
+ proxy.crazy_one.should == 'crazy'
404
+ end
405
+
162
406
  end
163
407
 
164
408
  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: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
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-19 00:00:00 -02:00
18
+ date: 2010-10-25 00:00:00 -02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -53,6 +53,7 @@ files:
53
53
  - lib/object.rb
54
54
  - lib/proxy_machine.rb
55
55
  - lib/proxy_machine/proxy.rb
56
+ - lib/symbol.rb
56
57
  - proxy_machine.gemspec
57
58
  - spec/proxy_spec.rb
58
59
  has_rdoc: true