acts_as_enumable 0.0.1 → 0.0.2.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/README.md +15 -2
- data/acts_as_enumable.gemspec +1 -0
- data/lib/acts_as_enumable/model_additions.rb +76 -21
- data/lib/acts_as_enumable/version.rb +1 -1
- data/spec/acts_as_enumable/model_additions_spec.rb +6 -2
- metadata +21 -9
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# ActsAsEnumable
|
1
|
+
# ActsAsEnumable [![Build Status](https://secure.travis-ci.org/peterwongpp/acts_as_enumable.png)](http://travis-ci.org/peterwongpp/acts_as_enumable)
|
2
2
|
|
3
3
|
Provide Enum functionality for Active Record.
|
4
4
|
|
@@ -40,7 +40,7 @@ This enables the following methods:
|
|
40
40
|
``` ruby
|
41
41
|
user = User.first
|
42
42
|
|
43
|
-
User
|
43
|
+
User.roles
|
44
44
|
# ["admin", "staff", "helper", "member"]
|
45
45
|
|
46
46
|
User.roles_for_select("users.roles")
|
@@ -69,6 +69,19 @@ user.role_enum = 0
|
|
69
69
|
user.role
|
70
70
|
# "admin"
|
71
71
|
```
|
72
|
+
|
73
|
+
## Todo
|
74
|
+
|
75
|
+
* ActiveRecord scope support
|
76
|
+
* `User.having_roles_of(["admin", "staff"])`
|
77
|
+
* `User.having_status_of("active")`
|
78
|
+
* ...
|
79
|
+
* Shorthand checking
|
80
|
+
* `user.admin?`
|
81
|
+
* `user.has_status?("active")`
|
82
|
+
* `user.in_roles?(["admin", "staff"])`
|
83
|
+
* Code refactoring
|
84
|
+
|
72
85
|
## Development
|
73
86
|
|
74
87
|
If you have any problems, please post them on the [issue tracker](https://github.com/peterwongpp/acts_as_enumable/issues).
|
data/acts_as_enumable.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
+
s.add_development_dependency "rake"
|
21
22
|
s.add_development_dependency "rspec"
|
22
23
|
s.add_development_dependency "supermodel"
|
23
24
|
end
|
@@ -1,35 +1,90 @@
|
|
1
1
|
module ActsAsEnumable
|
2
2
|
module ModelAdditions
|
3
|
+
# To make the attribute an enum.
|
4
|
+
#
|
5
|
+
# class User < ActiveRecord::Base
|
6
|
+
# # assumes the column exists:
|
7
|
+
# # integer :role_enum
|
8
|
+
#
|
9
|
+
# acts_as_enumable(:role, %w(admin staff helper member), defaul: "member")
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# Available options are:
|
13
|
+
#
|
14
|
+
# (optional) default: String / Symbol
|
15
|
+
# default value, will be set to nil if it is not provided or it does not match the preset list
|
16
|
+
# eg.
|
17
|
+
# acts_as_enumable :role, %w(admin staff), default: :something_not_exist # set the default value to nil
|
18
|
+
# acts_as_enumable :role, %w(admin staff), default: "staff" # set the defaut value to "staff"
|
19
|
+
#
|
20
|
+
# This enables the following methods:
|
21
|
+
#
|
22
|
+
# user = User.first
|
23
|
+
# User.roles
|
24
|
+
# # ["admin", "staff", "helper", "member"]
|
25
|
+
#
|
26
|
+
# User.roles_for_select("users.roles")
|
27
|
+
# # [
|
28
|
+
# # { key: "admin", value: I18n.t("users.roles.admin") },
|
29
|
+
# # { key: "staff", value: I18n.t("users.roles.staff") }, ...
|
30
|
+
# # ]
|
31
|
+
#
|
32
|
+
# User.default_role
|
33
|
+
# # "member"
|
34
|
+
#
|
35
|
+
# User.default_role_enum
|
36
|
+
# # 3
|
37
|
+
#
|
38
|
+
# user.role
|
39
|
+
# # "member"
|
40
|
+
#
|
41
|
+
# user.role = "staff" # or user.role = :staff
|
42
|
+
# user.role
|
43
|
+
# # "staff"
|
44
|
+
#
|
45
|
+
# user.role_enum # if user.role == "staff"
|
46
|
+
# # 1
|
47
|
+
#
|
48
|
+
# user.role_enum = 0
|
49
|
+
# user.role
|
50
|
+
# # "admin"
|
3
51
|
def acts_as_enumable(attribute_name, enum_values, options={})
|
4
|
-
|
52
|
+
attribute = attribute_name.to_s
|
53
|
+
options[:default] ||= nil
|
5
54
|
|
6
|
-
class_eval
|
7
|
-
def self.#{
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
55
|
+
class_eval %Q{
|
56
|
+
def self.#{attribute.pluralize}
|
57
|
+
#{enum_values}
|
58
|
+
end
|
59
|
+
}
|
60
|
+
|
61
|
+
class_eval %Q{
|
62
|
+
def self.#{attribute.pluralize}_for_select(i18n_namespace)
|
63
|
+
#{attribute.pluralize}.map do |value|
|
64
|
+
{ key: value, value: I18n.t("\#{i18n_namespace}.\#{value}") }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
}
|
13
68
|
|
14
|
-
class_eval
|
15
|
-
def self.default_#{
|
16
|
-
|
17
|
-
end
|
18
|
-
|
69
|
+
class_eval %Q{
|
70
|
+
def self.default_#{attribute}
|
71
|
+
#{options[:default].nil? ? "nil" : "\"#{options[:default]}\""}
|
72
|
+
end
|
73
|
+
}
|
19
74
|
|
20
|
-
class_eval
|
21
|
-
def self.default_#{
|
22
|
-
|
23
|
-
end
|
24
|
-
|
75
|
+
class_eval %Q{
|
76
|
+
def self.default_#{attribute}_enum
|
77
|
+
#{attribute.pluralize}.index(default_#{attribute})
|
78
|
+
end
|
79
|
+
}
|
25
80
|
|
26
81
|
define_method attribute_name do
|
27
82
|
index = send("#{attribute_name}_enum")
|
28
83
|
return nil if index.nil?
|
29
|
-
self.class.
|
84
|
+
self.class.send(attribute.pluralize)[index]
|
30
85
|
end
|
31
86
|
define_method "#{attribute_name}=" do |value|
|
32
|
-
value_index = self.class.
|
87
|
+
value_index = self.class.send(attribute.pluralize).index(value.to_s)
|
33
88
|
send("#{attribute_name}_enum=", value_index)
|
34
89
|
end
|
35
90
|
|
@@ -37,7 +92,7 @@ EOF
|
|
37
92
|
read_attribute(:"#{attribute_name}_enum") || self.class.send("default_#{attribute_name}_enum")
|
38
93
|
end
|
39
94
|
define_method "#{attribute_name}_enum=" do |value_index|
|
40
|
-
counts = self.class.
|
95
|
+
counts = self.class.send(attribute.pluralize).count
|
41
96
|
value_index = (0...counts).include?(value_index) ? value_index : self.class.send("default_#{attribute_name}_enum")
|
42
97
|
write_attribute(:"#{attribute_name}_enum", value_index)
|
43
98
|
end
|
@@ -16,8 +16,12 @@ end
|
|
16
16
|
|
17
17
|
describe ActsAsEnumable::ModelAdditions do
|
18
18
|
it "creates a constant given the attribute name and values" do
|
19
|
-
User
|
20
|
-
User
|
19
|
+
User.roles.should == %w(admin staff helper member)
|
20
|
+
User.statuses.should == %w(active inactive)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "is a testing function..." do
|
24
|
+
User.roles.should == %w(admin staff helper member)
|
21
25
|
end
|
22
26
|
|
23
27
|
it "returns an array to be used for select" do
|
metadata
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts_as_enumable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2.alpha
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- PeterWong
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-31 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70184002699440 !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: *70184002699440
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: rspec
|
16
|
-
requirement: &
|
27
|
+
requirement: &70184002699020 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ! '>='
|
@@ -21,10 +32,10 @@ dependencies:
|
|
21
32
|
version: '0'
|
22
33
|
type: :development
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70184002699020
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: supermodel
|
27
|
-
requirement: &
|
38
|
+
requirement: &70184002698600 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,7 +43,7 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :development
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70184002698600
|
36
47
|
description: Enum is to choose a value from a preset list
|
37
48
|
email:
|
38
49
|
- peter@primitus.com
|
@@ -43,6 +54,7 @@ files:
|
|
43
54
|
- .gitignore
|
44
55
|
- .rspec
|
45
56
|
- .rvmrc
|
57
|
+
- .travis.yml
|
46
58
|
- CHANGELOG.md
|
47
59
|
- Gemfile
|
48
60
|
- README.md
|
@@ -70,9 +82,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
83
|
none: false
|
72
84
|
requirements:
|
73
|
-
- - ! '
|
85
|
+
- - ! '>'
|
74
86
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
87
|
+
version: 1.3.1
|
76
88
|
requirements: []
|
77
89
|
rubyforge_project: acts_as_enumable
|
78
90
|
rubygems_version: 1.8.6
|