belongs_to_enum 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,8 +1,6 @@
1
1
  Adds support for transparent enums to ActiveRecord.
2
2
  Adds a belongs_to_enum to ActiveRecord that takes an array of possible values.
3
3
 
4
- Adds an add_extra_data method to ActiveRecord that invisibly includes an extra data table. Use with STI to keep your database clean. It removes the need to have lots of nullable columns.
5
-
6
4
  Usage
7
5
  ---------
8
6
  Use in Rails 3 app. Add to bundler:
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.email = ["jez.walker@gmail.com"]
11
11
  s.homepage = ""
12
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.}
13
+ s.description = %q{Adds belongs_to_enum method to ActiveRecord::Base, allowing enums to be created with associated scopes and more.}
14
14
 
15
15
  s.rubyforge_project = "belongs_to_enum"
16
16
 
@@ -31,7 +31,7 @@ module BelongsToEnum
31
31
  end
32
32
 
33
33
  def Enum.items
34
- warn "DEPRECIATED belongs_to_enum: Use pretty items instead"
34
+ warn "DEPRECIATED belongs_to_enum: Use items_for_select instead"
35
35
  items_for_select
36
36
  end
37
37
 
@@ -47,7 +47,15 @@ module BelongsToEnum
47
47
  @hash
48
48
  end
49
49
 
50
- def self.create(name, parent, keys)
50
+ def Enum.valid?(value)
51
+ @hash.has_value?(value.to_i)
52
+ end
53
+
54
+ def Enum.default
55
+ @hash.values.first
56
+ end
57
+
58
+ def self.create(name, parent, keys, options = {})
51
59
 
52
60
  # Check to see if this has already been defined...
53
61
  return if parent.const_defined?(name.to_s.camelize)
@@ -64,15 +72,20 @@ module BelongsToEnum
64
72
  keys.each do |k,v|
65
73
  klass.add_item(k,v)
66
74
  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
75
  else
72
76
  keys.each_with_index do |key, index|
73
77
  klass.add_item(key, index + 1)
74
78
  end
75
79
  end
80
+
81
+ # Create scopes if required
82
+ if options[:create_scopes]
83
+ klass.raw_hash.each do |key, value|
84
+ parent.instance_exec do
85
+ scope key.to_s.pluralize, where("#{name.to_s.underscore}_id" == value)
86
+ end
87
+ end
88
+ end
76
89
  end
77
90
  end
78
91
  end
@@ -2,8 +2,8 @@ require File.join(File.dirname(__FILE__), "enum")
2
2
 
3
3
  module BelongsToEnum
4
4
  module Hook
5
- def belongs_to_enum(name, keys)
6
- BelongsToEnum::Enum.create(name, self, keys)
5
+ def belongs_to_enum(name, keys, options = {})
6
+ BelongsToEnum::Enum.create(name, self, keys, options)
7
7
  name = name.to_s
8
8
  class_eval <<-EOS
9
9
  def #{name}?
@@ -1,3 +1,3 @@
1
1
  module BelongsToEnum
2
- VERSION = "0.2"
2
+ VERSION = "0.3"
3
3
  end
@@ -3,51 +3,135 @@ require 'spec_helper'
3
3
  describe "Belongs To Enum models" do
4
4
 
5
5
  it "constants should be set" do
6
- User.const_defined?("Role").should be_true
6
+ klass = Class.new(ActiveRecord::Base)
7
+ klass.class_exec do
8
+ belongs_to_enum :role, [:normal]
9
+ end
10
+
11
+ klass.const_defined?("Role").should be_true
7
12
  end
8
13
 
9
14
  it "constant has keys" do
10
- User::Role.should respond_to(:admin)
15
+ klass = Class.new(ActiveRecord::Base)
16
+ klass.class_exec do
17
+ belongs_to_enum :role, [:normal]
18
+ end
19
+ klass::Role.should respond_to(:normal)
11
20
  end
12
21
 
13
22
  it "keys should start at 1" do
14
- User::Role.normal.should == 1
23
+ klass = Class.new(ActiveRecord::Base)
24
+ klass.class_exec do
25
+ belongs_to_enum :role, [:normal]
26
+ end
27
+ klass::Role.normal.should == 1
28
+ end
29
+
30
+ it "can check to see if a key is valid" do
31
+ klass = Class.new(ActiveRecord::Base)
32
+ klass.class_exec do
33
+ belongs_to_enum :role, [:normal]
34
+ end
35
+ klass::Role.valid?(1).should be_true
36
+ klass::Role.valid?(2).should be_false
37
+ end
38
+
39
+ it "has a default value" do
40
+ klass = Class.new(ActiveRecord::Base)
41
+ klass.class_exec do
42
+ belongs_to_enum :role1, [:normal]
43
+ belongs_to_enum :role2, {:normal => 10}
44
+ end
45
+ klass::Role1.default.should == 1
46
+ klass::Role2.default.should == 10
15
47
  end
16
48
 
17
49
  it "keys should respect hash values" do
18
- Vehicle::Make.honda.should == 10
50
+ klass = Class.new(ActiveRecord::Base)
51
+ klass.class_exec do
52
+ belongs_to_enum :role, {:normal => 10, :admin => 20}
53
+ end
54
+ klass::Role.normal.should == 10
55
+ klass::Role.admin.should == 20
19
56
  end
20
57
 
21
58
  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
59
+ klass = Class.new(ActiveRecord::Base)
60
+ klass.class_exec do
61
+ belongs_to_enum :role, [:normal, :admin]
62
+ end
63
+ i = 1
64
+ klass::Role.each do |role, role_id|
65
+ role.should == (i == 1 ? :normal : :admin)
66
+ role_id.should == i
67
+ i += 1
26
68
  end
27
69
  end
28
70
 
29
71
  it "has items_for_select" do
30
- User::Role.items_for_select.first[0].should == "Normal"
31
- User::Role.items_for_select.first[1].should == 1
72
+ klass = Class.new(ActiveRecord::Base)
73
+ klass.class_exec do
74
+ belongs_to_enum :role, [:normal]
75
+ end
76
+ klass::Role.items_for_select.first[0].should == "Normal"
77
+ klass::Role.items_for_select.first[1].should == 1
32
78
  end
33
79
 
34
80
  it "has depreciated items method that maps to items_for_select" do
35
- User::Role.items.first[0].should == "Normal"
36
- User::Role.items.first[1].should == 1
81
+ klass = Class.new(ActiveRecord::Base)
82
+ klass.class_exec do
83
+ belongs_to_enum :role, [:normal]
84
+ end
85
+ klass::Role.items.first[0].should == "Normal"
86
+ klass::Role.items.first[1].should == 1
37
87
  end
38
88
 
39
89
  it "can get item from id" do
40
- User::Role.get(1).should == :normal
90
+ klass = Class.new(ActiveRecord::Base)
91
+ klass.class_exec do
92
+ belongs_to_enum :role, [:normal]
93
+ end
94
+ klass::Role.get(1).should == :normal
41
95
  end
42
96
 
43
97
  it "pretty displays item" do
44
- User::Role.display(1).should == "Normal"
98
+ klass = Class.new(ActiveRecord::Base)
99
+ klass.class_exec do
100
+ belongs_to_enum :role, [:normal]
101
+ end
102
+ klass::Role.display(1).should == "Normal"
45
103
  end
46
104
 
47
105
  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
106
+ klass = Class.new(ActiveRecord::Base)
107
+ klass.class_exec do
108
+ belongs_to_enum :role, [:normal]
109
+ end
110
+ klass::Role.raw_hash.is_a?(Hash)
111
+ klass::Role.raw_hash.keys[0].should == :normal
112
+ klass::Role.raw_hash.values[0].should == 1
113
+ end
114
+
115
+ it "can create scopes when requested" do
116
+ ActiveRecord::Schema.define(:version => 1) do
117
+ create_table :scope_checkers do |t|
118
+ t.integer :role_id, :null => false
119
+ end
120
+ end
121
+
122
+ klass = Class.new(ActiveRecord::Base)
123
+ klass.class_exec do
124
+ set_table_name "scope_checkers"
125
+ scope :sanity_scope, where(:sanity_scope_id => 1)
126
+ belongs_to_enum :role1, [:normal], :create_scopes => true
127
+ belongs_to_enum :role2, [:admin]
128
+ end
129
+ klass.should respond_to("sanity_scope")
130
+ klass.should respond_to("normals")
131
+ klass.should_not respond_to("admins")
132
+
133
+ klass.method("normals").source_location.should == klass.method("sanity_scope").source_location
134
+ klass.send("normals").to_sql.strip.should == 'SELECT "scope_checkers".* FROM "scope_checkers"'
51
135
  end
52
136
 
53
137
 
data/spec/spec_helper.rb CHANGED
@@ -13,13 +13,4 @@ ActiveRecord::Base.send(:extend, BelongsToEnum::Hook)
13
13
  ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
14
14
 
15
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'
16
+ $stdout = StringIO.new
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: belongs_to_enum
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: "0.2"
5
+ version: "0.3"
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeremy walker
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-18 00:00:00 +01:00
14
- default_executable:
13
+ date: 2011-06-17 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rails
@@ -35,7 +34,7 @@ dependencies:
35
34
  version: "0"
36
35
  type: :development
37
36
  version_requirements: *id002
38
- description: Adds a belongs_to_enum to ActiveRecord that takes an array of possible values.
37
+ description: Adds belongs_to_enum method to ActiveRecord::Base, allowing enums to be created with associated scopes and more.
39
38
  email:
40
39
  - jez.walker@gmail.com
41
40
  executables: []
@@ -58,8 +57,6 @@ files:
58
57
  - lib/belongs_to_enum/version.rb
59
58
  - spec/belongs_to_enum.rb
60
59
  - spec/spec_helper.rb
61
- - spec/test_classes.rb
62
- has_rdoc: true
63
60
  homepage: ""
64
61
  licenses: []
65
62
 
@@ -83,11 +80,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
80
  requirements: []
84
81
 
85
82
  rubyforge_project: belongs_to_enum
86
- rubygems_version: 1.6.2
83
+ rubygems_version: 1.7.2
87
84
  signing_key:
88
85
  specification_version: 3
89
86
  summary: Adds support for transparent enums to ActiveRecord
90
87
  test_files:
91
88
  - spec/belongs_to_enum.rb
92
89
  - spec/spec_helper.rb
93
- - spec/test_classes.rb
data/spec/test_classes.rb DELETED
@@ -1,7 +0,0 @@
1
- class User < ActiveRecord::Base
2
- belongs_to_enum :role, [:normal, :admin, :superadmin, :suspended]
3
- end
4
-
5
- class Vehicle < ActiveRecord::Base
6
- belongs_to_enum :make, {:honda => 10, :toyota => 20, :ford => 30}
7
- end