classy_enum 3.3.2 → 3.4.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/LICENSE +1 -1
- data/README.md +17 -15
- data/classy_enum.gemspec +2 -2
- data/lib/classy_enum/base.rb +12 -1
- data/lib/classy_enum/collection.rb +13 -1
- data/lib/classy_enum/version.rb +1 -1
- data/spec/classy_enum/active_record_spec.rb +16 -4
- data/spec/classy_enum/base_spec.rb +10 -0
- data/spec/classy_enum/collection_spec.rb +12 -0
- data/spec/classy_enum_inheritance_spec.rb +5 -6
- data/spec/spec_helper.rb +0 -4
- metadata +20 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39e6a9bb72f8a98c0517d42b6bf3d3dba7f7832e
|
4
|
+
data.tar.gz: 1ba0072e00fd99397f99c5fdc216f5866f0ef9a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e2abe6cc896cfc7d681636fff656115e7f9d81407dcbeedfa90fec647e9b787564aa9a2da7065a7449dbb717f728bbab651a81f0f12ed4dcd5a0296b48614df
|
7
|
+
data.tar.gz: f5479eafdb914aa5feb877a7f51eebf786281414365dee10564e7c92b09e8d76e698cd3d2e0c08d8b0a127c59a5a52bca11d13efb51dd9b234a2ecd310bb44f0
|
data/CHANGELOG.md
CHANGED
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -25,7 +25,9 @@ See the [wiki](https://github.com/beerlington/classy_enum/wiki/Upgrading) for no
|
|
25
25
|
|
26
26
|
## Getting Started & Example Usage
|
27
27
|
|
28
|
-
The most common use for ClassyEnum is to replace database lookup tables where the content and behavior is mostly static and has multiple "types".
|
28
|
+
The most common use for ClassyEnum is to replace database lookup tables where the content and behavior is mostly static and has multiple "types". Please see the Wiki for a short discussion on use cases [comparing ClassyEnum to other gems](https://github.com/beerlington/classy_enum/wiki/ClassyEnum-vs-other-gems).
|
29
|
+
|
30
|
+
In this example, I have an Active Record model called `Alarm` with an attribute called `priority`. Priority is stored as a string (VARCHAR) type in the database and is converted to an enum value when requested.
|
29
31
|
|
30
32
|
### 1. Generate the Enum
|
31
33
|
|
@@ -130,6 +132,19 @@ With this setup, I can now do the following:
|
|
130
132
|
|
131
133
|
The enum field works like any other model attribute. It can be mass-assigned using `#update_attributes`.
|
132
134
|
|
135
|
+
#### What if your enum class name is not the same as your model's attribute name?
|
136
|
+
|
137
|
+
Just provide an optional `enum` argument to declare the attribute name. In this case, the model's attribute is called *alarm_priority*.
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
class Alarm < ActiveRecord::Base
|
141
|
+
classy_enum_attr :alarm_priority, enum: 'Priority'
|
142
|
+
end
|
143
|
+
|
144
|
+
@alarm = Alarm.create(alarm_priority: :medium)
|
145
|
+
@alarm.alarm_priority # => Priority::Medium
|
146
|
+
```
|
147
|
+
|
133
148
|
## Internationalization
|
134
149
|
|
135
150
|
ClassyEnum provides built-in support for translations using Ruby's I18n
|
@@ -292,19 +307,6 @@ end
|
|
292
307
|
@alarm.to_json.should == "{\"alarm\":{\"priority\":{}}}"
|
293
308
|
```
|
294
309
|
|
295
|
-
## Special Cases
|
296
|
-
|
297
|
-
What if your enum class name is not the same as your model's attribute name? No problem! Just use a second argument in `classy_enum_attr` to declare the attribute name. In this case, the model's attribute is called *alarm_priority*.
|
298
|
-
|
299
|
-
```ruby
|
300
|
-
class Alarm < ActiveRecord::Base
|
301
|
-
classy_enum_attr :alarm_priority, enum: 'Priority'
|
302
|
-
end
|
303
|
-
|
304
|
-
@alarm = Alarm.create(alarm_priority: :medium)
|
305
|
-
@alarm.alarm_priority # => Priority::Medium
|
306
|
-
```
|
307
|
-
|
308
310
|
## Model Validation
|
309
311
|
|
310
312
|
An Active Record validator `validates_inclusion_of :field, in: ENUM` is automatically added to your model when you use `classy_enum_attr`.
|
@@ -359,4 +361,4 @@ available but needs to be enabled manually. To enable support visit
|
|
359
361
|
|
360
362
|
## Copyright
|
361
363
|
|
362
|
-
Copyright (c) 2010-
|
364
|
+
Copyright (c) 2010-2014 [Peter Brown](https://github.com/beerlington). See LICENSE for details.
|
data/classy_enum.gemspec
CHANGED
@@ -15,9 +15,9 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = ClassyEnum::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency('
|
18
|
+
gem.add_dependency('activerecord', '>= 3.0')
|
19
19
|
|
20
|
-
gem.add_development_dependency('rspec
|
20
|
+
gem.add_development_dependency('rspec', '>= 2.11')
|
21
21
|
gem.add_development_dependency('sqlite3', '>= 1.3')
|
22
22
|
gem.add_development_dependency('json', '>= 1.6')
|
23
23
|
gem.add_development_dependency('debugger')
|
data/lib/classy_enum/base.rb
CHANGED
@@ -8,10 +8,21 @@ module ClassyEnum
|
|
8
8
|
include Translation
|
9
9
|
include Collection
|
10
10
|
|
11
|
-
class_attribute :base_class
|
12
11
|
attr_accessor :owner, :serialize_as_json, :allow_blank
|
13
12
|
|
13
|
+
def base_class
|
14
|
+
self.class.base_class
|
15
|
+
end
|
16
|
+
|
14
17
|
class << self
|
18
|
+
def base_class
|
19
|
+
@base_class ||= superclass.base_class
|
20
|
+
end
|
21
|
+
|
22
|
+
def base_class=(klass)
|
23
|
+
@base_class = klass
|
24
|
+
end
|
25
|
+
|
15
26
|
def inherited(klass)
|
16
27
|
return if klass.anonymous?
|
17
28
|
|
@@ -26,6 +26,10 @@ module ClassyEnum
|
|
26
26
|
index <=> other.index
|
27
27
|
end
|
28
28
|
|
29
|
+
def enum_options
|
30
|
+
self.class.enum_options
|
31
|
+
end
|
32
|
+
|
29
33
|
def self.included(klass)
|
30
34
|
klass.extend ClassMethods
|
31
35
|
end
|
@@ -36,7 +40,15 @@ module ClassyEnum
|
|
36
40
|
|
37
41
|
def inherited(klass)
|
38
42
|
if self == ClassyEnum::Base
|
39
|
-
klass.
|
43
|
+
klass.class_eval do
|
44
|
+
def self.enum_options
|
45
|
+
@enum_options ||= superclass.enum_options
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.enum_options=(options)
|
49
|
+
@enum_options = options
|
50
|
+
end
|
51
|
+
end
|
40
52
|
klass.enum_options = []
|
41
53
|
else
|
42
54
|
enum_options << klass
|
data/lib/classy_enum/version.rb
CHANGED
@@ -78,7 +78,10 @@ describe DefaultDog do
|
|
78
78
|
context "with invalid breed options" do
|
79
79
|
subject { DefaultDog.new(:breed => :fake_breed) }
|
80
80
|
it { should_not be_valid }
|
81
|
-
it
|
81
|
+
it 'has an error on :breed' do
|
82
|
+
subject.valid?
|
83
|
+
subject.errors[:breed].size.should eql(1)
|
84
|
+
end
|
82
85
|
end
|
83
86
|
end
|
84
87
|
|
@@ -95,7 +98,10 @@ describe "A ClassyEnum that allows blanks" do
|
|
95
98
|
context "with invalid breed options" do
|
96
99
|
subject { AllowBlankBreedDog.new(:breed => :fake_breed) }
|
97
100
|
it { should_not be_valid }
|
98
|
-
it
|
101
|
+
it 'has an error on :breed' do
|
102
|
+
subject.valid?
|
103
|
+
subject.errors[:breed].size.should eql(1)
|
104
|
+
end
|
99
105
|
end
|
100
106
|
end
|
101
107
|
|
@@ -112,7 +118,10 @@ describe "A ClassyEnum that allows nils" do
|
|
112
118
|
context "with invalid breed options" do
|
113
119
|
subject { AllowNilBreedDog.new(:breed => :fake_breed) }
|
114
120
|
it { should_not be_valid }
|
115
|
-
it
|
121
|
+
it 'has an error on :breed' do
|
122
|
+
subject.valid?
|
123
|
+
subject.errors[:breed].size.should eql(1)
|
124
|
+
end
|
116
125
|
end
|
117
126
|
end
|
118
127
|
|
@@ -137,7 +146,10 @@ describe ActiveDog do
|
|
137
146
|
ActiveDog.create!(:name => 'Kitteh', :breed => :husky, :color => :black)
|
138
147
|
end
|
139
148
|
|
140
|
-
it
|
149
|
+
it 'has an error on :name' do
|
150
|
+
subject.valid?
|
151
|
+
subject.errors[:name].size.should eql(1)
|
152
|
+
end
|
141
153
|
end
|
142
154
|
end
|
143
155
|
|
@@ -55,6 +55,16 @@ describe ClassyEnum::Base do
|
|
55
55
|
}.should raise_error(ClassyEnum::SubclassNameError)
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
context '#base_class' do
|
60
|
+
let(:base_class) { double }
|
61
|
+
|
62
|
+
it 'returns class base_class' do
|
63
|
+
enum = ClassyEnumBase.build(:two)
|
64
|
+
enum.class.base_class = base_class
|
65
|
+
enum.base_class.should == base_class
|
66
|
+
end
|
67
|
+
end
|
58
68
|
end
|
59
69
|
|
60
70
|
describe ClassyEnum::Base, 'Arel visitor' do
|
@@ -71,6 +71,18 @@ describe ClassyEnum::Collection do
|
|
71
71
|
enum.select(&:odd?).should == [ClassyEnumCollection::One.new, ClassyEnumCollection::Three.new]
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
context '#enum_options' do
|
76
|
+
let(:options) { double }
|
77
|
+
|
78
|
+
before do
|
79
|
+
subject.enum_options = options
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns class enum_options' do
|
83
|
+
subject.new.enum_options.should == options
|
84
|
+
end
|
85
|
+
end
|
74
86
|
end
|
75
87
|
|
76
88
|
describe ClassyEnum::Collection, Comparable do
|
@@ -1,25 +1,24 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
class ProjectTier < ClassyEnum::Base
|
4
|
-
|
4
|
+
def self.hello
|
5
|
+
'world'
|
6
|
+
end
|
5
7
|
end
|
6
8
|
|
7
9
|
class ProjectTier::One < ProjectTier
|
8
|
-
self.inherited_properties = [1,2,3]
|
9
10
|
end
|
10
11
|
|
11
12
|
class ProjectTier::Two < ProjectTier::One
|
12
|
-
self.inherited_properties += [4,5,6]
|
13
13
|
end
|
14
14
|
|
15
15
|
describe 'Classy Enum inheritance' do
|
16
16
|
it 'should inherit from the previous class' do
|
17
|
-
ProjectTier::
|
18
|
-
ProjectTier::Two.inherited_properties.should eql([1,2,3,4,5,6])
|
17
|
+
ProjectTier::Two.hello.should eq(ProjectTier::One.hello)
|
19
18
|
end
|
20
19
|
|
21
20
|
it 'should instantiate the subclass' do
|
22
|
-
ProjectTier
|
21
|
+
ProjectTier.build(:two).should == ProjectTier::Two.new
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'should have the right index' do
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
|
-
require 'rails'
|
6
5
|
require 'active_record'
|
7
|
-
require 'action_view'
|
8
|
-
require 'action_controller'
|
9
|
-
require 'rspec/rails'
|
10
6
|
require 'classy_enum'
|
11
7
|
|
12
8
|
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: classy_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Brown
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
28
|
+
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '2.11'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.11'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sqlite3
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: json
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.6'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.6'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: debugger
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: A utility that adds class based enum functionality to ActiveRecord attributes
|
@@ -87,8 +87,8 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .travis.yml
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
92
92
|
- CHANGELOG.md
|
93
93
|
- Gemfile
|
94
94
|
- LICENSE
|
@@ -133,17 +133,17 @@ require_paths:
|
|
133
133
|
- lib
|
134
134
|
required_ruby_version: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
140
|
requirements:
|
141
|
-
- -
|
141
|
+
- - ">"
|
142
142
|
- !ruby/object:Gem::Version
|
143
|
-
version:
|
143
|
+
version: 1.3.1
|
144
144
|
requirements: []
|
145
145
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.
|
146
|
+
rubygems_version: 2.2.0
|
147
147
|
signing_key:
|
148
148
|
specification_version: 4
|
149
149
|
summary: A class based enumerator utility for Ruby on Rails
|