classy_enum 1.3.1 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +1 -0
- data/README.textile +20 -0
- data/VERSION +1 -1
- data/classy_enum.gemspec +2 -2
- data/lib/classy_enum/attributes.rb +2 -1
- data/lib/classy_enum/class_methods.rb +8 -10
- data/lib/classy_enum/instance_methods.rb +7 -5
- data/spec/classy_enum_owner_reference_spec.rb +12 -3
- data/spec/spec_helper.rb +4 -0
- metadata +13 -13
data/.travis.yml
CHANGED
data/README.textile
CHANGED
@@ -149,6 +149,26 @@ In the above example, high priority alarms are only emailed if the owning alarm
|
|
149
149
|
@alarm.send_email? # => false
|
150
150
|
</pre>
|
151
151
|
|
152
|
+
h2. Serializing as JSON
|
153
|
+
|
154
|
+
By default, the enum will be serialized as a string representing the value:
|
155
|
+
|
156
|
+
<pre>
|
157
|
+
@alarm = Alarm.create(:priority => :high, :enabled => true)
|
158
|
+
@alarm.to_json.should == "{\"alarm\":{\"priority\":\"high\"}}"
|
159
|
+
</pre>
|
160
|
+
|
161
|
+
This behavior can be overridden by using the @:serialize_as_json => true@ option in your ActiveRecord model:
|
162
|
+
|
163
|
+
<pre>
|
164
|
+
class Alarm < ActiveRecord::Base
|
165
|
+
classy_enum_attr :priority, :serialize_as_json => true
|
166
|
+
end
|
167
|
+
|
168
|
+
@alarm = Alarm.create(:priority => :high, :enabled => true)
|
169
|
+
@alarm.to_json.should == "{\"alarm\":{\"priority\":{}}}"
|
170
|
+
</pre>
|
171
|
+
|
152
172
|
h2. Special Cases
|
153
173
|
|
154
174
|
What if your enum class name is not the same as your model's attribute name? No problem! Just use a second arugment in @classy_enum_attr@ to declare the attribute name. In this case, the model's attribute is called *alarm_priority*.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.2
|
data/classy_enum.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{classy_enum}
|
8
|
-
s.version = "1.3.
|
8
|
+
s.version = "1.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Peter Brown}]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-11-12}
|
13
13
|
s.description = %q{A utility that adds class based enum functionality to ActiveRecord attributes}
|
14
14
|
s.email = %q{github@lette.us}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,6 +25,7 @@ module ClassyEnum
|
|
25
25
|
enum = options[:enum] || attribute
|
26
26
|
allow_blank = options[:allow_blank] || false
|
27
27
|
allow_nil = options[:allow_nil] || false
|
28
|
+
serialize_as_json = options[:serialize_as_json] || false
|
28
29
|
|
29
30
|
klass = enum.to_s.camelize.constantize
|
30
31
|
|
@@ -36,7 +37,7 @@ module ClassyEnum
|
|
36
37
|
|
37
38
|
# Define getter method that returns a ClassyEnum instance
|
38
39
|
define_method attribute do
|
39
|
-
klass.build(super(), self)
|
40
|
+
klass.build(super(), :owner => self, :serialize_as_json => serialize_as_json)
|
40
41
|
end
|
41
42
|
|
42
43
|
# Define setter method that accepts either string or symbol for member
|
@@ -26,15 +26,12 @@ module ClassyEnum
|
|
26
26
|
@index = index + 1
|
27
27
|
@option = option
|
28
28
|
|
29
|
+
attr_accessor :owner, :serialize_as_json
|
30
|
+
|
29
31
|
# Use ActiveModel::AttributeMethods to define attribute? methods
|
30
32
|
attribute_method_suffix '?'
|
31
33
|
define_attribute_methods enums
|
32
34
|
|
33
|
-
def initialize
|
34
|
-
@to_s = self.class.instance_variable_get('@option').to_s
|
35
|
-
@index = self.class.instance_variable_get('@index')
|
36
|
-
end
|
37
|
-
|
38
35
|
end
|
39
36
|
|
40
37
|
klass_name = "#{self}#{option.to_s.camelize}"
|
@@ -51,12 +48,13 @@ module ClassyEnum
|
|
51
48
|
# end
|
52
49
|
#
|
53
50
|
# Priority.build(:low) # => PriorityLow.new
|
54
|
-
def build(
|
55
|
-
return
|
56
|
-
return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include?
|
51
|
+
def build(value, options={})
|
52
|
+
return value if value.blank?
|
53
|
+
return TypeError.new("Valid #{self} options are #{self.valid_options}") unless self::OPTIONS.include? value.to_sym
|
57
54
|
|
58
|
-
object = Object.const_get("#{self}#{
|
59
|
-
object.
|
55
|
+
object = Object.const_get("#{self}#{value.to_s.camelize}").new
|
56
|
+
object.owner = options[:owner]
|
57
|
+
object.serialize_as_json = options[:serialize_as_json]
|
60
58
|
object
|
61
59
|
end
|
62
60
|
|
@@ -12,7 +12,7 @@ module ClassyEnum
|
|
12
12
|
# @priority = PriorityMedium.new
|
13
13
|
# @priority.index # => 2
|
14
14
|
def index
|
15
|
-
@index
|
15
|
+
self.class.instance_variable_get('@index')
|
16
16
|
end
|
17
17
|
|
18
18
|
alias :to_i :index
|
@@ -28,7 +28,7 @@ module ClassyEnum
|
|
28
28
|
# @priority = PriorityLow.new
|
29
29
|
# @priority.to_s # => 'low'
|
30
30
|
def to_s
|
31
|
-
@to_s
|
31
|
+
self.class.instance_variable_get('@option').to_s
|
32
32
|
end
|
33
33
|
|
34
34
|
# Returns a Symbol corresponding to a string representation of element,
|
@@ -43,7 +43,7 @@ module ClassyEnum
|
|
43
43
|
# @priority = PriorityLow.new
|
44
44
|
# @priority.to_sym # => :low
|
45
45
|
def to_sym
|
46
|
-
|
46
|
+
to_s.to_sym
|
47
47
|
end
|
48
48
|
|
49
49
|
# Returns string representing enum in Rails titleize format
|
@@ -57,7 +57,7 @@ module ClassyEnum
|
|
57
57
|
# @priority = Priority.build(:really_high)
|
58
58
|
# @priority.name # => "Really High"
|
59
59
|
def name
|
60
|
-
|
60
|
+
to_s.titleize
|
61
61
|
end
|
62
62
|
|
63
63
|
# Sort an array of elements based on the order they are defined
|
@@ -76,7 +76,7 @@ module ClassyEnum
|
|
76
76
|
# priorities.max # => @high
|
77
77
|
# priorities.min # => @low
|
78
78
|
def <=> other
|
79
|
-
|
79
|
+
index <=> other.index
|
80
80
|
end
|
81
81
|
|
82
82
|
# Used by ActiveRecord::PredicateBuilder when building from a hash
|
@@ -92,8 +92,10 @@ module ClassyEnum
|
|
92
92
|
|
93
93
|
# Overrides as_json to remove owner reference recursion issues
|
94
94
|
def as_json(options=nil)
|
95
|
+
return to_s unless serialize_as_json
|
95
96
|
json = super(options)
|
96
97
|
json.delete('owner')
|
98
|
+
json.delete('serialize_as_json')
|
97
99
|
json
|
98
100
|
end
|
99
101
|
|
@@ -15,9 +15,15 @@ class Cat < ActiveRecord::Base
|
|
15
15
|
delegate :breed_color, :to => :breed
|
16
16
|
end
|
17
17
|
|
18
|
+
class OtherCat < ActiveRecord::Base
|
19
|
+
classy_enum_attr :breed, :enum => :cat_breed, :serialize_as_json => true
|
20
|
+
attr_accessor :color
|
21
|
+
delegate :breed_color, :to => :breed
|
22
|
+
end
|
23
|
+
|
18
24
|
describe Cat do
|
19
25
|
let(:abyssian) { Cat.new(:breed => :abyssian, :color => 'black') }
|
20
|
-
let(:persian) {
|
26
|
+
let(:persian) { OtherCat.new(:breed => :persian, :color => 'white') }
|
21
27
|
|
22
28
|
it 'should delegate breed color to breed with an ownership reference' do
|
23
29
|
abyssian.breed_color { should eql('black Abyssian') }
|
@@ -25,8 +31,11 @@ describe Cat do
|
|
25
31
|
end
|
26
32
|
|
27
33
|
it 'should correctly serialize without the owner reference' do
|
28
|
-
abyssian.to_json.should == "{\"cat\":{\"breed\"
|
29
|
-
|
34
|
+
abyssian.to_json.should == "{\"cat\":{\"breed\":\"abyssian\"}}"
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should convert the enum to a string when serializing' do
|
38
|
+
persian.to_json.should == "{\"other_cat\":{\"breed\":{}}}"
|
30
39
|
end
|
31
40
|
|
32
41
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classy_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-11-12 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70109521646960 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70109521646960
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: jeweler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70109521646460 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.6.2
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70109521646460
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec-rails
|
38
|
-
requirement: &
|
38
|
+
requirement: &70109521645440 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.6.1
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70109521645440
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: formtastic
|
49
|
-
requirement: &
|
49
|
+
requirement: &70109521644780 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.2.4
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70109521644780
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: sqlite3-ruby
|
60
|
-
requirement: &
|
60
|
+
requirement: &70109521644180 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70109521644180
|
69
69
|
description: A utility that adds class based enum functionality to ActiveRecord attributes
|
70
70
|
email: github@lette.us
|
71
71
|
executables: []
|
@@ -114,7 +114,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
114
|
version: '0'
|
115
115
|
segments:
|
116
116
|
- 0
|
117
|
-
hash: -
|
117
|
+
hash: -4456031736000763211
|
118
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
119
|
none: false
|
120
120
|
requirements:
|