validates_formatting_of 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,16 @@
1
+ ## v0.8.0
2
+
3
+ * Added Rails 'sexy' validation. *hbakhiyor*
4
+
5
+ ```ruby
6
+ class User < ActiveRecord::Base
7
+ validates :email, :email => true
8
+ end
9
+ ```
10
+
1
11
  ## v0.7.2
2
12
 
3
- * Bugfix: Changed \Z to \z anchor and added some test assertions. Not valid with newline in some formats
13
+ * Bugfix: Changed \Z to \z anchor and added some test assertions. Not valid with newline in some formats *hbakhiyor*
4
14
 
5
15
  ## v0.7.1
6
16
 
@@ -1,9 +1,8 @@
1
- # Validates Formatting Of
2
-
3
1
  [![Build Status](https://secure.travis-ci.org/mattdbridges/validates_formatting_of.png)](http://travis-ci.org/mattdbridges/validates_formatting_of)
4
2
  [![Dependency Status](https://gemnasium.com/mattdbridges/validates_formatting_of.png?travis)](https://gemnasium.com/mattdbridges/validates_formatting_of)
3
+ [![Code Climate](https://codeclimate.com/github/mattdbridges/validates_formatting_of.png)](https://codeclimate.com/github/mattdbridges/validates_formatting_of)
5
4
 
6
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/mattdbridges/validates_formatting_of)
5
+ # Validates Formatting Of
7
6
 
8
7
  The `validates_formatting_of` gem adds several convenient methods to validate things such as emails, urls, and phone numbers in a Rails application.
9
8
 
@@ -1,4 +1,5 @@
1
1
  require "validates_formatting_of/version"
2
2
  require "validates_formatting_of/method"
3
+ require "validates_formatting_of/validator"
3
4
  require "validates_formatting_of/model_additions"
4
- require "validates_formatting_of/railtie" if defined? Rails
5
+ require "validates_formatting_of/railtie" if defined? Rails
@@ -6,5 +6,11 @@ module ValidatesFormattingOf
6
6
  extend ModelAdditions
7
7
  end
8
8
  end
9
+
10
+ initializer 'validates_formatting_of.validations' do
11
+ ActiveSupport.on_load :active_record do
12
+ include Validations
13
+ end
14
+ end
9
15
  end
10
- end
16
+ end
@@ -0,0 +1,26 @@
1
+ require 'active_support/core_ext/hash/reverse_merge'
2
+ require 'active_model/validations'
3
+
4
+ module ValidatesFormattingOf
5
+ module Validations
6
+ class Validator < ActiveModel::Validations::FormatValidator
7
+ def initialize(options = {}, format = nil)
8
+ return if format.blank?
9
+
10
+ validation = Method.find(nil, :using => format)
11
+ options.reverse_merge!(:with => validation.regex, :message => validation.message)
12
+ super options
13
+ end
14
+ end
15
+
16
+ Method.validations.each do |key, value|
17
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
18
+ class #{key.to_s.camelize}Validator < Validator
19
+ def initialize(options = {})
20
+ super options, #{key.to_sym.inspect}
21
+ end
22
+ end
23
+ RUBY_EVAL
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module ValidatesFormattingOf
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -12,6 +12,7 @@ require 'active_model'
12
12
  class TestActiveRecord
13
13
 
14
14
  include ActiveModel::Validations
15
+ include ValidatesFormattingOf::Validations
15
16
  extend ValidatesFormattingOf::ModelAdditions
16
17
 
17
18
  def initialize(attributes = {})
@@ -0,0 +1,284 @@
1
+ require 'spec_helper'
2
+
3
+ describe ValidatesFormattingOf::Validations do
4
+
5
+ describe "with 'sexy' validation style" do
6
+ describe "email" do
7
+ class Email < TestActiveRecord
8
+ attr_accessor :email
9
+ validates :email, :email => true
10
+ end
11
+
12
+ it "validates that the email provided is valid" do
13
+ Email.new(:email => "example@example.com").should be_valid
14
+ Email.new(:email => "badexample.com").should_not be_valid
15
+ Email.new(:email => "mbridges.91@gmail.com").should be_valid
16
+ Email.new(:email => "some-random%%%strangely-formatted-email@lots.of.subdomains.com").should be_valid
17
+ Email.new(:email => "this__???{}|__should@be-valid.com").should be_valid
18
+ Email.new(:email => "visitorservices@vmfa.museum").should be_valid
19
+ Email.new(:email => "info@samoa.travel").should be_valid
20
+ Email.new(:email => "info@-samoa.travel").should_not be_valid
21
+ Email.new(:email => "info@samoa-.travel").should_not be_valid
22
+ Email.new(:email => "info@123-samoa.travel").should be_valid
23
+ Email.new(:email => "info@123-samoa.travel\n").should_not be_valid
24
+ end
25
+ end
26
+
27
+ describe "simple email for 1.8.7 and javascript validations (such as with client_side_validations)" do
28
+ class SimpleEmail < TestActiveRecord
29
+ attr_accessor :email
30
+ validates :email, :simple_email => true
31
+ end
32
+ it "validates that the email provided is valid" do
33
+ SimpleEmail.new(:email => "example@example.com").should be_valid
34
+ SimpleEmail.new(:email => "badexample.com").should_not be_valid
35
+ SimpleEmail.new(:email => "mbridges.91@gmail.com").should be_valid
36
+ SimpleEmail.new(:email => "some-random%%%strangely-formatted-email@lots.of.subdomains.com").should be_valid
37
+ SimpleEmail.new(:email => "this__???{}|__should@be-valid.com").should be_valid
38
+ SimpleEmail.new(:email => "visitorservices@vmfa.museum").should be_valid
39
+ SimpleEmail.new(:email => "info@samoa.travel").should be_valid
40
+ SimpleEmail.new(:email => "info@-samoa.travel").should be_valid
41
+ SimpleEmail.new(:email => "info@samoa-.travel").should be_valid
42
+ SimpleEmail.new(:email => "info@123-samoa.travel").should be_valid
43
+ SimpleEmail.new(:email => "info@123-samoa.travel\n").should_not be_valid
44
+ end
45
+ end
46
+ describe "url" do
47
+ class Webpage < TestActiveRecord
48
+ attr_accessor :url
49
+ validates :url, :url => true
50
+ end
51
+ it "validates that the url provided is valid" do
52
+ Webpage.new(:url => 'http://something.com').should be_valid
53
+ Webpage.new(:url => 'http://something-else.com').should be_valid
54
+ Webpage.new(:url => 'http://sub.domains.something-else.com').should be_valid
55
+ Webpage.new(:url => 'http://username:password@something-else.com').should be_valid
56
+ Webpage.new(:url => "http://username:password@something-else.com\n").should_not be_valid
57
+ Webpage.new(:url => "something else").should_not be_valid
58
+ end
59
+ end
60
+
61
+ describe "us_zip" do
62
+ class USZip < TestActiveRecord
63
+ attr_accessor :zipcode
64
+ validates :zipcode, :us_zip => true
65
+ end
66
+ it "validates that the zipcode provided is valid" do
67
+ USZip.new(:zipcode => '92348').should be_valid
68
+ USZip.new(:zipcode => '23434-2348').should be_valid
69
+ USZip.new(:zipcode => "23434-2348\n").should_not be_valid
70
+ USZip.new(:zipcode => '234').should_not be_valid
71
+ USZip.new(:zipcode => '23408234').should_not be_valid
72
+ USZip.new(:zipcode => 'invalid').should_not be_valid
73
+ end
74
+ end
75
+
76
+ describe "alpha" do
77
+ class Alpha < TestActiveRecord
78
+ attr_accessor :alpha
79
+ validates :alpha, :alpha => true
80
+ end
81
+ it "validates that the letters provided is valid" do
82
+ Alpha.new(:alpha => 'abscdsofjsdpfahdsofkajlsdfaspdhjfads').should be_valid
83
+ Alpha.new(:alpha => 'asdfalskdfjhas-dlfhasdksdfaldhfadsfasdfa').should be_valid
84
+ Alpha.new(:alpha => 'adsufasodfksadjfskjdfha98').should_not be_valid
85
+ Alpha.new(:alpha => 'asdf ausdpf98hasdfo alsdf ja8 sd').should_not be_valid
86
+ end
87
+ end
88
+
89
+ describe "alphanum" do
90
+ class Alphanum < TestActiveRecord
91
+ attr_accessor :letters_and_numbers
92
+ validates :letters_and_numbers, :alphanum => true
93
+ end
94
+ it "validates that the letters provided is valid" do
95
+ Alphanum.new(:letters_and_numbers => 'numbersandlettersarevalid1234567890').should be_valid
96
+ Alphanum.new(:letters_and_numbers => 'justletters').should be_valid
97
+ Alphanum.new(:letters_and_numbers => 'letters and numbers 123 with spaces').should be_valid
98
+ Alphanum.new(:letters_and_numbers => 'adding ; some special ** chars').should_not be_valid
99
+ end
100
+ end
101
+
102
+ describe "us_phone" do
103
+ class USPhone < TestActiveRecord
104
+ attr_accessor :phone_number
105
+ validates :phone_number, :us_phone => true
106
+ end
107
+ it "validates that the phone number provided is valid" do
108
+ USPhone.new(:phone_number => '(234) 234-3456').should be_valid
109
+ USPhone.new(:phone_number => '123 123 3456').should be_valid
110
+ USPhone.new(:phone_number => '1231233456').should be_valid
111
+ USPhone.new(:phone_number => '123.123.3456').should be_valid
112
+ USPhone.new(:phone_number => '(223)123-2347').should be_valid
113
+ USPhone.new(:phone_number => "(223)123-2347\n").should_not be_valid
114
+ USPhone.new(:phone_number => '(223 123-2347').should_not be_valid
115
+ USPhone.new(:phone_number => '12349870238').should_not be_valid
116
+ end
117
+ end
118
+
119
+ describe "ip_address_v4" do
120
+ class IPAddress < TestActiveRecord
121
+ attr_accessor :ipv4
122
+ validates :ipv4, :ip_address_v4 => true
123
+ end
124
+ it "validates that the IP address provided is valid" do
125
+ IPAddress.new(:ipv4 => '10.10.10').should_not be_valid
126
+ IPAddress.new(:ipv4 => '999.10.10.20').should_not be_valid
127
+ IPAddress.new(:ipv4 => '2222.22.22.22').should_not be_valid
128
+ IPAddress.new(:ipv4 => '22.2222.22.2').should_not be_valid
129
+ IPAddress.new(:ipv4 => '127.0.0.1').should be_valid
130
+ IPAddress.new(:ipv4 => '132.254.111.10').should be_valid
131
+ IPAddress.new(:ipv4 => "132.254.111.10\n").should_not be_valid
132
+ end
133
+ end
134
+
135
+ # For clarification, NONE of the following numbers are real credit card numbers.
136
+ # They only match the pattern. These were randomly made for testing.
137
+ describe "credit_card" do
138
+ class Client < TestActiveRecord
139
+ attr_accessor :cc
140
+ validates :cc, :credit_card => true
141
+ end
142
+ it "validates that the credit card number provided is valid" do
143
+ Client.new(:cc => '4264-2879-1230-0000').should be_valid # Visa style
144
+ Client.new(:cc => '6011-1111-0000-2391').should be_valid # Discover style
145
+ Client.new(:cc => '5422434400828888').should be_valid # Mastercard style
146
+ Client.new(:cc => "5422434400828889\n").should_not be_valid # Mastercard style
147
+ Client.new(:cc => '1233444444444444').should_not be_valid # fake
148
+ end
149
+ end
150
+
151
+ describe "ssn" do
152
+ class AnotherPerson < TestActiveRecord
153
+ attr_accessor :ssn
154
+ validates :ssn, :ssn => true
155
+ end
156
+ it "validates that the social security number provided is valid" do
157
+ AnotherPerson.new(:ssn => "145.47.0191").should be_valid
158
+ AnotherPerson.new(:ssn => "223-43-2343").should be_valid
159
+ AnotherPerson.new(:ssn => "999.55.8888").should be_valid
160
+ AnotherPerson.new(:ssn => "999.55.8888\n").should_not be_valid
161
+ AnotherPerson.new(:ssn => "28934").should_not be_valid
162
+ AnotherPerson.new(:ssn => "228934828934934").should_not be_valid
163
+ AnotherPerson.new(:ssn => "23498.7234").should_not be_valid
164
+ end
165
+ end
166
+
167
+ describe "hex_color" do
168
+ class Color < TestActiveRecord
169
+ attr_accessor :color
170
+ validates :color, :hex_color => true
171
+ end
172
+ it "validates that the hex color value provided is valid" do
173
+ Color.new(:color => "efefef").should be_valid
174
+ Color.new(:color => "98de89").should be_valid
175
+ Color.new(:color => "000011").should be_valid
176
+ Color.new(:color => "132").should be_valid
177
+ Color.new(:color => "eef").should be_valid
178
+ Color.new(:color => "eef\n").should_not be_valid
179
+ Color.new(:color => "efefe").should_not be_valid
180
+ Color.new(:color => "zsdfsd").should_not be_valid
181
+ Color.new(:color => "p98hul;").should_not be_valid
182
+ Color.new(:color => "sdfsdfsf").should_not be_valid
183
+ end
184
+ end
185
+
186
+ describe "validation options" do
187
+ class Phony < TestActiveRecord
188
+ attr_accessor :phone, :phone2
189
+ validates :phone, :us_phone => true, :on => :create
190
+ validates :phone2, :us_phone => true, :on => :update
191
+ end
192
+ it "validates the phone formatting only on creation" do
193
+ option = Phony.new(:phone => "(123) 234-4567")
194
+ option.should be_valid
195
+ option.phone = "123123123"
196
+ option.should be_valid
197
+ end
198
+
199
+ class Iffy < TestActiveRecord
200
+ attr_accessor :name, :phone
201
+ validates_presence_of :name
202
+ validates :phone, :us_phone => true, :if => lambda { |iffy| iffy.name == "Matthew" }
203
+ end
204
+ it "validates the phone formatting only if a name is specified" do
205
+ Iffy.new(:phone => "(123 345-4567", :name => "Bill").should be_valid
206
+ Iffy.new(:phone => "(123 345-4567", :name => "Matthew").should_not be_valid
207
+ end
208
+
209
+ class Unlessy < TestActiveRecord
210
+ attr_accessor :name, :phone
211
+ validates_presence_of :name
212
+ validates :phone, :us_phone => true, :unless => lambda { |unlessy| unlessy.name == "Matthew" }
213
+ end
214
+ it "validates the phone formatting only if a name is specified" do
215
+ Unlessy.new(:phone => "(123 345-4567", :name => "Bill").should_not be_valid
216
+ Unlessy.new(:phone => "(123 345-4567", :name => "Matthew").should be_valid
217
+ end
218
+ end
219
+ describe "dollars" do
220
+ class Money < TestActiveRecord
221
+ attr_accessor :amount
222
+ validates :amount, :dollars => true
223
+ end
224
+ it "validates that the dollars amount provided is valid" do
225
+ Money.new(:amount => "$100.00").should be_valid
226
+ Money.new(:amount => "100.00").should be_valid
227
+ Money.new(:amount => "12,234,343").should be_valid
228
+ Money.new(:amount => "$12.34").should be_valid
229
+ Money.new(:amount => "120,123,232.32").should be_valid
230
+ Money.new(:amount => "$$1111111100").should_not be_valid
231
+ Money.new(:amount => "100;00").should_not be_valid
232
+ Money.new(:amount => "238,3423,42..99").should_not be_valid
233
+ Money.new(:amount => "$-233").should_not be_valid
234
+ end
235
+ end
236
+ describe "custom messages" do
237
+ class Message < TestActiveRecord
238
+ attr_accessor :first_name
239
+ validates :first_name, :alpha => { :message => "is not a valid first name" }
240
+ end
241
+ it "are allowed and can be used in displaying error messages" do
242
+ message = Message.new(:first_name => "invalid-first-name-123")
243
+ message.should_not be_valid
244
+ message.errors.keys.class.should eq Array
245
+ message.errors.full_messages.first.should =~ /is not a valid first name/
246
+ end
247
+ end
248
+
249
+ describe "default error messages" do
250
+ class Problems < TestActiveRecord
251
+ attr_accessor :name
252
+ validates :name, :alpha => true
253
+ end
254
+ it "set a default error" do
255
+ problems = Problems.new(:name => "sdfs12312dfsd")
256
+ problems.should_not be_valid
257
+ problems.errors.full_messages.first.should =~ /letters/i
258
+ email = Email.new(:email => "not.an.email.address")
259
+ email.should_not be_valid
260
+ email.errors.full_messages.first.should =~ /email/i
261
+ end
262
+ end
263
+
264
+ describe "nil and blank values" do
265
+ class PeopleTest < TestActiveRecord
266
+ attr_accessor :email, :email2, :email3
267
+ validates :email, :email => true, :allow_nil => true
268
+ validates :email2, :email => true, :allow_blank => true
269
+ validates :email3, :email => true
270
+ end
271
+ let(:people) { PeopleTest.new(:email => "mbridges.91@gmail.com", :email2 => "mbridges.91@gmail.com", :email3 => "mbridges.91@gmail.com") }
272
+ it "should test nil and blank values correctly" do
273
+ people.email = nil
274
+ people.should be_valid
275
+ people.email = "mbridges.91@gmail.com"
276
+ people.email2 = ""
277
+ people.should be_valid
278
+ people.email2 = "mbridges.91@gmail.com"
279
+ people.email3 = nil
280
+ people.should_not be_valid
281
+ end
282
+ end
283
+ end
284
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_formatting_of
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.8.0
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: 2013-03-27 00:00:00.000000000 Z
12
+ date: 2013-03-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -96,11 +96,13 @@ files:
96
96
  - lib/validates_formatting_of/railtie.rb
97
97
  - lib/validates_formatting_of/validation.rb
98
98
  - lib/validates_formatting_of/validation_addition.rb
99
+ - lib/validates_formatting_of/validator.rb
99
100
  - lib/validates_formatting_of/version.rb
100
101
  - spec/spec_helper.rb
101
102
  - spec/validates_formatting_of/model_additions_spec.rb
102
103
  - spec/validates_formatting_of/validation_addition_spec.rb
103
104
  - spec/validates_formatting_of/validation_spec.rb
105
+ - spec/validates_formatting_of/validator_spec.rb
104
106
  - validates_formatting_of.gemspec
105
107
  homepage: https://github.com/mattdbridges/validates_formatting_of
106
108
  licenses: []
@@ -132,3 +134,4 @@ test_files:
132
134
  - spec/validates_formatting_of/model_additions_spec.rb
133
135
  - spec/validates_formatting_of/validation_addition_spec.rb
134
136
  - spec/validates_formatting_of/validation_spec.rb
137
+ - spec/validates_formatting_of/validator_spec.rb