enumerate_it 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enumerate_it (1.1.1)
4
+ enumerate_it (1.2.0)
5
5
  activesupport (>= 3.0.0)
6
6
 
7
7
  GEM
data/README.rdoc CHANGED
@@ -83,7 +83,7 @@ This will create some nice stuff:
83
83
 
84
84
  * You can retrieve the symbol used to declare a specific enumeration value:
85
85
 
86
- RelationshipStatus.key_for(RelationshioStatus::MARRIED) # :married
86
+ RelationshipStatus.key_for(RelationshipStatus::MARRIED) # :married
87
87
 
88
88
  * You can iterate over the list of the enumeration's values:
89
89
 
@@ -197,6 +197,44 @@ This will create:
197
197
  p.relationship_status_married? #=> true
198
198
  p.relationship_status_divoced? #=> false
199
199
 
200
+ * You can define polymorphic behavior for the enum values, so you can define a class for each of
201
+ them:
202
+
203
+ class RelationshipStatus < EnumerateIt::Base
204
+ associate_values :married, :single
205
+
206
+ class Married
207
+ def saturday_night
208
+ "At home with the kids"
209
+ end
210
+ end
211
+
212
+ class Single
213
+ def saturday_night
214
+ "Party Hard!"
215
+ end
216
+ end
217
+ end
218
+
219
+ class Person < ActiveRecord::Base
220
+ has_enumeration_for :relationship_status, :with => RelationshipStatus, :create_helpers => { :polymorphic => true }
221
+ end
222
+
223
+ p = Person.new
224
+ p.relationship_status = RelationshipStatus::MARRIED
225
+ p.relationship_status_object.saturday_night # => "At home with the kids"
226
+
227
+ p.relationship_status = RelationshipStatus::SINGLE
228
+ p.relationship_status_object.saturday_night # => "Party Hard!"
229
+
230
+ You can also change the suffix '_object', using the :suffix option:
231
+
232
+ class Person < ActiveRecord::Base
233
+ has_enumeration_for :relationship_status, :with => RelationshipStatus, :create_helpers => { :polymorphic => { :suffix => "_mode" } }
234
+ end
235
+
236
+ p.relationship_status_mode.saturday_night
237
+
200
238
  * The :create_helpers also creates some mutator helper methods, that can be used to change the attribute's value.
201
239
 
202
240
  class Person < ActiveRecord::Base
data/lib/enumerate_it.rb CHANGED
@@ -170,6 +170,44 @@
170
170
  # p.relationship_status_married? #=> true
171
171
  # p.relationship_status_divoced? #=> false
172
172
  #
173
+ # - You can define polymorphic behavior for the enum values, so you can define a class for each of
174
+ # them:
175
+ #
176
+ # class RelationshipStatus < EnumerateIt::Base
177
+ # associate_values :married, :single
178
+ #
179
+ # class Married
180
+ # def saturday_night
181
+ # "At home with the kids"
182
+ # end
183
+ # end
184
+ #
185
+ # class Single
186
+ # def saturday_night
187
+ # "Party Hard!"
188
+ # end
189
+ # end
190
+ # end
191
+ #
192
+ # class Person < ActiveRecord::Base
193
+ # has_enumeration_for :relationship_status, :with => RelationshipStatus, :create_helpers => { :polymorphic => true }
194
+ # end
195
+ #
196
+ # p = Person.new
197
+ # p.relationship_status = RelationshipStatus::MARRIED
198
+ # p.relationship_status_object.saturday_night # => "At home with the kids"
199
+ #
200
+ # p.relationship_status = RelationshipStatus::SINGLE
201
+ # p.relationship_status_object.saturday_night # => "Party Hard!"
202
+ #
203
+ # You can also change the suffix '_object', using the :suffix option:
204
+ #
205
+ # class Person < ActiveRecord::Base
206
+ # has_enumeration_for :relationship_status, :with => RelationshipStatus, :create_helpers => { :polymorphic => { :suffix => "_mode" } }
207
+ # end
208
+ #
209
+ # p.relationship_status_mode.saturday_night
210
+ #
173
211
  # - If you pass the :create_scopes option as 'true', it will create a scope method for each enumeration option (this option defaults to false):
174
212
  #
175
213
  # class Person < ActiveRecord::Base
@@ -12,6 +12,7 @@ module EnumerateIt
12
12
  if options[:create_helpers]
13
13
  create_helper_methods options[:with], attribute, options[:create_helpers]
14
14
  create_mutator_methods options[:with], attribute, options[:create_helpers]
15
+ create_polymorphic_methods options[:with], attribute, options[:create_helpers]
15
16
  end
16
17
 
17
18
  if options[:create_scopes]
@@ -66,6 +67,21 @@ module EnumerateIt
66
67
  end
67
68
  end
68
69
 
70
+ def create_polymorphic_methods(klass, attribute_name, helpers)
71
+ return unless helpers.is_a?(Hash) && helpers[:polymorphic]
72
+ options = helpers[:polymorphic]
73
+ suffix = options.is_a?(Hash) && options[:suffix]
74
+ suffix ||= "_object"
75
+
76
+ class_eval do
77
+ define_method "#{attribute_name}#{suffix}" do
78
+ value = self.public_send(attribute_name)
79
+
80
+ klass.const_get(klass.key_for(value).to_s.camelize).new if value
81
+ end
82
+ end
83
+ end
84
+
69
85
  def define_enumeration_class(attribute, options)
70
86
  if options[:with].nil?
71
87
  inner_enum_class_name = attribute.to_s.camelize.to_sym
@@ -1,3 +1,3 @@
1
1
  module EnumerateIt
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -185,6 +185,52 @@ describe EnumerateIt do
185
185
  target.foobar.should == TestEnumeration::VALUE_3
186
186
  end
187
187
  end
188
+
189
+ context "with :polymorphic option" do
190
+ before :each do
191
+ class Polymorphic
192
+ extend EnumerateIt
193
+ attr_accessor :foo
194
+ has_enumeration_for :foo, :with => PolymorphicEnum, :create_helpers => { :polymorphic => true }
195
+ end
196
+ end
197
+
198
+ it "calls methods on the enum constants' objects" do
199
+ target = Polymorphic.new
200
+ target.foo = PolymorphicEnum::NORMAL
201
+
202
+ target.foo_object.print("Gol").should == "I'm Normal: Gol"
203
+
204
+ target.foo = PolymorphicEnum::CRAZY
205
+
206
+ target.foo_object.print("Gol").should == "Whoa!: Gol"
207
+ end
208
+
209
+ it "returns nil if foo is not set" do
210
+ target = Polymorphic.new
211
+
212
+ target.foo_object.should be_nil
213
+ end
214
+
215
+ context "and :suffix" do
216
+ before :each do
217
+ class Polymorphic
218
+ has_enumeration_for :foo, :with => PolymorphicEnum, :create_helpers => { :polymorphic => { :suffix => "_strategy" } }
219
+ end
220
+ end
221
+
222
+ it "calls methods on the enum constants' objects" do
223
+ target = Polymorphic.new
224
+ target.foo = PolymorphicEnum::NORMAL
225
+
226
+ target.foo_strategy.print("Gol").should == "I'm Normal: Gol"
227
+
228
+ target.foo = PolymorphicEnum::CRAZY
229
+
230
+ target.foo_strategy.print("Gol").should == "Whoa!: Gol"
231
+ end
232
+ end
233
+ end
188
234
  end
189
235
 
190
236
  describe "using the :create_scopes option" do
@@ -33,6 +33,22 @@ class Foobar < EnumerateIt::Base
33
33
  )
34
34
  end
35
35
 
36
+ class PolymorphicEnum < EnumerateIt::Base
37
+ associate_values :normal, :crazy
38
+
39
+ class Normal
40
+ def print(msg)
41
+ "I'm Normal: #{msg}"
42
+ end
43
+ end
44
+
45
+ class Crazy
46
+ def print(msg)
47
+ "Whoa!: #{msg}"
48
+ end
49
+ end
50
+ end
51
+
36
52
  class BaseClass
37
53
  extend EnumerateIt
38
54
  has_enumeration_for :foobar, :with => TestEnumeration
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumerate_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-03 00:00:00.000000000 Z
12
+ date: 2013-08-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -158,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
158
  version: '0'
159
159
  segments:
160
160
  - 0
161
- hash: -817288258794681256
161
+ hash: 1153526174871300187
162
162
  required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  none: false
164
164
  requirements:
@@ -167,10 +167,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
167
  version: '0'
168
168
  segments:
169
169
  - 0
170
- hash: -817288258794681256
170
+ hash: 1153526174871300187
171
171
  requirements: []
172
172
  rubyforge_project:
173
- rubygems_version: 1.8.25
173
+ rubygems_version: 1.8.24
174
174
  signing_key:
175
175
  specification_version: 3
176
176
  summary: Ruby Enumerations