uniqueable 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,11 +11,16 @@ module Uniqueable
11
11
  checks.each do |klass, keys|
12
12
  keys.each do |key|
13
13
  #Check nothing exists with this pair
14
+ conditions = []
15
+ if key.kind_of?(Hash)
16
+ conditions = key[key.keys.first][:conditions]
17
+ key = key.keys.first
18
+ end
14
19
  if options[:case_sensitive]
15
- result = klass.where(key => value)
20
+ result = klass.where(["#{key} = ?", value]).where(conditions).all
16
21
  else
17
22
  value = value.downcase if value.kind_of?(String)
18
- result = klass.find(:all, :conditions => ["lower(#{key}) = ?", value])
23
+ result = klass.where(["lower(#{key}) = ?", value]).where(conditions).all
19
24
  end
20
25
 
21
26
  unless result.empty?
@@ -1,3 +1,3 @@
1
1
  module Uniqueable
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/uniqueable.rb CHANGED
@@ -17,11 +17,14 @@ module Uniqueable
17
17
  attr_accessor :uniqueable_checks
18
18
  def uniqueable(*values)
19
19
  options = values.last.kind_of?(Hash) ? values.pop : {}
20
- group = options[:group]
20
+ group = options.delete(:group)
21
21
  klass = self
22
22
  uniqueable_checks[group] ||= {}
23
23
  uniqueable_checks[group][klass] ||= []
24
24
  values.each do |value|
25
+ unless options.empty?
26
+ value = {value => options}
27
+ end
25
28
  uniqueable_checks[group][klass] << value
26
29
  end
27
30
  uniqueable_checks[group][klass].uniq!
data/spec/schema.rb CHANGED
@@ -7,6 +7,7 @@ ActiveRecord::Schema.define(:version => 0) do
7
7
  create_table :organisations do |t|
8
8
  t.string :alias
9
9
  t.string :name
10
+ t.boolean :public
10
11
  end
11
12
 
12
13
  create_table :admin_users do |t|
@@ -60,4 +60,17 @@ describe Uniqueable do
60
60
  Tester.uniqueable_checks.should eql({:aliases => {Tester => [:name], AnotherTester=> [:name]}})
61
61
  end
62
62
  end
63
+
64
+ context "coniditionals" do
65
+ it "should store the conditions if applicable" do
66
+ Tester.uniqueable(:name, :group => :aliases, :conditions => ["admin = ?", true])
67
+ AnotherTester.uniqueable(:name, :group => :aliases)
68
+ Tester.uniqueable_checks.should eql({
69
+ :aliases => {
70
+ Tester => [{:name => {:conditions => ["admin = ?", true]}}],
71
+ AnotherTester=> [:name]
72
+ }
73
+ })
74
+ end
75
+ end
63
76
  end
@@ -128,5 +128,71 @@ describe Uniqueable::UniqueableValidator do
128
128
  user.should_not be_valid
129
129
  end
130
130
  end
131
+
132
+ context "Conditionals" do
133
+ before(:each) do
134
+ Uniqueable.instance_variable_set(:@uniqueable_checks, nil)
135
+ class User < ActiveRecord::Base
136
+ include Uniqueable
137
+ uniqueable :username
138
+ validates :username, :uniqueable => true
139
+ end
140
+
141
+ class Organisation < ActiveRecord::Base
142
+ include Uniqueable
143
+ uniqueable :alias, :conditions => ["public = ?", true]
144
+ validates :alias, :uniqueable => true
145
+ end
146
+ User.delete_all
147
+ Organisation.delete_all
148
+ end
149
+
150
+ it "should ignore non-public organisations" do
151
+ organisation = Organisation.create(:name => "Gazler", :alias => "gazler", :public => false)
152
+ organisation.should be_valid
153
+ user = User.create(:name => "Gazler", :username => "gazler")
154
+ user.should be_valid
155
+ end
156
+
157
+ it "should validate when public is true" do
158
+ organisation = Organisation.create(:name => "Gazler", :alias => "gazler", :public => true)
159
+ organisation.should be_valid
160
+ user = User.create(:name => "Gazler", :username => "gazler")
161
+ user.should_not be_valid
162
+ end
163
+ end
164
+
165
+ context "Case Sensitive with Conditionals" do
166
+ before(:each) do
167
+ Uniqueable.instance_variable_set(:@uniqueable_checks, nil)
168
+ class User < ActiveRecord::Base
169
+ include Uniqueable
170
+ uniqueable :username
171
+ validates :username, :uniqueable => {:case_sensitive => false}
172
+ end
173
+
174
+ class Organisation < ActiveRecord::Base
175
+ include Uniqueable
176
+ uniqueable :alias, :conditions => ["public = ?", true]
177
+ validates :alias, :uniqueable => {:case_sensitive => false}
178
+ end
179
+ User.delete_all
180
+ Organisation.delete_all
181
+ end
182
+
183
+ it "should ignore non-public organisations" do
184
+ organisation = Organisation.create(:name => "Gazler", :alias => "Gazler", :public => false)
185
+ organisation.should be_valid
186
+ user = User.create(:name => "Gazler", :username => "gazler")
187
+ user.should be_valid
188
+ end
189
+
190
+ it "should validate when public is true" do
191
+ organisation = Organisation.create(:name => "Gazler", :alias => "Gazler", :public => true)
192
+ organisation.should be_valid
193
+ user = User.create(:name => "Gazler", :username => "gazler")
194
+ user.should_not be_valid
195
+ end
196
+ end
131
197
 
132
198
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uniqueable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-02 00:00:00.000000000 Z
12
+ date: 2012-10-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -127,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
127
  version: '0'
128
128
  segments:
129
129
  - 0
130
- hash: -753480171143598750
130
+ hash: -2039842943075345764
131
131
  required_rubygems_version: !ruby/object:Gem::Requirement
132
132
  none: false
133
133
  requirements:
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  segments:
138
138
  - 0
139
- hash: -753480171143598750
139
+ hash: -2039842943075345764
140
140
  requirements: []
141
141
  rubyforge_project:
142
142
  rubygems_version: 1.8.24