tracking_number 0.10.5 → 3.0.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.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +2 -0
  3. data/.github/dependabot.yml +22 -0
  4. data/.github/workflows/release.yml +36 -0
  5. data/.github/workflows/ruby.yml +35 -0
  6. data/.gitmodules +3 -0
  7. data/.tool-versions +1 -0
  8. data/CHANGELOG.md +318 -0
  9. data/Gemfile +4 -2
  10. data/README.md +112 -15
  11. data/Rakefile +4 -1
  12. data/bin/console +14 -0
  13. data/lib/data/couriers/amazon.json +45 -0
  14. data/lib/data/couriers/canadapost.json +33 -0
  15. data/lib/data/couriers/canpar.json +29 -0
  16. data/lib/data/couriers/dhl.json +97 -0
  17. data/lib/data/couriers/dpd.json +345 -0
  18. data/lib/data/couriers/fedex.json +291 -0
  19. data/lib/data/couriers/gofo.json +24 -0
  20. data/lib/data/couriers/landmark.json +26 -0
  21. data/lib/data/couriers/lasership.json +105 -0
  22. data/lib/data/couriers/old_dominion.json +65 -0
  23. data/lib/data/couriers/ontrac.json +74 -0
  24. data/lib/data/couriers/purolator.json +50 -0
  25. data/lib/data/couriers/s10.json +1443 -0
  26. data/lib/data/couriers/speedee.json +26 -0
  27. data/lib/data/couriers/ups.json +197 -0
  28. data/lib/data/couriers/usps.json +272 -0
  29. data/lib/data/couriers/yodel.json +29 -0
  30. data/lib/data/couriers/yunexpress.json +25 -0
  31. data/lib/tracking_number/active_model_validator.rb +1 -1
  32. data/lib/tracking_number/base.rb +291 -22
  33. data/lib/tracking_number/checksum_validations.rb +119 -0
  34. data/lib/tracking_number/info.rb +26 -0
  35. data/lib/tracking_number/loader.rb +82 -0
  36. data/lib/tracking_number/partnership.rb +7 -0
  37. data/lib/tracking_number/unknown.rb +45 -0
  38. data/lib/tracking_number/version.rb +1 -1
  39. data/lib/tracking_number.rb +69 -17
  40. data/package.json +77 -0
  41. data/test/partnership_test.rb +71 -0
  42. data/test/renamed_types_test.rb +44 -0
  43. data/test/test_helper.rb +14 -7
  44. data/test/tracking_number_meta_test.rb +145 -0
  45. data/test/tracking_number_test.rb +191 -0
  46. data/tracking_number.gemspec +53 -22
  47. data/yarn.lock +3425 -0
  48. metadata +131 -46
  49. data/.travis.yml +0 -12
  50. data/VERSION +0 -1
  51. data/lib/tracking_number/dhl.rb +0 -34
  52. data/lib/tracking_number/fedex.rb +0 -156
  53. data/lib/tracking_number/ontrac.rb +0 -34
  54. data/lib/tracking_number/ups.rb +0 -108
  55. data/lib/tracking_number/usps.rb +0 -166
  56. data/test/dhl_tracking_number_test.rb +0 -35
  57. data/test/fedex_tracking_number_test.rb +0 -75
  58. data/test/ontrac_tracking_number_test.rb +0 -24
  59. data/test/ups_tracking_number_test.rb +0 -36
  60. data/test/usps_tracking_number_test.rb +0 -73
metadata CHANGED
@@ -1,45 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tracking_number
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.5
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Keen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-21 00:00:00.000000000 Z
11
+ date: 2026-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 10.4.2
20
- type: :development
19
+ version: 4.2.5
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 10.4.2
26
+ version: 4.2.5
27
27
  - !ruby/object:Gem::Dependency
28
- name: shoulda
28
+ name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
33
+ version: 1.8.3
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.8.3
41
41
  - !ruby/object:Gem::Dependency
42
- name: simplecov
42
+ name: activemodel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">"
46
+ - !ruby/object:Gem::Version
47
+ version: 4.2.5.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">"
53
+ - !ruby/object:Gem::Version
54
+ version: 4.2.5.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: irb
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
@@ -53,33 +67,89 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: activemodel
70
+ name: minitest
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: 4.2.5.1
75
+ version: '5.5'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: 4.2.5.1
82
+ version: '5.5'
69
83
  - !ruby/object:Gem::Dependency
70
- name: minitest
84
+ name: minitest-reporters
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '5.5'
89
+ version: '1.1'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '5.5'
96
+ version: '1.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '13.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: shoulda
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: terminal-table
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
83
153
  description: This gem identifies valid tracking numbers and the service they're associated
84
154
  with. It can also tell you a little bit about the package purely from the number—there's
85
155
  quite a bit of info tucked away into those numbers, it turns out.
@@ -90,36 +160,60 @@ extra_rdoc_files:
90
160
  - LICENSE.txt
91
161
  files:
92
162
  - ".document"
163
+ - ".github/FUNDING.yml"
164
+ - ".github/dependabot.yml"
165
+ - ".github/workflows/release.yml"
166
+ - ".github/workflows/ruby.yml"
93
167
  - ".gitignore"
94
- - ".travis.yml"
168
+ - ".gitmodules"
169
+ - ".tool-versions"
170
+ - CHANGELOG.md
95
171
  - Gemfile
96
172
  - LICENSE.txt
97
173
  - README.md
98
174
  - Rakefile
99
- - VERSION
175
+ - bin/console
176
+ - lib/data/couriers/amazon.json
177
+ - lib/data/couriers/canadapost.json
178
+ - lib/data/couriers/canpar.json
179
+ - lib/data/couriers/dhl.json
180
+ - lib/data/couriers/dpd.json
181
+ - lib/data/couriers/fedex.json
182
+ - lib/data/couriers/gofo.json
183
+ - lib/data/couriers/landmark.json
184
+ - lib/data/couriers/lasership.json
185
+ - lib/data/couriers/old_dominion.json
186
+ - lib/data/couriers/ontrac.json
187
+ - lib/data/couriers/purolator.json
188
+ - lib/data/couriers/s10.json
189
+ - lib/data/couriers/speedee.json
190
+ - lib/data/couriers/ups.json
191
+ - lib/data/couriers/usps.json
192
+ - lib/data/couriers/yodel.json
193
+ - lib/data/couriers/yunexpress.json
100
194
  - lib/tracking_number.rb
101
195
  - lib/tracking_number/active_model_validator.rb
102
196
  - lib/tracking_number/base.rb
103
- - lib/tracking_number/dhl.rb
104
- - lib/tracking_number/fedex.rb
105
- - lib/tracking_number/ontrac.rb
106
- - lib/tracking_number/ups.rb
107
- - lib/tracking_number/usps.rb
197
+ - lib/tracking_number/checksum_validations.rb
198
+ - lib/tracking_number/info.rb
199
+ - lib/tracking_number/loader.rb
200
+ - lib/tracking_number/partnership.rb
201
+ - lib/tracking_number/unknown.rb
108
202
  - lib/tracking_number/version.rb
203
+ - package.json
109
204
  - test/active_model_validator_test.rb
110
- - test/dhl_tracking_number_test.rb
111
- - test/fedex_tracking_number_test.rb
112
- - test/ontrac_tracking_number_test.rb
205
+ - test/partnership_test.rb
206
+ - test/renamed_types_test.rb
113
207
  - test/test_helper.rb
208
+ - test/tracking_number_meta_test.rb
114
209
  - test/tracking_number_test.rb
115
- - test/ups_tracking_number_test.rb
116
- - test/usps_tracking_number_test.rb
117
210
  - tracking_number.gemspec
211
+ - yarn.lock
118
212
  homepage: http://github.com/jkeen/tracking_number
119
213
  licenses:
120
214
  - MIT
121
215
  metadata: {}
122
- post_install_message:
216
+ post_install_message:
123
217
  rdoc_options: []
124
218
  require_paths:
125
219
  - lib
@@ -127,24 +221,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
221
  requirements:
128
222
  - - ">="
129
223
  - !ruby/object:Gem::Version
130
- version: '0'
224
+ version: 3.0.0
131
225
  required_rubygems_version: !ruby/object:Gem::Requirement
132
226
  requirements:
133
227
  - - ">="
134
228
  - !ruby/object:Gem::Version
135
229
  version: '0'
136
230
  requirements: []
137
- rubyforge_project:
138
- rubygems_version: 2.6.14
139
- signing_key:
231
+ rubygems_version: 3.2.32
232
+ signing_key:
140
233
  specification_version: 4
141
234
  summary: Identifies valid tracking numbers
142
- test_files:
143
- - test/active_model_validator_test.rb
144
- - test/dhl_tracking_number_test.rb
145
- - test/fedex_tracking_number_test.rb
146
- - test/ontrac_tracking_number_test.rb
147
- - test/test_helper.rb
148
- - test/tracking_number_test.rb
149
- - test/ups_tracking_number_test.rb
150
- - test/usps_tracking_number_test.rb
235
+ test_files: []
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: ruby
2
- sudo: false
3
- cache: bundler
4
- rvm:
5
- - "1.9.3"
6
- - "2.0.0"
7
- - "2.1.10"
8
- - "2.2.7"
9
- - "2.3.4"
10
- - "2.4.1"
11
- before_install:
12
- - travis_retry gem update --system
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.10.5
@@ -1,34 +0,0 @@
1
- module TrackingNumber
2
- class DHL < Base
3
- def carrier
4
- :dhl
5
- end
6
-
7
- def valid_checksum?
8
- # standard mod 7 check
9
- sequence, check_digit = matches
10
- return true if sequence.to_i % 7 == check_digit.to_i
11
- end
12
- 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
@@ -1,156 +0,0 @@
1
- module TrackingNumber
2
- class FedEx < Base
3
- def carrier
4
- :fedex
5
- end
6
- end
7
-
8
- class FedExExpress < FedEx
9
- SEARCH_PATTERN = /(\b([0-9]\s*){12,12}\b)/
10
- VERIFY_PATTERN = /^([0-9]{11,11})([0-9])$/
11
- LENGTH = 12
12
-
13
- def matches
14
- self.tracking_number.scan(VERIFY_PATTERN).flatten
15
- end
16
-
17
- def valid_checksum?
18
- sequence, check_digit = matches
19
- total = 0
20
- sequence.chars.to_a.zip([3,1,7,3,1,7,3,1,7,3,1]).each do |(a,b)|
21
- total += a.to_i * b
22
- end
23
- return (total % 11 % 10) == check_digit.to_i
24
- end
25
- end
26
-
27
- class FedExSmartPost < FedEx
28
- SEARCH_PATTERN = /(\b(?:9\s*2\s*)?([0-9]\s*){20}\b)/
29
- VERIFY_PATTERN = /^((?:92)?[0-9]{5}[0-9]{14})([0-9])$/
30
-
31
- def matches
32
- self.tracking_number.scan(VERIFY_PATTERN).flatten
33
- end
34
-
35
- def valid_checksum?
36
- # http://stackoverflow.com/questions/15744704/how-to-calculate-a-fedex-smartpost-tracking-number-check-digit
37
-
38
- @tracking_number = "92#{tracking_number}" unless tracking_number =~ /^92/
39
- sequence = @tracking_number.chars.map(&:to_i)
40
- check_digit = sequence.pop
41
-
42
- total = 0
43
- sequence.reverse.each_with_index do |x, i|
44
- x *= 3 if i.even?
45
- total += x
46
- end
47
-
48
- check = total % 10
49
- check = (10 - check) unless (check.zero?)
50
-
51
- return true if check == check_digit.to_i
52
- end
53
- end
54
-
55
- class FedExGround96 < FedEx
56
- SEARCH_PATTERN = /(\b9\s*6\s*([0-9]\s*){20,20}\b)/
57
- VERIFY_PATTERN = /^96[0-9]{5,5}([0-9]{14,14})([0-9])$/
58
- LENGTH = 22
59
-
60
- def matches
61
- self.tracking_number.scan(VERIFY_PATTERN).flatten
62
- end
63
-
64
- def decode
65
- {:application_id => self.tracking_number.to_s.slice(0...2),
66
- :serial_container => self.tracking_number.to_s.slice(2...4),
67
- :service_code => self.tracking_number.to_s.slice(4...7),
68
- :shipper_id => self.tracking_number.to_s.slice(7...14),
69
- :package_identifier => self.tracking_number.to_s.slice(14...21),
70
- :check_digit => self.tracking_number.slice(21...22)
71
- }
72
- end
73
-
74
- def valid_checksum?
75
- # 22 numbers
76
- # http://fedex.com/us/solutions/ppe/FedEx_Ground_Label_Layout_Specification.pdf
77
- # 96 - UCC/EAN Application Identifier
78
-
79
- # [0-9]{2,2} - SCNC
80
- # [0-9]{3,3} - Class Of Service
81
- # [0-9]{7,7} - RPS Shipper ID (used in calculation)
82
- # [0-9]{7,7} - Package Number (used in calculation)
83
- # [0-9] - Check Digit
84
- sequence, check_digit = matches
85
-
86
- total = 0
87
- sequence.chars.to_a.map(&:to_i).reverse.each_with_index do |x, i|
88
- x *= 3 if i.even?
89
- total += x
90
- end
91
-
92
- check = total % 10
93
- check = (10 - check) unless (check.zero?)
94
- return true if check == check_digit.to_i
95
- end
96
- end
97
-
98
- class FedExGround < FedEx
99
- SEARCH_PATTERN = /(\b([0-9]\s*){15,15}\b)/
100
- VERIFY_PATTERN = /^([0-9]{15,15})$/
101
- LENGTH = 15
102
-
103
- def matches
104
- self.tracking_number.scan(VERIFY_PATTERN).flatten
105
- end
106
-
107
- def valid_checksum?
108
- sequence = tracking_number.chars.to_a.map(&:to_i)
109
- check_digit = sequence.pop
110
- total = 0
111
- sequence.reverse.each_with_index do |x, i|
112
- x *= 3 if i.even?
113
- total += x
114
- end
115
- check = total % 10
116
- check = (10 - check) unless (check.zero?)
117
- return true if check == check_digit.to_i
118
- end
119
- end
120
-
121
- class FedExGround18 < FedEx
122
- SEARCH_PATTERN = /(\b([0-9]\s*){18,18}\b)/
123
- VERIFY_PATTERN = /^[0-9]{2,2}([0-9]{15,15})([0-9])$/
124
- LENGTH = 20
125
-
126
- def matches
127
- self.tracking_number.scan(VERIFY_PATTERN).flatten
128
- end
129
-
130
- def decode
131
- {:application_id => self.tracking_number.to_s.slice(0...2),
132
- :serial_container => self.tracking_number.to_s.slice(1...2),
133
- :service_code => self.tracking_number.to_s.slice(2...3),
134
- :shipper_id => self.tracking_number.to_s.slice(3...10),
135
- :package_identifier => self.tracking_number.to_s.slice(10...17),
136
- :check_digit => self.tracking_number.slice(17...18)
137
- }
138
- end
139
-
140
- def valid_checksum?
141
- # [0-9]{2,2} - Not used
142
- # [0-9]{15, 15} - used for calculation
143
-
144
- sequence = tracking_number.chars.to_a.map(&:to_i)
145
- check_digit = sequence.pop
146
- total = 0
147
- sequence.reverse.each_with_index do |x, i|
148
- x *= 3 if i.even?
149
- total += x
150
- end
151
- check = total % 10
152
- check = (10 - check) unless (check.zero?)
153
- return true if check == check_digit.to_i
154
- end
155
- end
156
- end
@@ -1,34 +0,0 @@
1
- module TrackingNumber
2
- class OnTrac < Base
3
- SEARCH_PATTERN = /(\b(C\s*)([0-9]\s*){14,14}\b)/
4
- VERIFY_PATTERN = /^(C[0-9]{13,13})([0-9])$/
5
- def carrier
6
- :ontrac
7
- end
8
-
9
- def matches
10
- self.tracking_number.scan(VERIFY_PATTERN).flatten
11
- end
12
-
13
- def valid_checksum?
14
- # checksum calculation is the same as UPS
15
- sequence, check_digit = matches
16
-
17
- total = 0
18
- sequence.chars.each_with_index do |c, i|
19
- x = if c[/[0-9]/] # numeric
20
- c.to_i
21
- else
22
- (c[0].ord - 3) % 10
23
- end
24
- x *= 2 if i.odd?
25
- total += x
26
- end
27
-
28
- check = (total % 10)
29
- check = (10 - check) unless (check.zero?)
30
-
31
- return (check.to_i == check_digit.to_i)
32
- end
33
- end
34
- end
@@ -1,108 +0,0 @@
1
- module TrackingNumber
2
- class UPS < Base
3
- SEARCH_PATTERN = /(\b1\s*Z\s*(\w\s*){16,16}\b)/
4
- VERIFY_PATTERN = /^1Z(\w{15,15})(\w)$/
5
-
6
- def carrier
7
- :ups
8
- end
9
-
10
- def matches
11
- self.tracking_number.scan(VERIFY_PATTERN).flatten
12
- end
13
-
14
- def valid_checksum?
15
- sequence = tracking_number.slice(2...17)
16
- check_digit = tracking_number.slice(17, 18)
17
-
18
- total = 0
19
- sequence.chars.each_with_index do |c, i|
20
- x = if c[/[0-9]/] # numeric
21
- c.to_i
22
- else
23
- (c[0].ord - 3) % 10
24
- end
25
- x *= 2 if i.odd?
26
- total += x
27
- end
28
-
29
- check = (total % 10)
30
- check = (10 - check) unless (check.zero?)
31
-
32
- return (check.to_i == check_digit.to_i)
33
- end
34
-
35
- def decode
36
- {:shipper_account => self.tracking_number.to_s.slice(2...8),
37
- :service_type => self.tracking_number.to_s.slice(8...10),
38
- :package_identifier => self.tracking_number.to_s.slice(10...17),
39
- :check_digit => self.tracking_number.to_s.slice(17, 18)
40
- }
41
- end
42
-
43
- def service_type
44
- case decode[:service_type]
45
- when "01"
46
- "UPS United States Next Day Air (Red)"
47
- when "02"
48
- "UPS United States Second Day Air (Blue)"
49
- when "03"
50
- "UPS United States Ground"
51
- when "12"
52
- "UPS United States Third Day Select"
53
- when "13"
54
- "UPS United States Next Day Air Saver (Red Saver)"
55
- when "15"
56
- "UPS United States Next Day Air Early A.M."
57
- when "22"
58
- "UPS United States Ground - Returns Plus - Three Pickup Attempts"
59
- when "32"
60
- "UPS United States Next Day Air Early A.M. - COD"
61
- when "33"
62
- "UPS United States Next Day Air Early A.M. - Saturday Delivery, COD"
63
- when "41"
64
- "UPS United States Next Day Air Early A.M. - Saturday Delivery"
65
- when "42"
66
- "UPS United States Ground - Signature Required"
67
- when "44"
68
- "UPS United States Next Day Air - Saturday Delivery"
69
- when "66"
70
- "UPS United States Worldwide Express"
71
- when "72"
72
- "UPS United States Ground - Collect on Delivery"
73
- when "78"
74
- "UPS United States Ground - Returns Plus - One Pickup Attempt"
75
- when "90"
76
- "UPS United States Ground - Returns - UPS Prints and Mails Label"
77
- when "A0"
78
- "UPS United States Next Day Air Early A.M. - Adult Signature Required"
79
- when "A1"
80
- "UPS United States Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required"
81
- when "A2"
82
- "UPS United States Next Day Air - Adult Signature Required"
83
- when "A8"
84
- "UPS United States Ground - Adult Signature Required"
85
- when "A9"
86
- "UPS United States Next Day Air Early A.M. - Adult Signature Required, COD"
87
- when "AA"
88
- "UPS United States Next Day Air Early A.M. - Saturday Delivery, Adult Signature Required, COD"
89
- end
90
- end
91
- end
92
-
93
- class UPSTest < UPS
94
- # Easypost UPS test numbers as described here:
95
- # https://www.easypost.com/docs/api#tracking (scroll down a bit).
96
- SEARCH_PATTERN = /^EZ(\d)00000000\1$/
97
- VERIFY_PATTERN = SEARCH_PATTERN
98
-
99
- def matches
100
- self.tracking_number.scan(VERIFY_PATTERN).flatten
101
- end
102
-
103
- def valid_checksum?
104
- sequence = tracking_number.scan(/[a-zA-Z0-9]+/).flatten.join
105
- return sequence =~ /EZ(\d)00000000\1/
106
- end
107
- end
108
- end