acts_as_enumable 0.0.1 → 0.0.2.alpha
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/.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 [](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
|