tracking_number 0.8.6 → 0.9.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: 32138a72e48748c16e66ead5dcb132b5bd471979
4
- data.tar.gz: 33409e73231475efc644fd2902bc07a7b1e1f82a
3
+ metadata.gz: 36b4c229dbfddaac959991ac1cfb463a551eeb17
4
+ data.tar.gz: 267399613e49a562ff130331812f667a5f9344ed
5
5
  SHA512:
6
- metadata.gz: 1cf3034119c7363aeafabfcaf852ca0d39e0ca46e9b80b9dcd6a5833c6fa77c15d39c6947fae12a5b9ea04ed83d6fde05b8199c43d920c617ad5a358a07cdfc2
7
- data.tar.gz: 67c55b58307628400732f18a5274ad81f5d6a2e42b21a2b5228d47ce933d10c7b2c2c02684c84e213e2de5347bc6b67218d685cf5ab843ce0ed32e5a5a01903d
6
+ metadata.gz: b1268047c9ba4b8ad7092a18351a35d04b073cd83f06e9892afb3e21dbbe8b47e74a067f90612750a2b141b49e8a3f4b4ce5a4b136597a85e96e2e4dacd3c25e
7
+ data.tar.gz: c47873fc7eaf0f37c5a1c4dfb85c7887fbdc40a2b0a6b9c56fee8a402fb35b1fea37f51e7a1a920cf0b55fed284030039e2cd0d63457f00506ad172e51c4fd0c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tracking_number (0.8.6)
4
+ tracking_number (0.9.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.6
1
+ 0.9.0
@@ -15,7 +15,7 @@ if defined?(ActiveModel::EachValidator)
15
15
  end
16
16
 
17
17
  module TrackingNumber
18
- TYPES = [UPS, FedExExpress, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13, DHL, OnTrac]
18
+ TYPES = [UPS, FedExExpress, FedExSmartPost, FedExGround, FedExGround18, FedExGround96, USPS91, USPS20, USPS13, DHL, OnTrac]
19
19
 
20
20
  def self.search(body)
21
21
  TYPES.collect { |type| type.search(body) }.flatten
@@ -24,6 +24,33 @@ module TrackingNumber
24
24
  end
25
25
  end
26
26
 
27
+ class FedExSmartPost < FedEx
28
+ SEARCH_PATTERN = /(\b([0-9]\s*){20}\b)/
29
+ VERIFY_PATTERN = /^([0-9]{5}[0-9]{14})([0-9])$/
30
+ LENGTH = 20
31
+
32
+ def matches
33
+ self.tracking_number.scan(VERIFY_PATTERN).flatten
34
+ end
35
+
36
+ def valid_checksum?
37
+ # http://stackoverflow.com/questions/15744704/how-to-calculate-a-fedex-smartpost-tracking-number-check-digit
38
+
39
+ sequence = "92#{tracking_number}".chars.to_a.map(&:to_i)
40
+ check_digit = sequence.pop
41
+ total = 0
42
+
43
+ sequence.reverse.each_with_index do |x, i|
44
+ x *= 3 if i.even?
45
+ total += x
46
+ end
47
+ check = total % 10
48
+ check = (10 - check) unless (check.zero?)
49
+
50
+ return true if check == check_digit.to_i
51
+ end
52
+ end
53
+
27
54
  #TODO Fix these FedEx ground numberss
28
55
 
29
56
  class FedExGround96 < FedEx
@@ -127,5 +154,4 @@ module TrackingNumber
127
154
  return true if check == check_digit.to_i
128
155
  end
129
156
  end
130
-
131
- end
157
+ end
@@ -6,28 +6,30 @@ module TrackingNumber
6
6
  end
7
7
 
8
8
  class USPS91 < USPS
9
- SEARCH_PATTERN = [/(\b9\s*[1345]\s*(([0-9]\s*){20,20}\b))/, /(\b([0-9]\s*){20,20}\b)/]
10
- VERIFY_PATTERN = /^(9[1345][0-9]{19,19})([0-9])$/
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])$/
11
11
 
12
- # Sometimes these numbers will appear without the leading 91 or 94, though, so we need to account for that case
12
+ # Sometimes these numbers will appear without the leading 91, 93, or 94, though, so we need to account for that case
13
13
 
14
14
  def decode
15
- # Application ID: 91 or 93 or 94 or 95
15
+ # Application ID: 91, 93, 94 or 95
16
16
  # Service Code: 2 Digits
17
17
  # Mailer Id: 8 Digits
18
18
  # Package Id: 9 Digits
19
19
  # Checksum: 1 Digit
20
20
 
21
- {:application_id => self.tracking_number.to_s.slice(0...2),
22
- :service_code => self.tracking_number.to_s.slice(2...4),
23
- :mailer_id => self.tracking_number.to_s.slice(4...12),
24
- :package_identifier => self.tracking_number.to_s.slice(12...21),
25
- :check_digit => self.tracking_number.slice(21...22)
21
+ base_tracking_number = self.tracking_number.to_s.gsub(/^420\d{5}/, '')
22
+
23
+ {:application_id => base_tracking_number.to_s.slice(0...2),
24
+ :service_code => base_tracking_number.to_s.slice(2...4),
25
+ :mailer_id => base_tracking_number.to_s.slice(4...12),
26
+ :package_identifier => base_tracking_number.to_s.slice(12...21),
27
+ :check_digit => base_tracking_number.slice(21...22)
26
28
  }
27
29
  end
28
30
 
29
31
  def matches
30
- if self.tracking_number =~ /^9[1345]/
32
+ if self.tracking_number =~ /^(420\d{5})?9[1-5]/
31
33
  self.tracking_number.scan(VERIFY_PATTERN).flatten
32
34
  else
33
35
  "91#{self.tracking_number}".scan(VERIFY_PATTERN).flatten
@@ -35,7 +37,7 @@ module TrackingNumber
35
37
  end
36
38
 
37
39
  def valid_checksum?
38
- if self.tracking_number =~ /^9[1345]/
40
+ if self.tracking_number =~ /^(420\d{5})?9[1-5]/
39
41
  return true if weighted_usps_checksum_valid?(tracking_number)
40
42
  else
41
43
  if weighted_usps_checksum_valid?("91#{self.tracking_number}")
@@ -49,7 +51,7 @@ module TrackingNumber
49
51
  private
50
52
 
51
53
  def weighted_usps_checksum_valid?(sequence)
52
- chars = sequence.chars.to_a
54
+ chars = sequence.gsub(/^420\d{5}/, '').chars.to_a
53
55
  check_digit = chars.pop
54
56
 
55
57
  total = 0
@@ -1,3 +1,3 @@
1
1
  module TrackingNumber
2
- VERSION = "0.8.6"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -42,5 +42,14 @@ class FedExTrackingNumberTest < Minitest::Test
42
42
  end
43
43
  end
44
44
 
45
+ ["61299998820821171811"].each do |valid_number|
46
+ should "return fedex smart post for #{valid_number}" do
47
+ should_be_valid_number(valid_number, TrackingNumber::FedExSmartPost, :fedex)
48
+ end
49
+
50
+ should "detect #{valid_number} regardless of spacing" do
51
+ should_detect_number_variants(valid_number, TrackingNumber::FedExSmartPost)
52
+ end
53
+ end
45
54
  end
46
55
  end
@@ -31,5 +31,11 @@ class USPSTrackingNumberTest < Minitest::Test
31
31
  should_detect_number_variants(valid_number, TrackingNumber::USPS13)
32
32
  end
33
33
  end
34
+
35
+ ["420221539101026837331000039521"].each do |valid_number|
36
+ should "return usps with valid 30 digit number: #{valid_number}" do
37
+ should_be_valid_number(valid_number, TrackingNumber::USPS91, :usps)
38
+ end
39
+ end
34
40
  end
35
41
  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.8.6
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Keen