acts_as_enumable 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
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
@@ -0,0 +1,3 @@
1
+ ## v0.0.1
2
+
3
+ * initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in acts_as_enumable.gemspec
4
+ gemspec
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,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -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,6 @@
1
+ require "acts_as_enumable/version"
2
+ require "acts_as_enumable/model_additions"
3
+ require "acts_as_enumable/railtie" if defined? Rails
4
+
5
+ module ActsAsEnumable
6
+ 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,9 @@
1
+ module ActsAsEnumable
2
+ class Railtie < Rails::Railtie
3
+ initializer 'acts_as_enumable.model_additions' do
4
+ ActiveSupport.on_load :active_record do
5
+ extend ModelAdditions
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ module ActsAsEnumable
2
+ VERSION = "0.0.1"
3
+ 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
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe ActsAsEnumable do
5
+ end
@@ -0,0 +1,2 @@
1
+ require 'acts_as_enumable'
2
+ require 'supermodel'
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