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 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