acts_as_enumable 0.0.1
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.
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/README.md +78 -0
- data/Rakefile +6 -0
- data/acts_as_enumable.gemspec +23 -0
- data/lib/acts_as_enumable.rb +6 -0
- data/lib/acts_as_enumable/model_additions.rb +46 -0
- data/lib/acts_as_enumable/railtie.rb +9 -0
- data/lib/acts_as_enumable/version.rb +3 -0
- data/spec/acts_as_enumable/model_additions_spec.rb +88 -0
- data/spec/acts_as_enumable_spec.rb +5 -0
- data/spec/spec_helper.rb +2 -0
- metadata +85 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.2-p290@acts_as_enumable --create
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# ActsAsEnumable
|
2
|
+
|
3
|
+
Provide Enum functionality for Active Record.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add the following line to your Gemfile and run `bundle` command to install it.
|
8
|
+
|
9
|
+
``` ruby
|
10
|
+
gem 'acts_as_enumable'
|
11
|
+
```
|
12
|
+
|
13
|
+
*Requires Ruby 1.9.2 or later.*
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Call `acts_as_enumable` in an Active Record class and pass the name of the attribute as well as the enum values (and optionally a default value).
|
18
|
+
|
19
|
+
``` ruby
|
20
|
+
class User < ActiveRecord::Base
|
21
|
+
# assumes the column exists:
|
22
|
+
# integer :role_enum
|
23
|
+
|
24
|
+
acts_as_enumable :role, %w(admin staff helper member), default: :member
|
25
|
+
end
|
26
|
+
```
|
27
|
+
|
28
|
+
Available options are:
|
29
|
+
|
30
|
+
``` text
|
31
|
+
(optional) default: String / Symbol
|
32
|
+
# default value, will be set to nil if it is not provided or it does not match the preset list
|
33
|
+
# eg.
|
34
|
+
# acts_as_enumable :role, %w(admin staff), default: :something_not_exist # set the default value to nil
|
35
|
+
# acts_as_enumable :role, %w(admin staff), default: "staff" # set the defaut value to "staff"
|
36
|
+
```
|
37
|
+
|
38
|
+
This enables the following methods:
|
39
|
+
|
40
|
+
``` ruby
|
41
|
+
user = User.first
|
42
|
+
|
43
|
+
User::ROLES
|
44
|
+
# ["admin", "staff", "helper", "member"]
|
45
|
+
|
46
|
+
User.roles_for_select("users.roles")
|
47
|
+
# [
|
48
|
+
# { key: "admin", value: I18n.t("users.roles.admin") },
|
49
|
+
# { key: "staff", value: I18n.t("users.roles.staff") }, ...
|
50
|
+
# ]
|
51
|
+
|
52
|
+
User.default_role
|
53
|
+
# "member"
|
54
|
+
|
55
|
+
User.default_role_enum
|
56
|
+
# 3
|
57
|
+
|
58
|
+
user.role
|
59
|
+
# "member"
|
60
|
+
|
61
|
+
user.role = "staff" # or user.role = :staff
|
62
|
+
user.role
|
63
|
+
# "staff"
|
64
|
+
|
65
|
+
user.role_enum # if user.role == "staff"
|
66
|
+
# 1
|
67
|
+
|
68
|
+
user.role_enum = 0
|
69
|
+
user.role
|
70
|
+
# "admin"
|
71
|
+
```
|
72
|
+
## Development
|
73
|
+
|
74
|
+
If you have any problems, please post them on the [issue tracker](https://github.com/peterwongpp/acts_as_enumable/issues).
|
75
|
+
|
76
|
+
You can contribute changes by forking the project and submitting a pull request.
|
77
|
+
|
78
|
+
You can ensure the tests passing by running bundle and rake.
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "acts_as_enumable/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "acts_as_enumable"
|
7
|
+
s.version = ActsAsEnumable::VERSION
|
8
|
+
s.authors = ["PeterWong"]
|
9
|
+
s.email = ["peter@primitus.com"]
|
10
|
+
s.homepage = "https://github.com/peterwongpp/acts_as_enumable"
|
11
|
+
s.summary = %q{Provide Enum functionality for Active Record}
|
12
|
+
s.description = %q{Enum is to choose a value from a preset list}
|
13
|
+
|
14
|
+
s.rubyforge_project = "acts_as_enumable"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
s.add_development_dependency "supermodel"
|
23
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module ActsAsEnumable
|
2
|
+
module ModelAdditions
|
3
|
+
def acts_as_enumable(attribute_name, enum_values, options={})
|
4
|
+
const_set(attribute_name.to_s.pluralize.upcase, enum_values)
|
5
|
+
|
6
|
+
class_eval <<-EOF
|
7
|
+
def self.#{attribute_name.to_s.pluralize}_for_select(i18n_namespace)
|
8
|
+
#{attribute_name.to_s.pluralize.upcase}.map do |value|
|
9
|
+
{ key: value, value: I18n.t("\#{i18n_namespace}.\#{value}") }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
EOF
|
13
|
+
|
14
|
+
class_eval <<-EOF
|
15
|
+
def self.default_#{attribute_name}
|
16
|
+
#{options[:default].nil? ? "nil" : "\"#{options[:default]}\""}
|
17
|
+
end
|
18
|
+
EOF
|
19
|
+
|
20
|
+
class_eval <<-EOF
|
21
|
+
def self.default_#{attribute_name}_enum
|
22
|
+
#{attribute_name.to_s.pluralize.upcase}.index(self.default_#{attribute_name})
|
23
|
+
end
|
24
|
+
EOF
|
25
|
+
|
26
|
+
define_method attribute_name do
|
27
|
+
index = send("#{attribute_name}_enum")
|
28
|
+
return nil if index.nil?
|
29
|
+
self.class.const_get(attribute_name.to_s.pluralize.upcase)[index]
|
30
|
+
end
|
31
|
+
define_method "#{attribute_name}=" do |value|
|
32
|
+
value_index = self.class.const_get(attribute_name.to_s.pluralize.upcase).index(value.to_s)
|
33
|
+
send("#{attribute_name}_enum=", value_index)
|
34
|
+
end
|
35
|
+
|
36
|
+
define_method "#{attribute_name}_enum" do
|
37
|
+
read_attribute(:"#{attribute_name}_enum") || self.class.send("default_#{attribute_name}_enum")
|
38
|
+
end
|
39
|
+
define_method "#{attribute_name}_enum=" do |value_index|
|
40
|
+
counts = self.class.const_get(attribute_name.to_s.pluralize.upcase).count
|
41
|
+
value_index = (0...counts).include?(value_index) ? value_index : self.class.send("default_#{attribute_name}_enum")
|
42
|
+
write_attribute(:"#{attribute_name}_enum", value_index)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
class User < SuperModel::Base
|
5
|
+
def role_enum
|
6
|
+
read_attribute(:role_enum)
|
7
|
+
end
|
8
|
+
def role_enum=(val)
|
9
|
+
write_attribute(:role_enum, val)
|
10
|
+
end
|
11
|
+
|
12
|
+
extend ActsAsEnumable::ModelAdditions
|
13
|
+
acts_as_enumable :role, %w(admin staff helper member)
|
14
|
+
acts_as_enumable :status, %w(active inactive), default: "inactive"
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ActsAsEnumable::ModelAdditions do
|
18
|
+
it "creates a constant given the attribute name and values" do
|
19
|
+
User::ROLES.should == %w(admin staff helper member)
|
20
|
+
User::STATUSES.should == %w(active inactive)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns an array to be used for select" do
|
24
|
+
User.roles_for_select("test.namespace").should == [{
|
25
|
+
key: "admin", value: I18n.t("test.namespace.admin")
|
26
|
+
}, {
|
27
|
+
key: "staff", value: I18n.t("test.namespace.staff")
|
28
|
+
}, {
|
29
|
+
key: "helper", value: I18n.t("test.namespace.helper")
|
30
|
+
}, {
|
31
|
+
key: "member", value: I18n.t("test.namespace.member")
|
32
|
+
}]
|
33
|
+
|
34
|
+
User.statuses_for_select("test.namespace").should == [{
|
35
|
+
key: "active", value: I18n.t("test.namespace.active")
|
36
|
+
}, {
|
37
|
+
key: "inactive", value: I18n.t("test.namespace.inactive")
|
38
|
+
}]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns the default value" do
|
42
|
+
User.default_role.should be_nil
|
43
|
+
User.default_status.should == "inactive"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns the default value index" do
|
47
|
+
User.default_role_enum.should be_nil
|
48
|
+
User.default_status_enum.should == 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it "handles value correctly" do
|
52
|
+
user = User.new
|
53
|
+
user.role_enum.should be_nil
|
54
|
+
user.role.should be_nil
|
55
|
+
user.status_enum.should == 1
|
56
|
+
user.status.should == "inactive"
|
57
|
+
|
58
|
+
user.role_enum = 1
|
59
|
+
user.role_enum.should == 1
|
60
|
+
user.role.should == "staff"
|
61
|
+
user.status_enum = 0
|
62
|
+
user.status_enum.should == 0
|
63
|
+
user.status.should == "active"
|
64
|
+
|
65
|
+
user.role = "admin"
|
66
|
+
user.role_enum.should == 0
|
67
|
+
user.role.should == "admin"
|
68
|
+
user.status = "inactive"
|
69
|
+
user.status_enum.should == 1
|
70
|
+
user.status.should == "inactive"
|
71
|
+
|
72
|
+
# error cases
|
73
|
+
|
74
|
+
user.role = "not existing role"
|
75
|
+
user.role_enum.should be_nil # as nil is the default value for role
|
76
|
+
user.role.should be_nil
|
77
|
+
user.status = "not existing status"
|
78
|
+
user.status_enum.should == 1 # as 1 (i.e. inactive) is the default value for status
|
79
|
+
user.status.should == "inactive"
|
80
|
+
|
81
|
+
user.role_enum = 1234
|
82
|
+
user.role_enum.should be_nil # as nil is the default value for role
|
83
|
+
user.role.should be_nil
|
84
|
+
user.status_enum = 1234
|
85
|
+
user.status_enum.should == 1
|
86
|
+
user.status.should == "inactive"
|
87
|
+
end
|
88
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acts_as_enumable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- PeterWong
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-26 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70133557158680 !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: *70133557158680
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: supermodel
|
27
|
+
requirement: &70133553186400 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70133553186400
|
36
|
+
description: Enum is to choose a value from a preset list
|
37
|
+
email:
|
38
|
+
- peter@primitus.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- .rspec
|
45
|
+
- .rvmrc
|
46
|
+
- CHANGELOG.md
|
47
|
+
- Gemfile
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- acts_as_enumable.gemspec
|
51
|
+
- lib/acts_as_enumable.rb
|
52
|
+
- lib/acts_as_enumable/model_additions.rb
|
53
|
+
- lib/acts_as_enumable/railtie.rb
|
54
|
+
- lib/acts_as_enumable/version.rb
|
55
|
+
- spec/acts_as_enumable/model_additions_spec.rb
|
56
|
+
- spec/acts_as_enumable_spec.rb
|
57
|
+
- spec/spec_helper.rb
|
58
|
+
homepage: https://github.com/peterwongpp/acts_as_enumable
|
59
|
+
licenses: []
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project: acts_as_enumable
|
78
|
+
rubygems_version: 1.8.6
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: Provide Enum functionality for Active Record
|
82
|
+
test_files:
|
83
|
+
- spec/acts_as_enumable/model_additions_spec.rb
|
84
|
+
- spec/acts_as_enumable_spec.rb
|
85
|
+
- spec/spec_helper.rb
|