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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: da0ea43ce94267431428016947a2f230ecfe304f
4
- data.tar.gz: a61003c3bfd1715e5c4e8f8d2306f567fa64ab5f
3
+ metadata.gz: 2ef9cb0a1bdc88afc57d1e6fbdb5892a6e345cd8
4
+ data.tar.gz: 16b958a9b9a47c805a4d4d22a840e214b62edde7
5
5
  SHA512:
6
- metadata.gz: bd9ee0004797cd37a3b67e45ec4e7860c6cfde62963ab5094cdfc9b62075b387f19b7a96adf178b547122629ad86852edf1668c247cb14e87cdc8550a0753366
7
- data.tar.gz: bf0e523a57f17413861f53c79d29b1d6b1a9192887f7210e8bf3d197fca4b0767f64210f5f766050bfacbb8b5d1ec1148b5da4c44643f470c67627db90c3a524
6
+ metadata.gz: 298346d3cd6268e5457eb8e10d8c3f423ce093e84b79bb73ec37557cefa78f592f3013a4e086558c99049a4a68d1dcfd234fa4d2cd9738ff4240d61bd90d6c19
7
+ data.tar.gz: 9a0d7e4430133b692859d8b077536fee7866252ff5c458f778cdadd1bfb34512bb9309e6f8a28471b7a795918c8a3579b424e757df353fde167c567ad9b0ad1d
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - "1.9.3"
5
+ - "2.0.0"
6
+ - "2.1.1"
7
+ - "jruby"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tracking_number (0.9.1)
4
+ tracking_number (0.10.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1
1
+ 0.10.0
@@ -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, DHL, OnTrac]
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
@@ -57,7 +57,6 @@ module TrackingNumber
57
57
  def inspect
58
58
  "#<%s:%#0x %s>" % [self.class.to_s, self.object_id, tracking_number]
59
59
  end
60
-
61
60
  end
62
61
 
63
62
  class Unknown < Base
@@ -65,4 +64,4 @@ module TrackingNumber
65
64
  :unknown
66
65
  end
67
66
  end
68
- end
67
+ end
@@ -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
- end
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
@@ -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,3 +1,3 @@
1
1
  module TrackingNumber
2
- VERSION = "0.9.1"
2
+ VERSION = "0.10.0"
3
3
  end
@@ -1,14 +1,34 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class DHLTrackingNumberTest < Minitest::Test
4
- context "a DHL tracking number" do
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::DHL, :dhl)
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::DHL)
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.9.1
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