format_validators 0.0.5 → 0.0.6

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/CHANGELOG CHANGED
@@ -1,5 +1,10 @@
1
1
  == unreleased changes
2
2
 
3
+ == 0.0.6
4
+
5
+ * Added devise password validator
6
+ * Updated the currency validator with strict option
7
+
3
8
  == 0.0.5
4
9
 
5
10
  * Added a zip code format validator and tests
data/README.rdoc CHANGED
@@ -10,9 +10,13 @@ A consolidation of a few of the most common validations.
10
10
  * Social Security Number
11
11
  * ZIP code
12
12
 
13
+ == Bundler
14
+
15
+ gem "format_validators"
16
+
13
17
  == Install
14
18
 
15
- gem install format_validators
19
+ gem install format_validators
16
20
 
17
21
  == Examples:
18
22
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -1,7 +1,12 @@
1
1
  class CurrencyFormatValidator < ActiveModel::EachValidator
2
2
  def validate_each record, attribute, value
3
- format = /^\d+(\.\d{2})?$/
3
+ strict_mode = options[:strict] || false
4
+
5
+ format = /^\d*+(\.\d{1,2})?$/
6
+ # Strict: requires leading number and exactly two decimals, 1.45
7
+ format = /^\d+(\.\d{2})?$/ if strict_mode
8
+
4
9
  message = attribute.to_s.humanize + " must contain dollars and cents, seperated by a period"
5
- record.errors[attribute] << (options[:message] || message) unless value =~ format
10
+ record.errors[attribute] << (options[:message] || message) unless value.to_s =~ format
6
11
  end
7
12
  end
@@ -0,0 +1,21 @@
1
+ # Used on a device user model to remove password checks when updating the user model.
2
+ # Passwords are not needed unless the user is a new record or the reset password token is present
3
+ #
4
+ # A model using this validation must include a password, password_confirmation, and rest_password_token fields.
5
+ class DevisePasswordValidator < ActiveModel::EachValidator
6
+
7
+ def validate_each record, attribute, value
8
+ if (record.password.blank? || record.password_confirmation.blank?) && (record.id.blank? || (!record.id.blank? && !record.reset_password_token.blank?))
9
+ record.errors[:password] << "is required"
10
+ elsif (!record.password.blank? || !record.password_confirmation.blank?) && record.password_confirmation != record.password
11
+ record.errors[:password] << "does not match Password Confirmation"
12
+ record.errors[:password_confirmation] = nil
13
+ elsif (!record.password.blank? || !record.password_confirmation.blank?) && record.password.length < 6
14
+ record.errors[:password] << "must be longer than 6 characters"
15
+ elsif record.password
16
+ if (record.password.include?(' ') || record.password_confirmation.include?(' '))
17
+ record.errors[:password] << 'cannot include spaces'
18
+ end
19
+ end
20
+ end
21
+ end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "format_validators"
8
- s.version = "0.0.5"
8
+ s.version = "0.0.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeremiah Hemphill"]
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
28
28
  "VERSION",
29
29
  "app/validators/currency_format_validator.rb",
30
30
  "app/validators/days_of_week_validator.rb",
31
+ "app/validators/devise_password_validator.rb",
31
32
  "app/validators/florida_counties_validator.rb",
32
33
  "app/validators/phone_format_validator.rb",
33
34
  "app/validators/ssn_format_validator.rb",
@@ -77,6 +78,7 @@ Gem::Specification.new do |s|
77
78
  "spec/support/basic_record.rb",
78
79
  "spec/validators/currency_format_validator_spec.rb",
79
80
  "spec/validators/days_of_week_validator_spec.rb",
81
+ "spec/validators/devise_password_validator_spec.rb",
80
82
  "spec/validators/florida_counties_integration_spec.rb",
81
83
  "spec/validators/florida_counties_spec.rb",
82
84
  "spec/validators/phone_format_validator_spec.rb",
@@ -1,51 +1,61 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CurrencyFormatValidator do
4
- describe ".validate_each" do
5
- before(:each) do
6
- @options = {:attributes => {}}
7
- @validator = CurrencyFormatValidator.new(@options)
8
- @record = BasicRecord.new(:cost)
9
- end
10
-
11
- it "should validate the format for ###.##" do
12
- @record.errors[:cost].should_not_receive("<<")
13
- @validator.validate_each(@record, :cost, "123.45")
14
- end
15
-
16
- it "should validate the format for ##.##" do
17
- @record.errors[:cost].should_not_receive("<<")
18
- @validator.validate_each(@record, :cost, "23.45")
19
- end
20
-
21
- it "should validate the format for 0.##" do
22
- @record.errors[:cost].should_not_receive("<<")
23
- @validator.validate_each(@record, :cost, "0.45")
24
- end
25
-
26
- it "should validate the format for ##" do
27
- @record.errors[:cost].should_not_receive("<<")
28
- @validator.validate_each(@record, :cost, "45")
29
- end
30
-
31
- it "should not validate the format for #.#.#" do
32
- @record.errors[:cost].should_receive("<<")
33
- @validator.validate_each(@record, :cost, "4.5.6")
34
- end
35
-
36
- it "should not validate the format for string" do
37
- @record.errors[:cost].should_receive("<<")
38
- @validator.validate_each(@record, :cost, "word")
39
- end
40
-
41
- it "should not validate the format for #.#" do
42
- @record.errors[:cost].should_receive("<<")
43
- @validator.validate_each(@record, :cost, "1.2")
44
- end
4
+ before :each do
5
+ @validator = CurrencyFormatValidator.new attributes: {}
6
+ @mock = mock
7
+ @mock.stub!(:errors).and_return([])
8
+ @mock.errors.stub!(:[]).and_return({})
9
+ @mock.errors[].stub!(:<<)
10
+ end
11
+
12
+ subject { @validator }
13
+
14
+ # Correct data yields no errors!
15
+ context 'with perfectly valid, correctly-formatted input should produce no errors' do
16
+ before { @mock.should_not_receive :errors }
17
+ it { subject.validate_each @mock, 'date', '123.45' }
18
+ it { subject.validate_each @mock, 'date', '23.45' }
19
+ it { subject.validate_each @mock, 'date', '0.45' }
20
+ it { subject.validate_each @mock, 'date', '.45' }
21
+ it { subject.validate_each @mock, 'date', '.4' }
22
+ it { subject.validate_each @mock, 'date', '4' }
23
+ end
45
24
 
46
- it "should not validate the format for .##" do
47
- @record.errors[:cost].should_receive("<<")
48
- @validator.validate_each(@record, :cost, ".99")
25
+ # Incorrect data yields errors!
26
+ context 'with invalid input should produce a validation error' do
27
+ before { @mock.errors[].should_receive :<< }
28
+ it { subject.validate_each @mock, 'date', '23.456' }
29
+ it { subject.validate_each @mock, 'date', 'two' }
30
+ it { subject.validate_each @mock, 'date', '23..456' }
31
+ it { subject.validate_each @mock, 'date', '23.45.6' }
32
+ it { subject.validate_each @mock, 'date', '.234' }
33
+ end
34
+
35
+ context 'in strict mode' do
36
+ before :each do
37
+ @validator = CurrencyFormatValidator.new attributes: {}, strict: true
38
+ end
39
+ subject { @validator }
40
+ context 'with perfectly valid, correctly-formatted input should produce no errors' do
41
+ before { @mock.should_not_receive :errors }
42
+ it { subject.validate_each @mock, 'date', '123.45' }
43
+ it { subject.validate_each @mock, 'date', '23.45' }
44
+ it { subject.validate_each @mock, 'date', '0.45' }
45
+ it { subject.validate_each @mock, 'date', '4' }
46
+ end
47
+
48
+ context 'with invalid input should produce a validation error' do
49
+ before { @mock.errors[].should_receive :<< }
50
+ it { subject.validate_each @mock, 'date', '.45' }
51
+ it { subject.validate_each @mock, 'date', '.4' }
52
+ it { subject.validate_each @mock, 'date', '0.4' }
53
+ it { subject.validate_each @mock, 'date', '23.456' }
54
+ it { subject.validate_each @mock, 'date', 'two' }
55
+ it { subject.validate_each @mock, 'date', '23..456' }
56
+ it { subject.validate_each @mock, 'date', '23.45.6' }
57
+ it { subject.validate_each @mock, 'date', '.234' }
49
58
  end
50
59
  end
60
+
51
61
  end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe DevisePasswordValidator do
4
+ describe ".validate_each" do
5
+ before(:each) do
6
+ @options = {:attributes => {}}
7
+ @validator = DevisePasswordValidator.new(@options)
8
+ @record = BasicRecord.new(:password)
9
+ @record.stub!(:password)
10
+ @record.stub!(:password_confirmation)
11
+ @record.stub!(:id)
12
+ @record.stub!(:reset_password_token)
13
+ end
14
+
15
+ it "should validate a password of at least 6 characters, no spaces, and password is not being reset" do
16
+ @record.errors[:password].should_not_receive("<<")
17
+ @record.stub!(:password).and_return("goodpa")
18
+ @record.stub!(:password_confirmation).and_return("goodpa")
19
+ @validator.validate_each(@record, :password, "goodpa")
20
+ end
21
+
22
+ it "should not validate if password is not at least 6 characters" do
23
+ @record.errors[:password].should_receive("<<")
24
+ @record.stub!(:password).and_return("badpa")
25
+ @record.stub!(:password_confirmation).and_return "badpa"
26
+ @validator.validate_each(@record, :password, "badpa")
27
+ end
28
+
29
+ it "should not validate if password has a space" do
30
+ @record.errors[:password].should_receive("<<")
31
+ @record.stub!(:password).and_return "bad pass"
32
+ @record.stub!(:password_confirmation).and_return "bad pass"
33
+ @validator.validate_each(@record, :password, "bad pass")
34
+ end
35
+
36
+ it "should not validate if password does not match password confirmation" do
37
+ @record.errors[:password].should_receive("<<")
38
+ @record.stub!(:password).and_return "goodpa"
39
+ @record.stub!(:password_confirmation).and_return "goodpa2"
40
+ @validator.validate_each(@record, :password, "goodpa")
41
+ end
42
+
43
+ it "should not validate if password is blank and the record has no id" do
44
+ @record.errors[:password].should_receive("<<")
45
+ @record.stub!(:password).and_return ""
46
+ @record.stub!(:password_confirmation).and_return ""
47
+ @validator.validate_each(@record, :password, "")
48
+ end
49
+
50
+ it "should validate if password is blank and the record has an id and the reset token is blank" do
51
+ @record.errors[:password].should_not_receive("<<")
52
+ @record.stub!(:password).and_return ""
53
+ @record.stub!(:id).and_return "1"
54
+ @record.stub!(:password_confirmation).and_return ""
55
+ @validator.validate_each(@record, :password, "")
56
+ end
57
+
58
+ it "should not validate if password is blank and the record has an id and the reset token is not blank" do
59
+ @record.errors[:password].should_receive("<<")
60
+ @record.stub!(:password).and_return ""
61
+ @record.stub!(:id).and_return "1"
62
+ @record.stub!(:reset_password_token).and_return "alhbasdhkhlb"
63
+ @record.stub!(:password_confirmation).and_return ""
64
+ @validator.validate_each(@record, :password, "")
65
+ end
66
+
67
+ end
68
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: format_validators
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.5
5
+ version: 0.0.6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jeremiah Hemphill
@@ -165,6 +165,7 @@ files:
165
165
  - VERSION
166
166
  - app/validators/currency_format_validator.rb
167
167
  - app/validators/days_of_week_validator.rb
168
+ - app/validators/devise_password_validator.rb
168
169
  - app/validators/florida_counties_validator.rb
169
170
  - app/validators/phone_format_validator.rb
170
171
  - app/validators/ssn_format_validator.rb
@@ -214,6 +215,7 @@ files:
214
215
  - spec/support/basic_record.rb
215
216
  - spec/validators/currency_format_validator_spec.rb
216
217
  - spec/validators/days_of_week_validator_spec.rb
218
+ - spec/validators/devise_password_validator_spec.rb
217
219
  - spec/validators/florida_counties_integration_spec.rb
218
220
  - spec/validators/florida_counties_spec.rb
219
221
  - spec/validators/phone_format_validator_spec.rb
@@ -232,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
234
  requirements:
233
235
  - - ">="
234
236
  - !ruby/object:Gem::Version
235
- hash: 2589333216613871779
237
+ hash: 26858958529201011
236
238
  segments:
237
239
  - 0
238
240
  version: "0"