belongs_to_enum 0.2 → 0.3

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