activevalidators 1.4.0 → 1.5.0

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.md CHANGED
@@ -42,6 +42,10 @@ In your models, the gem provides new validators like `email`, or `url`:
42
42
  validates :credit_card, :credit_card => { :type => :any }
43
43
  end
44
44
 
45
+ class Order
46
+ validates :tracking_num, :tracking_number => { :carrier => :ups }
47
+ end
48
+
45
49
 
46
50
  Exhaustive list of supported validators and their implementation:
47
51
 
@@ -55,6 +59,7 @@ Exhaustive list of supported validators and their implementation:
55
59
  * `date` : based on the `DateValidator` gem
56
60
  * `password` : based on a set of regular expressions
57
61
  * `postal_code`: based on a set of predefined masks
62
+ * `tracking_number`: based on a set of predefined masks
58
63
 
59
64
  Todo
60
65
  ----
@@ -4,7 +4,7 @@ $:.unshift lib unless $:.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "activevalidators"
7
- s.version = '1.4.0'
7
+ s.version = '1.5.0'
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Franck Verrot", "Paco Guzmán", "Oriol Gual", "Garrett Bjerkhoel", "Renato Riccieri Santos Zannon", "Brian Moseley"]
10
10
  s.email = ["franck@verrot.fr"]
@@ -0,0 +1,32 @@
1
+ module ActiveModel
2
+ module Validations
3
+ class TrackingNumberValidator < EachValidator
4
+ def validate_each(record, attribute, value)
5
+ @value = value
6
+ carrier = options[:carrier]
7
+ raise "Carrier option required" unless carrier
8
+ @formats = TrackingNumberValidator.known_formats[carrier]
9
+ raise "No known tracking number formats for carrier #{carrier}" unless @formats
10
+ record.errors.add(attribute) unless matches_any?
11
+ end
12
+
13
+ def self.known_formats
14
+ @@known_formats ||= {
15
+ # see https://www.ups.com/content/us/en/tracking/help/tracking/tnh.html
16
+ :ups => ['1Z################', '############', 'T##########', '#########'],
17
+ }
18
+ end
19
+
20
+ def matches_any?
21
+ false if @formats.nil? or not @formats.respond_to?(:detect)
22
+ @formats.detect { |format| @value.match(TrackingNumberValidator.regexp_from format) }
23
+ end
24
+
25
+ private
26
+
27
+ def self.regexp_from(format)
28
+ Regexp.new "^"+(Regexp.escape format).gsub('\#','\d')+"$"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -9,7 +9,8 @@ module ActiveModel
9
9
  extend ActiveSupport::Autoload
10
10
 
11
11
  def self.activevalidators
12
- ['Email','Url','RespondTo','Phone','Slug','Ip','CreditCard','Date','Password','Twitter','PostalCode']
12
+ ['Email','Url','RespondTo','Phone','Slug','Ip','CreditCard','Date','Password','Twitter','PostalCode',
13
+ 'TrackingNumber']
13
14
  end
14
15
 
15
16
  #Eager autoload the library's validators into AR::Validations
data/spec/spec_helper.rb CHANGED
@@ -11,5 +11,5 @@ class TestRecord
11
11
  include ActiveModel::Validations
12
12
  attr_accessor :ip, :url, :slug, :responder, :global_condition,
13
13
  :local_condition, :phone, :email, :card, :password, :twitter_username,
14
- :postal_code
14
+ :postal_code, :tracking_number
15
15
  end
@@ -0,0 +1,66 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
2
+
3
+ describe "Tracking Number Validation" do
4
+
5
+ subject { TestRecord.new }
6
+
7
+ context "when no carrier parameter is given" do
8
+ before(:each) do
9
+ TestRecord.reset_callbacks(:validate)
10
+ TestRecord.validates :tracking_number, :tracking_number => true
11
+ end
12
+
13
+ it "raises an exception" do
14
+ lambda { subject.valid? }.should raise_error
15
+ end
16
+ end
17
+
18
+ context "when given a ups carrier parameter" do
19
+ before(:each) do
20
+ TestRecord.reset_callbacks(:validate)
21
+ TestRecord.validates :tracking_number, :tracking_number => {:carrier => :ups}
22
+ end
23
+
24
+ it 'should validate format of tracking number with 1Z################' do
25
+ subject.tracking_number = '1Z9999999999999999'
26
+ subject.should be_valid
27
+ subject.should have(0).errors
28
+ end
29
+
30
+ it 'should validate format of tracking number with ############' do
31
+ subject.tracking_number = '999999999999'
32
+ subject.should be_valid
33
+ subject.should have(0).errors
34
+ end
35
+
36
+ it 'should validate format of tracking number with T##########' do
37
+ subject.tracking_number = 'T9999999999'
38
+ subject.should be_valid
39
+ subject.should have(0).errors
40
+ end
41
+
42
+ it 'should validate format of tracking number with #########' do
43
+ subject.tracking_number = '999999999'
44
+ subject.should be_valid
45
+ subject.should have(0).errors
46
+ end
47
+ end
48
+
49
+ describe "for invalid formats" do
50
+ before :each do
51
+ TestRecord.reset_callbacks(:validate)
52
+ TestRecord.validates :tracking_number, :tracking_number => {:carrier => :ups}
53
+ subject.tracking_number = '999'
54
+ end
55
+
56
+ it "rejects invalid formats" do
57
+ subject.should_not be_valid
58
+ subject.should have(1).error
59
+ end
60
+
61
+ it "generates an error message of type invalid" do
62
+ subject.should_not be_valid
63
+ subject.errors[:tracking_number].should include subject.errors.generate_message(:tracking_number, :invalid)
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activevalidators
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 4
8
+ - 5
9
9
  - 0
10
- version: 1.4.0
10
+ version: 1.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Franck Verrot
@@ -20,7 +20,7 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2011-04-30 00:00:00 +02:00
23
+ date: 2011-05-13 00:00:00 +02:00
24
24
  default_executable:
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
@@ -169,6 +169,7 @@ files:
169
169
  - lib/active_model/validations/postal_code_validator.rb
170
170
  - lib/active_model/validations/respond_to_validator.rb
171
171
  - lib/active_model/validations/slug_validator.rb
172
+ - lib/active_model/validations/tracking_number_validator.rb
172
173
  - lib/active_model/validations/twitter_validator.rb
173
174
  - lib/active_model/validations/url_validator.rb
174
175
  - lib/activevalidators.rb
@@ -182,6 +183,7 @@ files:
182
183
  - spec/validations/postal_code_spec.rb
183
184
  - spec/validations/respond_to_spec.rb
184
185
  - spec/validations/slug_spec.rb
186
+ - spec/validations/tracking_number_spec.rb
185
187
  - spec/validations/twitter_spec.rb
186
188
  - spec/validations/url_spec.rb
187
189
  has_rdoc: true
@@ -214,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
216
  requirements: []
215
217
 
216
218
  rubyforge_project:
217
- rubygems_version: 1.6.0
219
+ rubygems_version: 1.6.2
218
220
  signing_key:
219
221
  specification_version: 3
220
222
  summary: Collection of ActiveModel/ActiveRecord validations
@@ -229,5 +231,6 @@ test_files:
229
231
  - spec/validations/postal_code_spec.rb
230
232
  - spec/validations/respond_to_spec.rb
231
233
  - spec/validations/slug_spec.rb
234
+ - spec/validations/tracking_number_spec.rb
232
235
  - spec/validations/twitter_spec.rb
233
236
  - spec/validations/url_spec.rb