tracking_number 0.5.0 → 0.6.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.
- 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: []
|