belongs_to_enum 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 +5 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README +2 -0
- data/Rakefile +2 -0
- data/belongs_to_enum.gemspec +24 -0
- data/lib/belongs_to_enum/enum.rb +78 -0
- data/lib/belongs_to_enum/hook.rb +19 -0
- data/lib/belongs_to_enum/railtie.rb +12 -0
- data/lib/belongs_to_enum/version.rb +3 -0
- data/lib/belongs_to_enum.rb +3 -0
- data/spec/belongs_to_enum.rb +54 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/test_classes.rb +7 -0
- metadata +93 -0
data/.rspec
ADDED
data/Gemfile
ADDED
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "belongs_to_enum/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "belongs_to_enum"
|
7
|
+
s.version = BelongsToEnum::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jeremy walker"]
|
10
|
+
s.email = ["jez.walker@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Adds support for transparent enums to ActiveRecord}
|
13
|
+
s.description = %q{Adds a belongs_to_enum to ActiveRecord that takes an array of possible values.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "belongs_to_enum"
|
16
|
+
|
17
|
+
s.add_dependency "rails"
|
18
|
+
s.add_development_dependency "rspec-rails"
|
19
|
+
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module BelongsToEnum
|
2
|
+
class Enum
|
3
|
+
def Enum.add_item(key,value)
|
4
|
+
@hash ||= {}
|
5
|
+
@hash[key]=value
|
6
|
+
end
|
7
|
+
|
8
|
+
def Enum.method_missing(key, *args)
|
9
|
+
@hash[key] || super
|
10
|
+
end
|
11
|
+
|
12
|
+
def Enum.respond_to?(key)
|
13
|
+
return true if super(key)
|
14
|
+
return @hash && @hash[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def Enum.each
|
18
|
+
@hash.each {|key,value| yield(key,value)}
|
19
|
+
end
|
20
|
+
|
21
|
+
def Enum.map
|
22
|
+
@hash.map {|key,value| yield(key,value)}
|
23
|
+
end
|
24
|
+
|
25
|
+
def Enum.keys
|
26
|
+
@hash.values
|
27
|
+
end
|
28
|
+
|
29
|
+
def Enum.pretty_items
|
30
|
+
@hash.sort{|a,b| a[1]<=>b[1]}.map{|i|[i[0].to_s.gsub("_", " ").capitalize,i[1]]}
|
31
|
+
end
|
32
|
+
|
33
|
+
def Enum.items
|
34
|
+
warn "DEPRECIATED belongs_to_enum: Use pretty items instead"
|
35
|
+
pretty_items
|
36
|
+
end
|
37
|
+
|
38
|
+
def Enum.get(value)
|
39
|
+
@hash.key(value)
|
40
|
+
end
|
41
|
+
|
42
|
+
def Enum.display(value)
|
43
|
+
get(value).to_s.gsub("_", " ").titleize
|
44
|
+
end
|
45
|
+
|
46
|
+
def Enum.raw_hash
|
47
|
+
@hash
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.create(name, parent, keys)
|
51
|
+
|
52
|
+
# Check to see if this has already been defined...
|
53
|
+
return if parent.const_defined?(name.to_s.camelize)
|
54
|
+
|
55
|
+
klass = Class.new(Enum)
|
56
|
+
parent.const_set(name.to_s.camelize, klass)
|
57
|
+
|
58
|
+
if keys.respond_to? :raw_hash
|
59
|
+
keys.raw_hash.each do |k,v|
|
60
|
+
klass.add_item(k,v)
|
61
|
+
end
|
62
|
+
|
63
|
+
elsif(keys.is_a? Hash)
|
64
|
+
keys.each do |k,v|
|
65
|
+
klass.add_item(k,v)
|
66
|
+
end
|
67
|
+
#elsif(keys.respond_to? :raw_hash)
|
68
|
+
# keys.send(:raw_hash).each do |k,v|
|
69
|
+
# klass.add_item(k,v)
|
70
|
+
# end
|
71
|
+
else
|
72
|
+
keys.each_with_index do |key, index|
|
73
|
+
klass.add_item(key, index + 1)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "enum")
|
2
|
+
|
3
|
+
module BelongsToEnum
|
4
|
+
module Hook
|
5
|
+
def belongs_to_enum(name, keys)
|
6
|
+
BelongsToEnum::Enum.create(name, self, keys)
|
7
|
+
name = name.to_s
|
8
|
+
class_eval <<-EOS
|
9
|
+
def #{name}?
|
10
|
+
#{name}_id.to_i > 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def #{name}
|
14
|
+
#{name.camelize}.display(#{name}_id)
|
15
|
+
end
|
16
|
+
EOS
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Belongs To Enum models" do
|
4
|
+
|
5
|
+
it "constants should be set" do
|
6
|
+
User.const_defined?("Role").should be_true
|
7
|
+
end
|
8
|
+
|
9
|
+
it "constant has keys" do
|
10
|
+
User::Role.should respond_to(:admin)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "keys should start at 1" do
|
14
|
+
User::Role.normal.should == 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "keys should respect hash values" do
|
18
|
+
Vehicle::Make.honda.should == 10
|
19
|
+
end
|
20
|
+
|
21
|
+
it "keys can be iterated through" do
|
22
|
+
User::Role.each do |role, role_id|
|
23
|
+
role.should == :normal
|
24
|
+
role_id.should == 1
|
25
|
+
break
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has pretty items" do
|
30
|
+
User::Role.pretty_items.first[0].should == "Normal"
|
31
|
+
User::Role.pretty_items.first[1].should == 1
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has depreciated items method that maps to pretty_items" do
|
35
|
+
User::Role.items.first[0].should == "Normal"
|
36
|
+
User::Role.items.first[1].should == 1
|
37
|
+
end
|
38
|
+
|
39
|
+
it "can get item from id" do
|
40
|
+
User::Role.get(1).should == :normal
|
41
|
+
end
|
42
|
+
|
43
|
+
it "pretty displays item" do
|
44
|
+
User::Role.display(1).should == "Normal"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can access raw hash" do
|
48
|
+
User::Role.raw_hash.is_a?(Hash)
|
49
|
+
User::Role.raw_hash.keys[0].should == :normal
|
50
|
+
User::Role.raw_hash.values[0].should == 1
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= 'test'
|
2
|
+
|
3
|
+
require 'rails'
|
4
|
+
require 'rspec-rails'
|
5
|
+
require 'active_record'
|
6
|
+
|
7
|
+
$:.unshift File.dirname(__FILE__) + '/../lib'
|
8
|
+
|
9
|
+
# Thie first line isn't working so I have added the second...
|
10
|
+
require File.dirname(__FILE__) + '/../lib/belongs_to_enum'
|
11
|
+
ActiveRecord::Base.send(:extend, BelongsToEnum::Hook)
|
12
|
+
|
13
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
14
|
+
|
15
|
+
# AR keeps printing annoying schema statements
|
16
|
+
$stdout = StringIO.new
|
17
|
+
|
18
|
+
ActiveRecord::Base.logger
|
19
|
+
ActiveRecord::Schema.define(:version => 1) do
|
20
|
+
create_table :users do |t|
|
21
|
+
t.integer :role_id, :null => false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'test_classes'
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: belongs_to_enum
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: "0.1"
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jeremy walker
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-17 00:00:00 +01:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rails
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-rails
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Adds a belongs_to_enum to ActiveRecord that takes an array of possible values.
|
39
|
+
email:
|
40
|
+
- jez.walker@gmail.com
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files: []
|
46
|
+
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- .rspec
|
50
|
+
- Gemfile
|
51
|
+
- README
|
52
|
+
- Rakefile
|
53
|
+
- belongs_to_enum.gemspec
|
54
|
+
- lib/belongs_to_enum.rb
|
55
|
+
- lib/belongs_to_enum/enum.rb
|
56
|
+
- lib/belongs_to_enum/hook.rb
|
57
|
+
- lib/belongs_to_enum/railtie.rb
|
58
|
+
- lib/belongs_to_enum/version.rb
|
59
|
+
- spec/belongs_to_enum.rb
|
60
|
+
- spec/spec_helper.rb
|
61
|
+
- spec/test_classes.rb
|
62
|
+
has_rdoc: true
|
63
|
+
homepage: ""
|
64
|
+
licenses: []
|
65
|
+
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: "0"
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project: belongs_to_enum
|
86
|
+
rubygems_version: 1.6.2
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Adds support for transparent enums to ActiveRecord
|
90
|
+
test_files:
|
91
|
+
- spec/belongs_to_enum.rb
|
92
|
+
- spec/spec_helper.rb
|
93
|
+
- spec/test_classes.rb
|