rubysl-forwardable 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f8dc4c1445a7bc908a8a5082265c1222e8474f5f
4
- data.tar.gz: c3ad9fcd21418c1fca9fe5ff09d91bbd35445af8
3
+ metadata.gz: 62ca4e7f89156c2691cd34cefde13fa0c6ad7d84
4
+ data.tar.gz: df4d7a3df9c54e3855c610f4691535d83eb6b7f4
5
5
  SHA512:
6
- metadata.gz: 672b1e711ad4bb718704a43f7fca3523615407642803d438366ca87899f98e697ed8c5fa7fa3155d4bb89253b60bd432ab4464d71d75ba039391745df859cb8b
7
- data.tar.gz: 209a0f12c8bd8777d78399703219d01bef83f9ea472faf0449fefaed0268b744b8e481ed2e124caeecea26d51b9159485f15c74b3c28114ce981727e4359e11e
6
+ metadata.gz: 2d9d5fdc5ff98d24a346a1be08fe93dcb9f81479512037a1fda56392586a0886d09bacc5feb2dd5092cf89aae2396daf6dab0247e33155b0839bae92481a42a5
7
+ data.tar.gz: 1dfb2806a207e15079b467cd8d4a822a29a2e6e39487bf74e632cd15e4b73f875d3153ae7428f46973bd9095cbe7cb5dea032838c9bd49d9b54572c2425e480f
data/.travis.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
- before_install:
3
- - gem update --system
4
- - gem --version
5
- - gem install rubysl-bundler
6
- script: bundle exec mspec spec
2
+ env:
3
+ - RUBYLIB=lib
4
+ script: bundle exec mspec
7
5
  rvm:
8
- - rbx-nightly-18mode
6
+ - 1.9.3
7
+ - rbx-nightly-19mode
@@ -1,17 +1,17 @@
1
- # = forwardable - Support for the Delegation Pattern
2
1
  #
3
- # $Release Version: 1.1$
4
- # $Revision: 11708 $
5
- # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
- # by Keiju ISHITSUKA(keiju@ishitsuka.com)
2
+ # forwardable.rb -
3
+ # $Release Version: 1.1$
4
+ # $Revision: 31833 $
5
+ # by Keiju ISHITSUKA(keiju@ishitsuka.com)
6
+ # original definition by delegator.rb
7
+ # Revised by Daniel J. Berger with suggestions from Florian Gross.
7
8
  #
8
- # Documentation by James Edward Gray II and Gavin Sinclair
9
+ # Documentation by James Edward Gray II and Gavin Sinclair
9
10
  #
10
11
  # == Introduction
11
12
  #
12
13
  # This library allows you delegate method calls to an object, on a method by
13
- # method basis. You can use Forwardable to setup this delegation at the class
14
- # level, or SingleForwardable to handle it at the object level.
14
+ # method basis.
15
15
  #
16
16
  # == Notes
17
17
  #
@@ -33,28 +33,28 @@
33
33
  #
34
34
  # class Queue
35
35
  # extend Forwardable
36
- #
36
+ #
37
37
  # def initialize
38
38
  # @q = [ ] # prepare delegate object
39
39
  # end
40
- #
41
- # # setup prefered interface, enq() and deq()...
40
+ #
41
+ # # setup preferred interface, enq() and deq()...
42
42
  # def_delegator :@q, :push, :enq
43
43
  # def_delegator :@q, :shift, :deq
44
- #
44
+ #
45
45
  # # support some general Array methods that fit Queues well
46
46
  # def_delegators :@q, :clear, :first, :push, :shift, :size
47
47
  # end
48
- #
48
+ #
49
49
  # q = Queue.new
50
50
  # q.enq 1, 2, 3, 4, 5
51
51
  # q.push 6
52
- #
52
+ #
53
53
  # q.shift # => 1
54
54
  # while q.size > 0
55
55
  # puts q.deq
56
56
  # end
57
- #
57
+ #
58
58
  # q.enq "Ruby", "Perl", "Python"
59
59
  # puts q.first
60
60
  # q.clear
@@ -70,13 +70,34 @@
70
70
  # Ruby
71
71
  # nil
72
72
  #
73
- # === SingleForwardable
73
+ # SingleForwardable can be used to setup delegation at the object level as well.
74
74
  #
75
75
  # printer = String.new
76
76
  # printer.extend SingleForwardable # prepare object for delegation
77
77
  # printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
78
78
  # printer.puts "Howdy!"
79
79
  #
80
+ # Also, SingleForwardable can be use to Class or Module.
81
+ #
82
+ # module Facade
83
+ # extend SingleForwardable
84
+ # def_delegator :Implementation, :service
85
+ #
86
+ # class Implementation
87
+ # def service...
88
+ # end
89
+ # end
90
+ #
91
+ # If you want to use both Forwardable and SingleForwardable, you can
92
+ # use methods def_instance_delegator and def_single_delegator, etc.
93
+ #
94
+ # If the object isn't a Module and Class, You can too extend
95
+ # Forwardable module.
96
+ # printer = String.new
97
+ # printer.extend Forwardable # prepare object for delegation
98
+ # printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
99
+ # printer.puts "Howdy!"
100
+ #
80
101
  # <i>Prints:</i>
81
102
  #
82
103
  # Howdy!
@@ -103,17 +124,38 @@
103
124
  # # extend Forwardable, but we did that above
104
125
  # def_delegators :@records, :size, :<<, :map
105
126
  # end
127
+ # f = Foo.new
128
+ # f.printf ...
129
+ # f.gets
130
+ # f.content_at(1)
106
131
  #
107
132
  # Also see the example at forwardable.rb.
108
- #
133
+
109
134
  module Forwardable
135
+ FORWARDABLE_VERSION = "1.1.0"
110
136
 
111
137
  @debug = nil
112
- class<<self
113
- # force Forwardable to show up in stack backtraces of delegated methods
138
+ class << self
114
139
  attr_accessor :debug
115
140
  end
116
141
 
142
+ # Takes a hash as its argument. The key is a symbol or an array of
143
+ # symbols. These symbols correspond to method names. The value is
144
+ # the accessor to which the methods will be delegated.
145
+ #
146
+ # :call-seq:
147
+ # delegate method => accessor
148
+ # delegate [method, method, ...] => accessor
149
+ #
150
+ def instance_delegate(hash)
151
+ hash.each{ |methods, accessor|
152
+ methods = [methods] unless methods.respond_to?(:each)
153
+ methods.each{ |method|
154
+ def_instance_delegator(accessor, method)
155
+ }
156
+ }
157
+ end
158
+
117
159
  #
118
160
  # Shortcut for defining multiple delegator methods, but with no
119
161
  # provision for using a different name. The following two code
@@ -125,67 +167,76 @@ module Forwardable
125
167
  # def_delegator :@records, :<<
126
168
  # def_delegator :@records, :map
127
169
  #
128
- # See the examples at Forwardable and forwardable.rb.
129
- #
130
170
  def def_instance_delegators(accessor, *methods)
171
+ methods.delete("__send__")
172
+ methods.delete("__id__")
131
173
  for method in methods
132
174
  def_instance_delegator(accessor, method)
133
175
  end
134
176
  end
135
177
 
136
- #
137
- # Defines a method _method_ which delegates to _obj_ (i.e. it calls
138
- # the method of the same name in _obj_). If _new_name_ is
139
- # provided, it is used as the name for the delegate method.
140
- #
141
- # See the examples at Forwardable and forwardable.rb.
142
- #
143
178
  def def_instance_delegator(accessor, method, ali = method)
144
- accessor = accessor.id2name if accessor.kind_of?(Integer)
145
- method = method.id2name if method.kind_of?(Integer)
146
- ali = ali.id2name if ali.kind_of?(Integer)
147
-
148
- module_eval(<<-EOS, "(__FORWARDABLE__)", 1)
179
+ line_no = __LINE__; str = %{
149
180
  def #{ali}(*args, &block)
150
181
  begin
151
182
  #{accessor}.__send__(:#{method}, *args, &block)
152
183
  rescue Exception
153
- $@.delete_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug
154
- Kernel::raise
184
+ $@.delete_if{|s| %r"#{Regexp.quote(__FILE__)}"o =~ s} unless Forwardable::debug
185
+ ::Kernel::raise
155
186
  end
156
187
  end
157
- EOS
188
+ }
189
+ # If it's not a class or module, it's an instance
190
+ begin
191
+ module_eval(str, __FILE__, line_no)
192
+ rescue
193
+ instance_eval(str, __FILE__, line_no)
194
+ end
195
+
158
196
  end
159
197
 
198
+ alias delegate instance_delegate
160
199
  alias def_delegators def_instance_delegators
161
200
  alias def_delegator def_instance_delegator
162
201
  end
163
202
 
164
203
  #
165
- # The SingleForwardable module provides delegation of specified
166
- # methods to a designated object, using the methods #def_delegator
167
- # and #def_delegators. This module is similar to Forwardable, but it works on
168
- # objects themselves, instead of their defining classes.
169
- #
170
- # Also see the example at forwardable.rb.
204
+ # Usage of The SingleForwardable is like Fowadable module.
171
205
  #
172
206
  module SingleForwardable
207
+ # Takes a hash as its argument. The key is a symbol or an array of
208
+ # symbols. These symbols correspond to method names. The value is
209
+ # the accessor to which the methods will be delegated.
210
+ #
211
+ # :call-seq:
212
+ # delegate method => accessor
213
+ # delegate [method, method, ...] => accessor
214
+ #
215
+ def single_delegate(hash)
216
+ hash.each{ |methods, accessor|
217
+ methods = [methods] unless methods.respond_to?(:each)
218
+ methods.each{ |method|
219
+ def_single_delegator(accessor, method)
220
+ }
221
+ }
222
+ end
223
+
173
224
  #
174
225
  # Shortcut for defining multiple delegator methods, but with no
175
226
  # provision for using a different name. The following two code
176
227
  # samples have the same effect:
177
228
  #
178
- # single_forwardable.def_delegators :@records, :size, :<<, :map
179
- #
180
- # single_forwardable.def_delegator :@records, :size
181
- # single_forwardable.def_delegator :@records, :<<
182
- # single_forwardable.def_delegator :@records, :map
229
+ # def_delegators :@records, :size, :<<, :map
183
230
  #
184
- # See the example at forwardable.rb.
231
+ # def_delegator :@records, :size
232
+ # def_delegator :@records, :<<
233
+ # def_delegator :@records, :map
185
234
  #
186
- def def_singleton_delegators(accessor, *methods)
235
+ def def_single_delegators(accessor, *methods)
236
+ methods.delete("__send__")
237
+ methods.delete("__id__")
187
238
  for method in methods
188
- def_singleton_delegator(accessor, method)
239
+ def_single_delegator(accessor, method)
189
240
  end
190
241
  end
191
242
 
@@ -194,25 +245,26 @@ module SingleForwardable
194
245
  # the method of the same name in _obj_). If _new_name_ is
195
246
  # provided, it is used as the name for the delegate method.
196
247
  #
197
- # See the example at forwardable.rb.
198
- #
199
- def def_singleton_delegator(accessor, method, ali = method)
200
- accessor = accessor.id2name if accessor.kind_of?(Integer)
201
- method = method.id2name if method.kind_of?(Integer)
202
- ali = ali.id2name if ali.kind_of?(Integer)
203
-
204
- instance_eval(<<-EOS, "(__FORWARDABLE__)", 1)
205
- def #{ali}(*args, &block)
206
- begin
207
- #{accessor}.__send__(:#{method}, *args,&block)
208
- rescue Exception
209
- $@.delete_if{|s| /^\\(__FORWARDABLE__\\):/ =~ s} unless Forwardable::debug
210
- Kernel::raise
211
- end
212
- end
213
- EOS
248
+ def def_single_delegator(accessor, method, ali = method)
249
+ line_no = __LINE__; str = %{
250
+ def #{ali}(*args, &block)
251
+ begin
252
+ #{accessor}.__send__(:#{method}, *args, &block)
253
+ rescue Exception
254
+ $@.delete_if{|s| %r"#{Regexp.quote(__FILE__)}"o =~ s} unless Forwardable::debug
255
+ ::Kernel::raise
256
+ end
257
+ end
258
+ }
259
+
260
+ instance_eval(str, __FILE__, __LINE__)
214
261
  end
215
262
 
216
- alias def_delegators def_singleton_delegators
217
- alias def_delegator def_singleton_delegator
263
+ alias delegate single_delegate
264
+ alias def_delegators def_single_delegators
265
+ alias def_delegator def_single_delegator
218
266
  end
267
+
268
+
269
+
270
+
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module Forwardable
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -19,5 +19,4 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "bundler", "~> 1.3"
20
20
  spec.add_development_dependency "rake", "~> 10.0"
21
21
  spec.add_development_dependency "mspec", "~> 1.5"
22
- spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
23
- end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-forwardable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-25 00:00:00.000000000 Z
11
+ date: 2013-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
- - !ruby/object:Gem::Dependency
56
- name: rubysl-prettyprint
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '1.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: '1.0'
69
55
  description: Ruby standard library forwardable.
70
56
  email:
71
57
  - brixen@gmail.com