forwardablex 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.2"
4
+ - "1.9.3"
5
+ - "2.0.0"
6
+ - jruby-19mode # JRuby in 1.9 mode
7
+ - rbx-19mode
8
+ script: rake test
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in forwardablex.gemspec
4
4
  gemspec
5
+
6
+ gem 'simplecov', :require => false, :group => :test
7
+ gem 'coveralls', :require => false, :group => :test
data/HISTORY.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # History of ForwardableX
2
2
 
3
+ ## 0.1.4
4
+
5
+ * Added receiver keyword :identity.
6
+
3
7
  ## 0.1.3
4
8
 
5
9
  * Added forward_as_key and forward_as_key! that forward key to receiver.
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ForwardableX is a Ruby library to extend forwardable.rb.
4
4
 
5
+ [![Gem Version](https://badge.fury.io/rb/forwardablex.png)](http://badge.fury.io/rb/forwardablex) [![Build Status](https://travis-ci.org/keita/forwardablex.png?branch=master)](https://travis-ci.org/keita/forwardablex) [![Coverage Status](https://coveralls.io/repos/keita/forwardablex/badge.png?branch=master)](https://coveralls.io/r/keita/forwardablex) [![Code Climate](https://codeclimate.com/github/keita/forwardablex.png)](https://codeclimate.com/github/keita/forwardablex)
6
+
5
7
  ## Installation
6
8
 
7
9
  gem install forwardablex
@@ -43,7 +45,6 @@ Forwarder.new.m #=> "forwarded"
43
45
  ### Class Method Accessor
44
46
 
45
47
  ```ruby
46
- Receiver = Struct(:name)
47
48
  class Forwarder
48
49
  class << self
49
50
  def m
@@ -65,9 +66,22 @@ class Forwarder
65
66
  @table = {:key => "forwarded"}
66
67
  end
67
68
  end
68
- Forwarder.new.key # => "forwarded"
69
+ Forwarder.new.key #=> "forwarded"
69
70
  ```
70
71
 
72
+ ### Identity
73
+
74
+ ```ruby
75
+ class Forwarder
76
+ foward :identity, :self
77
+ end
78
+ Forwarder.new {|x| x == x.self} #=> true
79
+ ```
80
+
81
+ ## Documentation
82
+
83
+ - [API Documentation](http://rubydoc.info/gems/forwardablex)
84
+
71
85
  ## Licence
72
86
 
73
87
  ForwardableX is free software distributed under MIT licence.
data/Rakefile CHANGED
@@ -14,3 +14,5 @@ desc 'Show undocumented function list'
14
14
  task 'html:undoc' do
15
15
  sh "bundle exec yard stats --list-undoc --no-api --compact"
16
16
  end
17
+
18
+ task :default => :test
@@ -17,7 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
+ gem.add_development_dependency "rake"
20
21
  gem.add_development_dependency "bacon"
21
- gem.add_development_dependency "yard", "~> 0.8.5"
22
- gem.add_development_dependency "redcarpet"
22
+ gem.add_development_dependency "yard"
23
+ gem.add_development_dependency "redcarpet" unless RUBY_PLATFORM == 'java'
23
24
  end
@@ -57,21 +57,15 @@ module ForwardableX
57
57
  context.instance_eval do
58
58
  case receiver
59
59
  when :class
60
- define_method(name) do |*args, &b|
61
- self.class.__send__(method, *args, &b)
62
- end
60
+ forward_class_receiver(method, name)
61
+ when :identity
62
+ forward_identity_receiver(name)
63
63
  when Symbol, String
64
- define_method(name) do |*args, &b|
65
- instance_variable_get(receiver).__send__(method, *args, &b)
66
- end
64
+ forward_named_receiver(receiver, method, name)
67
65
  when Proc
68
- define_method(name) do |*args, &b|
69
- instance_eval(&receiver).__send__(method, *args, &b)
70
- end
66
+ forward_proc_receiver(receiver, method, name)
71
67
  else
72
- define_method(name) do |*args, &b|
73
- receiver.__send__(method, *args, &b)
74
- end
68
+ forward_object_receiver(receiver, method, name)
75
69
  end
76
70
  end
77
71
  end
@@ -122,21 +116,15 @@ module ForwardableX
122
116
  context.instance_eval do
123
117
  case receiver
124
118
  when :class
125
- define_method(name) do |*args, &b|
126
- self.class.__send__(:[], key, *args, &b)
127
- end
119
+ forward_class_receiver(:[], name, key)
120
+ when :identity
121
+ forward_identity_receiver(name)
128
122
  when Symbol, String
129
- define_method(name) do |*args, &b|
130
- instance_variable_get(receiver).__send__(:[], key, *args, &b)
131
- end
123
+ forward_named_receiver(receiver, :[], name, key)
132
124
  when Proc
133
- define_method(name) do |*args, &b|
134
- instance_eval(&receiver).__send__(:[], key, *args, &b)
135
- end
125
+ forward_proc_receiver(receiver, :[], name, key)
136
126
  else
137
- define_method(name) do |*args, &b|
138
- receiver.__send__(:[], key, *args, &b)
139
- end
127
+ forward_object_receiver(receiver, :[], name, key)
140
128
  end
141
129
  end
142
130
  end
@@ -151,6 +139,85 @@ module ForwardableX
151
139
  def forward_as_key!(receiver, *keys)
152
140
  keys.each {|key| forward_as_key(receiver, key)}
153
141
  end
142
+
143
+ private
144
+
145
+ # Forward the name to class receiver.
146
+ #
147
+ # @param method [Symbol]
148
+ # method name of the class
149
+ # @param name [Symbol]
150
+ # forwarder method name
151
+ # @param _args [Array<Object>]
152
+ # additional arguments
153
+ # @return [void]
154
+ def forward_class_receiver(method, name, *_args)
155
+ define_method(name) do |*args, &b|
156
+ self.class.__send__(method, *_args, *args, &b)
157
+ end
158
+ end
159
+
160
+ # Forward the name to the named receiver.
161
+ #
162
+ # @param receiver [Symbol]
163
+ # receiver's name
164
+ # @param method [Symbol]
165
+ # method name of the receiver
166
+ # @param name [Symbol]
167
+ # forwarder method name
168
+ # @param _args [Array<Object>]
169
+ # additional arguments
170
+ # @return [void]
171
+ def forward_named_receiver(receiver, method, name, *_args)
172
+ define_method(name) do |*args, &b|
173
+ instance_variable_get(receiver).__send__(method, *_args, *args, &b)
174
+ end
175
+ end
176
+
177
+ # Forward the name to the Proc result.
178
+ #
179
+ # @param proc [Proc]
180
+ # Proc object that generate the receiver
181
+ # @param method [Symbol]
182
+ # method name of the proc result
183
+ # @param name [Symbol]
184
+ # forwarder method name
185
+ # @param _args [Array<Object>]
186
+ # additional arguments
187
+ # @return [void]
188
+ def forward_proc_receiver(proc, method, name, *_args)
189
+ define_method(name) do |*args, &b|
190
+ instance_eval(&proc).__send__(method, *_args, *args, &b)
191
+ end
192
+ end
193
+
194
+ # Forward the name to the identity function.
195
+ #
196
+ # @param name [Symbol]
197
+ # forwarder method name
198
+ # @return [void]
199
+ def forward_identity_receiver(name)
200
+ define_method(name) do |*args, &b|
201
+ self
202
+ end
203
+ end
204
+
205
+ # Forward the name to the object.
206
+ #
207
+ # @param receiver [Object]
208
+ # receiver object
209
+ # @param method [Symbol]
210
+ # method name of the object
211
+ # @param name [Symbol]
212
+ # forwarder method name
213
+ # @param _args [Array<Object>]
214
+ # additional arguments
215
+ # @return [void]
216
+ def forward_object_receiver(receiver, method, name, *_args)
217
+ define_method(name) do |*args, &b|
218
+ receiver.__send__(method, *args, &b)
219
+ end
220
+ end
154
221
  end
155
222
 
156
223
  # @api private
@@ -1,4 +1,4 @@
1
1
  module ForwardableX
2
2
  # version of ForwardableX
3
- VERSION = "0.1.3"
3
+ VERSION = "0.1.4"
4
4
  end
@@ -1,3 +1,12 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+ Coveralls.wear!
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start {add_filter 'test'}
9
+
1
10
  require 'forwardable'
2
11
  require 'forwardablex'
3
12
 
@@ -109,12 +118,30 @@ class KeyForwarder
109
118
  forward_as_key :@table, :a
110
119
  forward_as_key :@table, :a, :b
111
120
  forward_as_key! :@table, :c, :d, :e
121
+ forward_as_key :class, :f
122
+ forward_as_key Proc.new{@table}, :g
123
+ forward_as_key Receiver.new, :h
124
+
125
+ class << self
126
+ def [](key)
127
+ {f: 1}[key]
128
+ end
129
+ end
112
130
 
113
131
  def initialize(table={})
114
132
  @table = table
115
133
  end
116
134
  end
117
135
 
136
+ class IdentityForwarder
137
+ forward :identity, :a
138
+ forward :identity, :a, :b
139
+ forward! :identity, :c, :d, :e
140
+ forward_as_key :identity, :f
141
+ forward_as_key :identity, :f, :g
142
+ forward_as_key! :identity, :h, :i, :j
143
+ end
144
+
118
145
  describe 'ForwardableX' do
119
146
  [ XForwarder.new,
120
147
  DefDelegatorForwarder.new,
@@ -150,12 +177,29 @@ describe 'ForwardableX' do
150
177
  end
151
178
 
152
179
  it 'should forward to the table as key' do
153
- KeyForwarder.new(a: 1, b: 2, c: 3, d: 4, e: 5).tap do |obj|
180
+ KeyForwarder.new(a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8).tap do |obj|
154
181
  obj.a.should == 1
155
182
  obj.b.should == 1
156
183
  obj.c.should == 3
157
184
  obj.d.should == 4
158
185
  obj.e.should == 5
186
+ obj.f.should == 1
187
+ obj.g.should == 7
188
+ obj.h.should == :[]
159
189
  end
160
190
  end
191
+
192
+ it 'should forward to identity' do
193
+ forwarder = IdentityForwarder.new
194
+ forwarder.a.should == forwarder
195
+ forwarder.b.should == forwarder
196
+ forwarder.c.should == forwarder
197
+ forwarder.d.should == forwarder
198
+ forwarder.e.should == forwarder
199
+ forwarder.f.should == forwarder
200
+ forwarder.g.should == forwarder
201
+ forwarder.h.should == forwarder
202
+ forwarder.i.should == forwarder
203
+ forwarder.j.should == forwarder
204
+ end
161
205
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forwardablex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-22 00:00:00.000000000 Z
12
+ date: 2013-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: bacon
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -32,17 +48,17 @@ dependencies:
32
48
  requirement: !ruby/object:Gem::Requirement
33
49
  none: false
34
50
  requirements:
35
- - - ~>
51
+ - - ! '>='
36
52
  - !ruby/object:Gem::Version
37
- version: 0.8.5
53
+ version: '0'
38
54
  type: :development
39
55
  prerelease: false
40
56
  version_requirements: !ruby/object:Gem::Requirement
41
57
  none: false
42
58
  requirements:
43
- - - ~>
59
+ - - ! '>='
44
60
  - !ruby/object:Gem::Version
45
- version: 0.8.5
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: redcarpet
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -67,6 +83,7 @@ extensions: []
67
83
  extra_rdoc_files: []
68
84
  files:
69
85
  - .gitignore
86
+ - .travis.yml
70
87
  - Gemfile
71
88
  - HISTORY.md
72
89
  - LICENSE.txt
@@ -96,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
113
  version: '0'
97
114
  requirements: []
98
115
  rubyforge_project:
99
- rubygems_version: 1.8.24
116
+ rubygems_version: 1.8.25
100
117
  signing_key:
101
118
  specification_version: 3
102
119
  summary: Forwardable extension