tracking_number 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/README.rdoc +15 -1
- data/Rakefile +2 -22
- data/VERSION +1 -1
- data/lib/tracking_number/active_model_validator.rb +12 -0
- data/lib/tracking_number/base.rb +6 -4
- data/lib/tracking_number/fedex.rb +10 -10
- data/lib/tracking_number/ups.rb +2 -2
- data/lib/tracking_number/usps.rb +24 -24
- data/lib/tracking_number/version.rb +1 -1
- data/lib/tracking_number.rb +4 -0
- data/test/active_model_validator_test.rb +29 -0
- data/test/fedex_tracking_number_test.rb +1 -1
- data/test/test_helper.rb +4 -11
- data/test/usps_tracking_number_test.rb +1 -1
- data/tracking_number.gemspec +7 -9
- metadata +47 -21
- data/Gemfile.lock +0 -18
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MzY2OGRiZjAzMTU1ODQxNTg4YTA2ZjhlZGVhZDdmZGMyNDIxYTg4MQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NTdhZWI1OTRlMWIwNTM3M2UxMThjMmJmZjJkNzVmZDA0NGI3MDI0ZQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YTJkYTVlMGUzYjIwZWUyNTdjYTAwZDg5YjU2YjlkMDI4NWFmN2VjM2NiMzU4
|
10
|
+
MDM1MjFiNDEyZmI3MTNhZjBiYTgwMTAxZjhiNTQ0ZGM4ZTQ1OTUxNWNiODAw
|
11
|
+
YmVjNWQwZGQwMDQ0N2YxZWM2YTUxYTRiMTk2OTU4NjBlZjZjNzM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YmFiNDcxMjBjMDU5NzNhZWI0YzJmYmQ5YjIzYjkxMzJlOGQ2M2M5ZTVkYzRm
|
14
|
+
MTQzNTc2NmIxNTJiZDIzZGRmNjhkMTI0MDIzOTI5OTE1MzA2Y2FmMDEwNzZl
|
15
|
+
MjBjMDgwYjZjMWUzOTgyNThkZjc1MmI5MmQ5YjcxMzFkYzM0MDM=
|
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -16,8 +16,22 @@ TrackingNumber.search("Lorem ipsum dolor sit amet, consectetur adipisicing elit,
|
|
16
16
|
|
17
17
|
#=> [TrackingNumber, TrackingNumber]
|
18
18
|
|
19
|
+
== ActiveModel validation
|
20
|
+
|
21
|
+
For Rails 3 (or any ActiveModel client), validate your fields as a tracking number:
|
22
|
+
|
23
|
+
class Shipment < ActiveRecord::Base
|
24
|
+
validates :tracking, :tracking_number => true
|
25
|
+
end
|
26
|
+
|
27
|
+
Sometimes it's helpful to have a "magic" tracking number that isn't valid for any of the real carriers, and maybe will have other side effects (e.g., special treatment of a shipping email.)
|
28
|
+
|
29
|
+
class Shipment < ActiveRecord::Base
|
30
|
+
validates :tracking, :tracking_number => { :except => 'magic-hand-delivery' }
|
31
|
+
end
|
32
|
+
|
19
33
|
== Contributing to tracking_number
|
20
|
-
|
34
|
+
|
21
35
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
22
36
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
23
37
|
* Fork the project
|
data/Rakefile
CHANGED
@@ -1,20 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler'
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
|
-
|
5
|
-
# if not defined?(Bundler)
|
6
|
-
# require 'bundler'
|
7
|
-
# begin
|
8
|
-
# Bundler.setup(:default, :development)
|
9
|
-
# rescue Bundler::BundlerError => e
|
10
|
-
# $stderr.puts e.message
|
11
|
-
# $stderr.puts "Run `bundle install` to install missing gems"
|
12
|
-
# exit e.status_code
|
13
|
-
# end
|
14
|
-
# end
|
15
|
-
|
16
4
|
require 'rake'
|
17
|
-
|
18
5
|
require 'rake/testtask'
|
19
6
|
Rake::TestTask.new(:test) do |test|
|
20
7
|
test.libs << 'lib' << 'test'
|
@@ -22,17 +9,10 @@ Rake::TestTask.new(:test) do |test|
|
|
22
9
|
test.verbose = true
|
23
10
|
end
|
24
11
|
|
25
|
-
require 'rcov/rcovtask'
|
26
|
-
Rcov::RcovTask.new do |test|
|
27
|
-
test.libs << 'test'
|
28
|
-
test.pattern = 'test/**/*_test.rb'
|
29
|
-
test.verbose = true
|
30
|
-
end
|
31
|
-
|
32
12
|
task :default => :test
|
33
13
|
|
34
|
-
require '
|
35
|
-
|
14
|
+
require 'rdoc/task'
|
15
|
+
RDoc::Task.new do |rdoc|
|
36
16
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
37
17
|
require 'tracking_number'
|
38
18
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class TrackingNumberValidator < ActiveModel::EachValidator
|
2
|
+
def validate_each(record, attribute, value)
|
3
|
+
return unless value.present?
|
4
|
+
if options[:exception] == value
|
5
|
+
# magic valid value (an exception that says "not really shipped" or something)
|
6
|
+
elsif TrackingNumber.new(value).valid?
|
7
|
+
# looks good to me
|
8
|
+
else
|
9
|
+
record.errors[attribute] << options[:message] || 'is not a valid tracking number'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/tracking_number/base.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module TrackingNumber
|
2
2
|
class Base
|
3
3
|
attr_accessor :tracking_number
|
4
|
+
attr_accessor :original_number
|
5
|
+
|
4
6
|
def initialize(tracking_number)
|
5
7
|
@original_number = tracking_number
|
6
8
|
@tracking_number = tracking_number.strip.gsub(" ", "").upcase
|
@@ -13,16 +15,16 @@ module TrackingNumber
|
|
13
15
|
valids.each do |t|
|
14
16
|
uniques[t.tracking_number] = t unless uniques.has_key?(t.tracking_number)
|
15
17
|
end
|
16
|
-
|
18
|
+
|
17
19
|
uniques.values
|
18
20
|
end
|
19
|
-
|
21
|
+
|
20
22
|
def self.scan(body)
|
21
23
|
patterns = [self.const_get("SEARCH_PATTERN")].flatten
|
22
24
|
possibles = patterns.collect do |pattern|
|
23
25
|
body.scan(pattern).uniq.flatten
|
24
26
|
end
|
25
|
-
|
27
|
+
|
26
28
|
possibles.flatten.compact.uniq
|
27
29
|
end
|
28
30
|
|
@@ -35,7 +37,7 @@ module TrackingNumber
|
|
35
37
|
def valid_format?
|
36
38
|
!matches.nil? && !matches.empty?
|
37
39
|
end
|
38
|
-
|
40
|
+
|
39
41
|
def decode
|
40
42
|
{}
|
41
43
|
end
|
@@ -9,7 +9,7 @@ module TrackingNumber
|
|
9
9
|
SEARCH_PATTERN = /(\b([0-9]\s*){12,12}\b)/
|
10
10
|
VERIFY_PATTERN = /^([0-9]{11,11})([0-9])$/
|
11
11
|
LENGTH = 12
|
12
|
-
|
12
|
+
|
13
13
|
def matches
|
14
14
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
15
15
|
end
|
@@ -22,21 +22,21 @@ module TrackingNumber
|
|
22
22
|
return (total % 11) == check.to_i
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
#TODO Fix these FedEx ground numberss
|
27
27
|
|
28
28
|
class FedExGround96 < FedEx
|
29
29
|
SEARCH_PATTERN = /(\b9\s*6\s*([0-9]\s*){20,20}\b)/
|
30
30
|
VERIFY_PATTERN = /^96[0-9]{5,5}([0-9]{14,14})([0-9])$/
|
31
31
|
LENGTH = 22
|
32
|
-
|
32
|
+
|
33
33
|
def matches
|
34
34
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
35
35
|
end
|
36
36
|
|
37
37
|
def decode
|
38
38
|
{:application_id => self.tracking_number.to_s.slice(0...2),
|
39
|
-
:serial_container => self.tracking_number.to_s.slice(2...4),
|
39
|
+
:serial_container => self.tracking_number.to_s.slice(2...4),
|
40
40
|
:service_code => self.tracking_number.to_s.slice(4...7),
|
41
41
|
:shipper_id => self.tracking_number.to_s.slice(7...14),
|
42
42
|
:package_identifier => self.tracking_number.to_s.slice(14...21),
|
@@ -48,7 +48,7 @@ module TrackingNumber
|
|
48
48
|
# 22 numbers
|
49
49
|
# http://fedex.com/us/solutions/ppe/FedEx_Ground_Label_Layout_Specification.pdf
|
50
50
|
# 96 - UCC/EAN Application Identifier
|
51
|
-
|
51
|
+
|
52
52
|
# [0-9]{2,2} - SCNC
|
53
53
|
# [0-9]{3,3} - Class Of Service
|
54
54
|
# [0-9]{7,7} - RPS Shipper ID (used in calculation)
|
@@ -72,7 +72,7 @@ module TrackingNumber
|
|
72
72
|
SEARCH_PATTERN = /(\b([0-9]\s*){15,15}\b)/
|
73
73
|
VERIFY_PATTERN = /^([0-9]{15,15})$/
|
74
74
|
LENGTH = 15
|
75
|
-
|
75
|
+
|
76
76
|
def matches
|
77
77
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
78
78
|
end
|
@@ -95,25 +95,25 @@ module TrackingNumber
|
|
95
95
|
SEARCH_PATTERN = /(\b([0-9]\s*){18,18}\b)/
|
96
96
|
VERIFY_PATTERN = /^[0-9]{2,2}([0-9]{15,15})([0-9])$/
|
97
97
|
LENGTH = 20
|
98
|
-
|
98
|
+
|
99
99
|
def matches
|
100
100
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
101
101
|
end
|
102
102
|
|
103
103
|
def decode
|
104
104
|
{:application_id => self.tracking_number.to_s.slice(0...2),
|
105
|
-
:serial_container => self.tracking_number.to_s.slice(1...2),
|
105
|
+
:serial_container => self.tracking_number.to_s.slice(1...2),
|
106
106
|
:service_code => self.tracking_number.to_s.slice(2...3),
|
107
107
|
:shipper_id => self.tracking_number.to_s.slice(3...10),
|
108
108
|
:package_identifier => self.tracking_number.to_s.slice(10...17),
|
109
109
|
:check_digit => self.tracking_number.slice(17...18)
|
110
110
|
}
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
def valid_checksum?
|
114
114
|
# [0-9]{2,2} - Not used
|
115
115
|
# [0-9]{15, 15} - used for calculation
|
116
|
-
|
116
|
+
|
117
117
|
sequence = tracking_number.chars.to_a.map(&:to_i)
|
118
118
|
check_digit = sequence.pop
|
119
119
|
total = 0
|
data/lib/tracking_number/ups.rb
CHANGED
@@ -2,7 +2,7 @@ module TrackingNumber
|
|
2
2
|
class UPS < Base
|
3
3
|
SEARCH_PATTERN = /(\b1\s*Z\s*(\w\s*){16,16}\b)/
|
4
4
|
VERIFY_PATTERN = /^1Z(\w{15,15})(\w)$/
|
5
|
-
|
5
|
+
|
6
6
|
def carrier
|
7
7
|
:ups
|
8
8
|
end
|
@@ -33,7 +33,7 @@ module TrackingNumber
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def decode
|
36
|
-
{:shipper_account => self.tracking_number.to_s.slice(2...8),
|
36
|
+
{:shipper_account => self.tracking_number.to_s.slice(2...8),
|
37
37
|
:service_type => self.tracking_number.to_s.slice(8...10),
|
38
38
|
:package_identifier => self.tracking_number.to_s.slice(10...17),
|
39
39
|
:check_digit => self.tracking_number.to_s.slice(17, 18)
|
data/lib/tracking_number/usps.rb
CHANGED
@@ -4,14 +4,14 @@ module TrackingNumber
|
|
4
4
|
:usps
|
5
5
|
end
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
class USPS91 < USPS
|
9
9
|
SEARCH_PATTERN = [/(\b9\s*[14]\s*(([0-9]\s*){20,20}\b))/, /(\b([0-9]\s*){20,20}\b)/]
|
10
10
|
VERIFY_PATTERN = /^(9[14][0-9]{19,19})([0-9])$/
|
11
|
-
|
11
|
+
|
12
12
|
# Sometimes these numbers will appear without the leading 91 or 94, though, so we need to account for that case
|
13
|
-
|
14
|
-
def decode
|
13
|
+
|
14
|
+
def decode
|
15
15
|
# Application ID: 91 or 94
|
16
16
|
# Service Code: 2 Digits
|
17
17
|
# Mailer Id: 8 Digits
|
@@ -19,13 +19,13 @@ module TrackingNumber
|
|
19
19
|
# Checksum: 1 Digit
|
20
20
|
|
21
21
|
{:application_id => self.tracking_number.to_s.slice(0...2),
|
22
|
-
:service_code => self.tracking_number.to_s.slice(2...4),
|
22
|
+
:service_code => self.tracking_number.to_s.slice(2...4),
|
23
23
|
:mailer_id => self.tracking_number.to_s.slice(4...12),
|
24
24
|
:package_identifier => self.tracking_number.to_s.slice(12...21),
|
25
25
|
:check_digit => self.tracking_number.slice(21...22)
|
26
26
|
}
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def matches
|
30
30
|
if self.tracking_number =~ /^9[14]/
|
31
31
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
@@ -33,10 +33,10 @@ module TrackingNumber
|
|
33
33
|
"91#{self.tracking_number}".scan(VERIFY_PATTERN).flatten
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def valid_checksum?
|
38
|
-
if self.tracking_number =~ /^9[14]/
|
39
|
-
return true if weighted_usps_checksum_valid?(tracking_number)
|
38
|
+
if self.tracking_number =~ /^9[14]/
|
39
|
+
return true if weighted_usps_checksum_valid?(tracking_number)
|
40
40
|
else
|
41
41
|
if weighted_usps_checksum_valid?("91#{self.tracking_number}")
|
42
42
|
# set the tracking number to the 91 format if it passes this test
|
@@ -45,13 +45,13 @@ module TrackingNumber
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
private
|
50
|
-
|
50
|
+
|
51
51
|
def weighted_usps_checksum_valid?(sequence)
|
52
52
|
chars = sequence.chars.to_a
|
53
53
|
check_digit = chars.pop
|
54
|
-
|
54
|
+
|
55
55
|
total = 0
|
56
56
|
chars.reverse.each_with_index do |c, i|
|
57
57
|
x = c.to_i
|
@@ -65,26 +65,26 @@ module TrackingNumber
|
|
65
65
|
return true if check == check_digit.to_i
|
66
66
|
end
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
class USPS20 < USPS
|
70
70
|
# http://www.usps.com/cpim/ftp/pubs/pub109.pdf (Publication 109. Extra Services Technical Guide, pg. 19)
|
71
71
|
# http://www.usps.com/cpim/ftp/pubs/pub91.pdf (Publication 91. Confirmation Services Technical Guide pg. 38)
|
72
|
-
|
72
|
+
|
73
73
|
SEARCH_PATTERN = /(\b([0-9]\s*){20,20}\b)/
|
74
74
|
VERIFY_PATTERN = /^([0-9]{2,2})([0-9]{9,9})([0-9]{8,8})([0-9])$/
|
75
75
|
|
76
76
|
def matches
|
77
77
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
def decode
|
81
|
-
{:service_code => self.tracking_number.to_s.slice(0...2),
|
81
|
+
{:service_code => self.tracking_number.to_s.slice(0...2),
|
82
82
|
:mailer_id => self.tracking_number.to_s.slice(2...11),
|
83
83
|
:package_identifier => self.tracking_number.to_s.slice(11...19),
|
84
84
|
:check_digit => self.tracking_number.slice(19...20)
|
85
85
|
}
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def service_type
|
89
89
|
case decode[:service_code]
|
90
90
|
when "71"
|
@@ -97,11 +97,11 @@ module TrackingNumber
|
|
97
97
|
"Return Receipt for Merchandise"
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def valid_checksum?
|
102
102
|
chars = tracking_number.chars.to_a
|
103
103
|
check_digit = chars.pop
|
104
|
-
|
104
|
+
|
105
105
|
total = 0
|
106
106
|
chars.reverse.each_with_index do |c, i|
|
107
107
|
x = c.to_i
|
@@ -114,11 +114,11 @@ module TrackingNumber
|
|
114
114
|
return true if check == check_digit.to_i
|
115
115
|
end
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
class USPS13 < USPS
|
119
119
|
SEARCH_PATTERN = /(\b([A-Z]\s*){2,2}([0-9]\s*){9,9}([A-Z]\s*){2,2}\b)/
|
120
120
|
VERIFY_PATTERN = /^([A-Z]{2,2})([0-9]{9,9})([A-Z]{2,2})$/
|
121
|
-
|
121
|
+
|
122
122
|
def matches
|
123
123
|
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
124
124
|
end
|
@@ -127,12 +127,12 @@ module TrackingNumber
|
|
127
127
|
sequence = tracking_number.scan(/[0-9]+/).flatten.join
|
128
128
|
chars = sequence.chars.to_a
|
129
129
|
check_digit = chars.pop.to_i
|
130
|
-
|
130
|
+
|
131
131
|
sum = 0
|
132
132
|
chars.zip([8,6,4,2,3,5,9,7]).each do |pair|
|
133
133
|
sum += (pair[0].to_i * pair[1].to_i)
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
remainder = sum % 11
|
137
137
|
check = case remainder
|
138
138
|
when 1
|
@@ -142,7 +142,7 @@ module TrackingNumber
|
|
142
142
|
else
|
143
143
|
11 - remainder
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
return check == check_digit
|
147
147
|
end
|
148
148
|
end
|
data/lib/tracking_number.rb
CHANGED
@@ -10,6 +10,10 @@ require 'tracking_number/ups'
|
|
10
10
|
require 'tracking_number/dhl'
|
11
11
|
require 'tracking_number/ontrac'
|
12
12
|
|
13
|
+
if defined?(ActiveModel::EachValidator)
|
14
|
+
require 'tracking_number/active_model_validator'
|
15
|
+
end
|
16
|
+
|
13
17
|
module TrackingNumber
|
14
18
|
TYPES = [UPS, FedExExpress, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13, DHL, OnTrac]
|
15
19
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TrackingNumberValidatorTest < Test::Unit::TestCase
|
4
|
+
class Validatable
|
5
|
+
include ActiveModel::Validations
|
6
|
+
attr_accessor :tracking_number
|
7
|
+
ERROR_MESSAGE = "must be valid, or 'magic' to prevent inclusion in confirmation email"
|
8
|
+
validates :tracking_number, :presence => true,
|
9
|
+
:tracking_number => {
|
10
|
+
:exception => 'magic',
|
11
|
+
:message => ERROR_MESSAGE
|
12
|
+
}
|
13
|
+
end
|
14
|
+
def test_valid_numbers
|
15
|
+
%w(magic 790535312317).each do |valid_tracking_number|
|
16
|
+
obj = Validatable.new
|
17
|
+
obj.tracking_number = valid_tracking_number
|
18
|
+
assert obj.valid?, "should allow tracking_number #{valid_tracking_number}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
def test_invalid_numbers
|
22
|
+
%w(wrong 1234).each do |invalid_tracking_number|
|
23
|
+
obj = Validatable.new
|
24
|
+
obj.tracking_number = invalid_tracking_number
|
25
|
+
assert !obj.valid?
|
26
|
+
assert_equal obj.errors[:tracking_number], [Validatable::ERROR_MESSAGE]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -21,7 +21,7 @@ class FedExTrackingNumberTest < Test::Unit::TestCase
|
|
21
21
|
should_detect_number_variants(valid_number, TrackingNumber::FedExGround96)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
["0414 4176 0228 964", "5682 8361 0012 000", "5682 8361 0012 734"].each do |valid_number|
|
26
26
|
should "return fedex ground for #{valid_number}" do
|
27
27
|
should_be_valid_number(valid_number, TrackingNumber::FedExGround, :fedex)
|
data/test/test_helper.rb
CHANGED
@@ -1,16 +1,9 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
1
3
|
require 'rubygems'
|
2
|
-
# if not defined?(Bundler)
|
3
|
-
# require 'bundler'
|
4
|
-
# begin
|
5
|
-
# Bundler.setup(:default, :development)
|
6
|
-
# rescue Bundler::BundlerError => e
|
7
|
-
# $stderr.puts e.message
|
8
|
-
# $stderr.puts "Run `bundle install` to install missing gems"
|
9
|
-
# exit e.status_code
|
10
|
-
# end
|
11
|
-
# end
|
12
4
|
require 'test/unit'
|
13
5
|
require 'shoulda'
|
6
|
+
require 'active_model'
|
14
7
|
|
15
8
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
9
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
@@ -38,7 +31,7 @@ class Test::Unit::TestCase
|
|
38
31
|
end
|
39
32
|
|
40
33
|
def should_detect_number_variants(valid_number, type)
|
41
|
-
possible_strings(valid_number).each do |string|
|
34
|
+
possible_strings(valid_number).each do |string|
|
42
35
|
results = type.search(string)
|
43
36
|
assert_equal 1, results.size, "could not find #{type} #{valid_number} in #{string}"
|
44
37
|
end
|
@@ -11,7 +11,7 @@ class USPSTrackingNumberTest < Test::Unit::TestCase
|
|
11
11
|
should_detect_number_variants(valid_number, TrackingNumber::USPS91)
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
["0307 1790 0005 2348 3741"].each do |valid_number|
|
16
16
|
should "return usps with valid 20 digit number: #{valid_number}" do
|
17
17
|
should_be_valid_number(valid_number, TrackingNumber::USPS20, :usps)
|
data/tracking_number.gemspec
CHANGED
@@ -29,21 +29,19 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.specification_version = 3
|
30
30
|
|
31
31
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
32
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
32
33
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
33
|
-
|
34
|
-
|
35
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
34
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
35
|
+
s.add_development_dependency(%q<activemodel>, [">= 3"])
|
36
36
|
else
|
37
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
37
38
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
38
|
-
|
39
|
-
# s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
40
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
39
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
41
40
|
end
|
42
41
|
else
|
42
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
43
43
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
44
|
-
|
45
|
-
# s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
46
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
44
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
47
45
|
end
|
48
46
|
end
|
49
47
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracking_number
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jeff Keen
|
@@ -11,28 +10,62 @@ bindir: bin
|
|
11
10
|
cert_chain: []
|
12
11
|
date: 2011-04-26 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: shoulda
|
16
|
-
requirement:
|
17
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
18
30
|
requirements:
|
19
31
|
- - ! '>='
|
20
32
|
- !ruby/object:Gem::Version
|
21
33
|
version: '0'
|
22
34
|
type: :development
|
23
35
|
prerelease: false
|
24
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
25
41
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement:
|
28
|
-
none: false
|
42
|
+
name: simplecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
29
44
|
requirements:
|
30
45
|
- - ! '>='
|
31
46
|
- !ruby/object:Gem::Version
|
32
47
|
version: '0'
|
33
48
|
type: :development
|
34
49
|
prerelease: false
|
35
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activemodel
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3'
|
36
69
|
description: Match tracking numbers to a service, and search blocks of text and pull
|
37
70
|
out valid tracking numbers.
|
38
71
|
email: jeff@keen.me
|
@@ -45,12 +78,12 @@ files:
|
|
45
78
|
- .document
|
46
79
|
- .gitignore
|
47
80
|
- Gemfile
|
48
|
-
- Gemfile.lock
|
49
81
|
- LICENSE.txt
|
50
82
|
- README.rdoc
|
51
83
|
- Rakefile
|
52
84
|
- VERSION
|
53
85
|
- lib/tracking_number.rb
|
86
|
+
- lib/tracking_number/active_model_validator.rb
|
54
87
|
- lib/tracking_number/base.rb
|
55
88
|
- lib/tracking_number/dhl.rb
|
56
89
|
- lib/tracking_number/fedex.rb
|
@@ -58,6 +91,7 @@ files:
|
|
58
91
|
- lib/tracking_number/ups.rb
|
59
92
|
- lib/tracking_number/usps.rb
|
60
93
|
- lib/tracking_number/version.rb
|
94
|
+
- test/active_model_validator_test.rb
|
61
95
|
- test/dhl_tracking_number_test.rb
|
62
96
|
- test/fedex_tracking_number_test.rb
|
63
97
|
- test/ontrac_tracking_number_test.rb
|
@@ -69,33 +103,25 @@ files:
|
|
69
103
|
homepage: http://github.com/jkeen/tracking_number
|
70
104
|
licenses:
|
71
105
|
- MIT
|
106
|
+
metadata: {}
|
72
107
|
post_install_message:
|
73
108
|
rdoc_options: []
|
74
109
|
require_paths:
|
75
110
|
- lib
|
76
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
112
|
requirements:
|
79
113
|
- - ! '>='
|
80
114
|
- !ruby/object:Gem::Version
|
81
115
|
version: '0'
|
82
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
117
|
requirements:
|
85
118
|
- - ! '>='
|
86
119
|
- !ruby/object:Gem::Version
|
87
120
|
version: '0'
|
88
121
|
requirements: []
|
89
122
|
rubyforge_project:
|
90
|
-
rubygems_version:
|
123
|
+
rubygems_version: 2.2.2
|
91
124
|
signing_key:
|
92
125
|
specification_version: 3
|
93
126
|
summary: Identifies valid tracking numbers
|
94
|
-
test_files:
|
95
|
-
- test/dhl_tracking_number_test.rb
|
96
|
-
- test/fedex_tracking_number_test.rb
|
97
|
-
- test/ontrac_tracking_number_test.rb
|
98
|
-
- test/test_helper.rb
|
99
|
-
- test/tracking_number_test.rb
|
100
|
-
- test/ups_tracking_number_test.rb
|
101
|
-
- test/usps_tracking_number_test.rb
|
127
|
+
test_files: []
|