tracking_number 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/lib/tracking_number.rb +1 -1
- data/lib/tracking_number/base.rb +1 -2
- data/lib/tracking_number/dhl.rb +22 -7
- data/lib/tracking_number/fedex.rb +1 -2
- data/lib/tracking_number/usps.rb +2 -2
- data/lib/tracking_number/version.rb +1 -1
- data/test/dhl_tracking_number_test.rb +23 -3
- data/test/fedex_tracking_number_test.rb +20 -0
- data/test/ontrac_tracking_number_test.rb +4 -0
- data/test/test_helper.rb +9 -0
- data/test/ups_tracking_number_test.rb +4 -0
- data/test/usps_tracking_number_test.rb +26 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ef9cb0a1bdc88afc57d1e6fbdb5892a6e345cd8
|
4
|
+
data.tar.gz: 16b958a9b9a47c805a4d4d22a840e214b62edde7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 298346d3cd6268e5457eb8e10d8c3f423ce093e84b79bb73ec37557cefa78f592f3013a4e086558c99049a4a68d1dcfd234fa4d2cd9738ff4240d61bd90d6c19
|
7
|
+
data.tar.gz: 9a0d7e4430133b692859d8b077536fee7866252ff5c458f778cdadd1bfb34512bb9309e6f8a28471b7a795918c8a3579b424e757df353fde167c567ad9b0ad1d
|
data/.travis.yml
ADDED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.10.0
|
data/lib/tracking_number.rb
CHANGED
@@ -15,7 +15,7 @@ if defined?(ActiveModel::EachValidator)
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module TrackingNumber
|
18
|
-
TYPES = [UPS, FedExExpress, FedExSmartPost, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13,
|
18
|
+
TYPES = [UPS, FedExExpress, FedExSmartPost, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13, DHLExpress, DHLExpressAir, OnTrac]
|
19
19
|
|
20
20
|
def self.search(body)
|
21
21
|
TYPES.collect { |type| type.search(body) }.flatten
|
data/lib/tracking_number/base.rb
CHANGED
data/lib/tracking_number/dhl.rb
CHANGED
@@ -1,19 +1,34 @@
|
|
1
1
|
module TrackingNumber
|
2
2
|
class DHL < Base
|
3
|
-
SEARCH_PATTERN = /(\b([0-9]\s*){11,11}\b)/
|
4
|
-
VERIFY_PATTERN = /^([0-9]{10,10})([0-9])$/
|
5
3
|
def carrier
|
6
4
|
:dhl
|
7
5
|
end
|
8
6
|
|
9
|
-
def matches
|
10
|
-
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
11
|
-
end
|
12
|
-
|
13
7
|
def valid_checksum?
|
14
8
|
# standard mod 7 check
|
15
9
|
sequence, check_digit = matches
|
16
10
|
return true if sequence.to_i % 7 == check_digit.to_i
|
17
11
|
end
|
18
12
|
end
|
19
|
-
|
13
|
+
|
14
|
+
#DHL Air (a division of DHL Express) have 11 digit numbers
|
15
|
+
class DHLExpressAir < DHL
|
16
|
+
SEARCH_PATTERN = /(\b([0-9]\s*){11,11}\b)/
|
17
|
+
VERIFY_PATTERN = /^([0-9]{10,10})([0-9])$/
|
18
|
+
|
19
|
+
def matches
|
20
|
+
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#DHL Express numbers are 10 digits long
|
25
|
+
# http://www.dhl.co.uk/content/dam/downloads/uk/Express/PDFs/developer_centre/dhlis9_shipment_and_piece_ranges_v1.3.pdf
|
26
|
+
class DHLExpress < DHL
|
27
|
+
SEARCH_PATTERN = /(\b([0-9]\s*){10,10}\b)/
|
28
|
+
VERIFY_PATTERN = /^([0-9]{9,9})([0-9])$/
|
29
|
+
|
30
|
+
def matches
|
31
|
+
self.tracking_number.scan(VERIFY_PATTERN).flatten
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -36,11 +36,10 @@ module TrackingNumber
|
|
36
36
|
# http://stackoverflow.com/questions/15744704/how-to-calculate-a-fedex-smartpost-tracking-number-check-digit
|
37
37
|
|
38
38
|
@tracking_number = "92#{tracking_number}" unless tracking_number =~ /^92/
|
39
|
-
|
40
39
|
sequence = @tracking_number.chars.map(&:to_i)
|
41
40
|
check_digit = sequence.pop
|
42
|
-
total = 0
|
43
41
|
|
42
|
+
total = 0
|
44
43
|
sequence.reverse.each_with_index do |x, i|
|
45
44
|
x *= 3 if i.even?
|
46
45
|
total += x
|
data/lib/tracking_number/usps.rb
CHANGED
@@ -6,8 +6,8 @@ module TrackingNumber
|
|
6
6
|
end
|
7
7
|
|
8
8
|
class USPS91 < USPS
|
9
|
-
SEARCH_PATTERN = [/(\b(?:420\s*\d{5})?9\s*[1-5]\s*(?:(?:[0-9]\s*){20}\b))/, /(\b([0-9]\s*){20}\b)/]
|
10
|
-
VERIFY_PATTERN = /^(?:420\d{5})?(9[1-5][0-9]{19})([0-9])$/
|
9
|
+
SEARCH_PATTERN = [/(\b(?:420\s*\d{5})?9\s*[1-5]\s*(?:(?:(?:[0-9]\s*){20}\b)|(?:(?:[0-9]\s*){24}\b)))/, /(\b([0-9]\s*){20}\b)/]
|
10
|
+
VERIFY_PATTERN = /^(?:420\d{5})?(9[1-5](?:[0-9]{19}|[0-9]{23}))([0-9])$/
|
11
11
|
|
12
12
|
# Sometimes these numbers will appear without the leading 91, 93, or 94, though, so we need to account for that case
|
13
13
|
|
@@ -1,14 +1,34 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DHLTrackingNumberTest < Minitest::Test
|
4
|
-
context "
|
4
|
+
context "DHLExpressAir tracking number" do
|
5
5
|
["73891051146"].each do |valid_number|
|
6
6
|
should "return dhl for #{valid_number}" do
|
7
|
-
should_be_valid_number(valid_number, TrackingNumber::
|
7
|
+
should_be_valid_number(valid_number, TrackingNumber::DHLExpressAir, :dhl)
|
8
|
+
end
|
9
|
+
|
10
|
+
should "fail on check digit changes on #{valid_number}" do
|
11
|
+
should_fail_on_check_digit_changes(valid_number)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "detect #{valid_number} regardless of spacing" do
|
15
|
+
should_detect_number_variants(valid_number, TrackingNumber::DHLExpressAir)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "DHLExpress tracking numbers" do
|
21
|
+
["3318810025", "8487135506", "3318810036", "3318810014"].each do |valid_number|
|
22
|
+
should "return dhl for #{valid_number}" do
|
23
|
+
should_be_valid_number(valid_number, TrackingNumber::DHLExpress, :dhl)
|
24
|
+
end
|
25
|
+
|
26
|
+
should "fail on check digit changes on #{valid_number}" do
|
27
|
+
should_fail_on_check_digit_changes(valid_number)
|
8
28
|
end
|
9
29
|
|
10
30
|
should "detect #{valid_number} regardless of spacing" do
|
11
|
-
should_detect_number_variants(valid_number, TrackingNumber::
|
31
|
+
should_detect_number_variants(valid_number, TrackingNumber::DHLExpress)
|
12
32
|
end
|
13
33
|
end
|
14
34
|
end
|
@@ -7,6 +7,10 @@ class FedExTrackingNumberTest < Minitest::Test
|
|
7
7
|
should_be_valid_number(valid_number, TrackingNumber::FedExExpress, :fedex)
|
8
8
|
end
|
9
9
|
|
10
|
+
should "fail on check digit changes on #{valid_number}" do
|
11
|
+
should_fail_on_check_digit_changes(valid_number)
|
12
|
+
end
|
13
|
+
|
10
14
|
should "detect #{valid_number} regardless of spacing" do
|
11
15
|
should_detect_number_variants(valid_number, TrackingNumber::FedExExpress)
|
12
16
|
end
|
@@ -17,6 +21,10 @@ class FedExTrackingNumberTest < Minitest::Test
|
|
17
21
|
should_be_valid_number(valid_number, TrackingNumber::FedExGround96, :fedex)
|
18
22
|
end
|
19
23
|
|
24
|
+
should "fail on check digit changes on #{valid_number}" do
|
25
|
+
should_fail_on_check_digit_changes(valid_number)
|
26
|
+
end
|
27
|
+
|
20
28
|
should "detect #{valid_number} regardless of spacing" do
|
21
29
|
should_detect_number_variants(valid_number, TrackingNumber::FedExGround96)
|
22
30
|
end
|
@@ -27,6 +35,10 @@ class FedExTrackingNumberTest < Minitest::Test
|
|
27
35
|
should_be_valid_number(valid_number, TrackingNumber::FedExGround, :fedex)
|
28
36
|
end
|
29
37
|
|
38
|
+
should "fail on check digit changes on #{valid_number}" do
|
39
|
+
should_fail_on_check_digit_changes(valid_number)
|
40
|
+
end
|
41
|
+
|
30
42
|
should "detect #{valid_number} regardless of spacing" do
|
31
43
|
should_detect_number_variants(valid_number, TrackingNumber::FedExGround)
|
32
44
|
end
|
@@ -37,6 +49,10 @@ class FedExTrackingNumberTest < Minitest::Test
|
|
37
49
|
should_be_valid_number(valid_number, TrackingNumber::FedExGround18, :fedex)
|
38
50
|
end
|
39
51
|
|
52
|
+
should "fail on check digit changes on #{valid_number}" do
|
53
|
+
should_fail_on_check_digit_changes(valid_number)
|
54
|
+
end
|
55
|
+
|
40
56
|
should "detect #{valid_number} regardless of spacing" do
|
41
57
|
should_detect_number_variants(valid_number, TrackingNumber::FedExGround18)
|
42
58
|
end
|
@@ -47,6 +63,10 @@ class FedExTrackingNumberTest < Minitest::Test
|
|
47
63
|
should_be_valid_number(valid_number, TrackingNumber::FedExSmartPost, :fedex)
|
48
64
|
end
|
49
65
|
|
66
|
+
should "fail on check digit changes on #{valid_number}" do
|
67
|
+
should_fail_on_check_digit_changes(valid_number)
|
68
|
+
end
|
69
|
+
|
50
70
|
should "detect #{valid_number} regardless of spacing" do
|
51
71
|
should_detect_number_variants(valid_number, TrackingNumber::FedExSmartPost)
|
52
72
|
end
|
@@ -7,6 +7,10 @@ class OnTracTrackingNumberTest < Minitest::Test
|
|
7
7
|
should_be_valid_number(valid_number, TrackingNumber::OnTrac, :ontrac)
|
8
8
|
end
|
9
9
|
|
10
|
+
should "fail on check digit changes on #{valid_number}" do
|
11
|
+
should_fail_on_check_digit_changes(valid_number)
|
12
|
+
end
|
13
|
+
|
10
14
|
should "detect #{valid_number} regardless of spacing" do
|
11
15
|
should_detect_number_variants(valid_number, TrackingNumber::OnTrac)
|
12
16
|
end
|
data/test/test_helper.rb
CHANGED
@@ -43,4 +43,13 @@ class Minitest::Test
|
|
43
43
|
assert_equal carrier, t.carrier
|
44
44
|
assert t.valid?
|
45
45
|
end
|
46
|
+
|
47
|
+
def should_fail_on_check_digit_changes(valid_number)
|
48
|
+
digits = valid_number.chars
|
49
|
+
last = digits.pop.to_i
|
50
|
+
digits << (last < 2 ? last + 3 : last - 3).to_s
|
51
|
+
invalid_number = digits.join
|
52
|
+
t = TrackingNumber.new(invalid_number)
|
53
|
+
assert !t.valid?, "#{invalid_number} reported as a valid #{t.class}, and it shouldn't be"
|
54
|
+
end
|
46
55
|
end
|
@@ -7,6 +7,10 @@ class UPSTrackingNumberTest < Minitest::Test
|
|
7
7
|
should_be_valid_number(valid_number, TrackingNumber::UPS, :ups)
|
8
8
|
end
|
9
9
|
|
10
|
+
should "fail on check digit changes on #{valid_number}" do
|
11
|
+
should_fail_on_check_digit_changes(valid_number)
|
12
|
+
end
|
13
|
+
|
10
14
|
should "detect #{valid_number} regardless of spacing" do
|
11
15
|
should_detect_number_variants(valid_number, TrackingNumber::UPS)
|
12
16
|
end
|
@@ -7,6 +7,10 @@ class USPSTrackingNumberTest < Minitest::Test
|
|
7
7
|
should_be_valid_number(valid_number, TrackingNumber::USPS91, :usps)
|
8
8
|
end
|
9
9
|
|
10
|
+
should "fail on check digit changes on #{valid_number}" do
|
11
|
+
should_fail_on_check_digit_changes(valid_number)
|
12
|
+
end
|
13
|
+
|
10
14
|
should "detect #{valid_number} regardless of spacing" do
|
11
15
|
should_detect_number_variants(valid_number, TrackingNumber::USPS91)
|
12
16
|
end
|
@@ -17,6 +21,10 @@ class USPSTrackingNumberTest < Minitest::Test
|
|
17
21
|
should_be_valid_number(valid_number, TrackingNumber::USPS20, :usps)
|
18
22
|
end
|
19
23
|
|
24
|
+
should "fail on check digit changes on #{valid_number}" do
|
25
|
+
should_fail_on_check_digit_changes(valid_number)
|
26
|
+
end
|
27
|
+
|
20
28
|
should "detect #{valid_number} regardless of spacing" do
|
21
29
|
should_detect_number_variants(valid_number, TrackingNumber::USPS20)
|
22
30
|
end
|
@@ -27,6 +35,10 @@ class USPSTrackingNumberTest < Minitest::Test
|
|
27
35
|
should_be_valid_number(valid_number, TrackingNumber::USPS13, :usps)
|
28
36
|
end
|
29
37
|
|
38
|
+
should "fail on check digit changes on #{valid_number}" do
|
39
|
+
should_fail_on_check_digit_changes(valid_number)
|
40
|
+
end
|
41
|
+
|
30
42
|
should "detect #{valid_number} regardless of spacing" do
|
31
43
|
should_detect_number_variants(valid_number, TrackingNumber::USPS13)
|
32
44
|
end
|
@@ -36,6 +48,20 @@ class USPSTrackingNumberTest < Minitest::Test
|
|
36
48
|
should "return usps with valid 30 digit number: #{valid_number}" do
|
37
49
|
should_be_valid_number(valid_number, TrackingNumber::USPS91, :usps)
|
38
50
|
end
|
51
|
+
|
52
|
+
should "fail on check digit changes on #{valid_number}" do
|
53
|
+
should_fail_on_check_digit_changes(valid_number)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
["92748931507708513018050063"].each do |valid_number|
|
58
|
+
should "return usps with valid 26 digit number: #{valid_number}" do
|
59
|
+
should_be_valid_number(valid_number, TrackingNumber::USPS91, :usps)
|
60
|
+
end
|
61
|
+
|
62
|
+
should "fail on check digit changes on #{valid_number}" do
|
63
|
+
should_fail_on_check_digit_changes(valid_number)
|
64
|
+
end
|
39
65
|
end
|
40
66
|
end
|
41
67
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracking_number
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Keen
|
@@ -91,6 +91,7 @@ extra_rdoc_files:
|
|
91
91
|
files:
|
92
92
|
- ".document"
|
93
93
|
- ".gitignore"
|
94
|
+
- ".travis.yml"
|
94
95
|
- Gemfile
|
95
96
|
- Gemfile.lock
|
96
97
|
- LICENSE.txt
|