tracking_number 0.9.1 → 0.10.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 +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
|