acts_as_enumable 0.0.1

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