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 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