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 ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
4
+ - rbx-19mode
5
+ - ruby-head
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::ROLES
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).
@@ -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
- const_set(attribute_name.to_s.pluralize.upcase, enum_values)
52
+ attribute = attribute_name.to_s
53
+ options[:default] ||= nil
5
54
 
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
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 <<-EOF
15
- def self.default_#{attribute_name}
16
- #{options[:default].nil? ? "nil" : "\"#{options[:default]}\""}
17
- end
18
- EOF
69
+ class_eval %Q{
70
+ def self.default_#{attribute}
71
+ #{options[:default].nil? ? "nil" : "\"#{options[:default]}\""}
72
+ end
73
+ }
19
74
 
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
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.const_get(attribute_name.to_s.pluralize.upcase)[index]
84
+ self.class.send(attribute.pluralize)[index]
30
85
  end
31
86
  define_method "#{attribute_name}=" do |value|
32
- value_index = self.class.const_get(attribute_name.to_s.pluralize.upcase).index(value.to_s)
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.const_get(attribute_name.to_s.pluralize.upcase).count
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
@@ -1,3 +1,3 @@
1
1
  module ActsAsEnumable
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2.alpha"
3
3
  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::ROLES.should == %w(admin staff helper member)
20
- User::STATUSES.should == %w(active inactive)
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.1
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-26 00:00:00.000000000Z
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: &70133557158680 !ruby/object:Gem::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: *70133557158680
35
+ version_requirements: *70184002699020
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: supermodel
27
- requirement: &70133553186400 !ruby/object:Gem::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: *70133553186400
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: '0'
87
+ version: 1.3.1
76
88
  requirements: []
77
89
  rubyforge_project: acts_as_enumable
78
90
  rubygems_version: 1.8.6