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
@@ -6,6 +6,9 @@ class TrackingNumberTest < Minitest::Test
6
6
  t = TrackingNumber.new("101")
7
7
  assert_equal TrackingNumber::Unknown, t.class
8
8
  assert_equal :unknown, t.carrier
9
+ assert_equal :unknown, t.courier_code
10
+ assert_equal "Unknown", t.courier_name
11
+
9
12
  assert !t.valid?
10
13
  end
11
14
 
@@ -26,10 +29,198 @@ class TrackingNumberTest < Minitest::Test
26
29
  assert_equal 2, s.size
27
30
  end
28
31
 
32
+ should "return two ups tracking numbers when given string with two ups tracking numbers" do
33
+ s = TrackingNumber.search("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 1Z5R89390357567127 nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute 1Z879E930346834440 dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
34
+ assert_equal 2, s.size
35
+ assert_equal [TrackingNumber::UPS, TrackingNumber::UPS], s.collect { |t| t.class }
36
+ end
37
+
29
38
  should "return tracking numbers without trailing whitespace" do
30
39
  s = TrackingNumber.search("hello 1Z879E930346834440\nbye")
31
40
  assert_equal 1, s.size
32
41
  assert_equal "1Z879E930346834440", s.first.tracking_number
33
42
  end
43
+
44
+ should "return tracking numbers entered as lowercase" do
45
+ s = TrackingNumber.search("hello 1z879E930346834440 bye")
46
+ assert_equal 1, s.size
47
+ assert_equal "1Z879E930346834440", s.first.tracking_number
48
+ end
49
+ end
50
+
51
+ context "tracking number additional data for ups" do
52
+ tracking_number = TrackingNumber.new("1Z5R89390357567127")
53
+
54
+ should "report correct courier name" do
55
+ assert_equal "UPS", tracking_number.courier_name
56
+ end
57
+
58
+ should "report correct service" do
59
+ assert_equal "UPS United States Ground", tracking_number.service_type
60
+ end
61
+
62
+ should "report correct shipper_id" do
63
+ assert_equal "5R8939", tracking_number.shipper_id
64
+ end
65
+
66
+ should "report correct no destination" do
67
+ assert_nil tracking_number.destination_zip
68
+ end
69
+
70
+ should "report correct no package info" do
71
+ assert_nil tracking_number.package_type
72
+ end
73
+
74
+ should "have valid tracking url" do
75
+ assert tracking_number.tracking_url, "Tracking url should not be blank"
76
+ assert tracking_number.tracking_url.include?(tracking_number.tracking_number), "Should include tracking number in the url"
77
+ end
78
+ end
79
+
80
+ context "tracking number additional data for s10" do
81
+ tracking_number = TrackingNumber.new("RB123456785GB")
82
+
83
+ should "report correct courier name" do
84
+ assert_equal "Royal Mail Group plc", tracking_number.courier_name
85
+ end
86
+
87
+ should "report correct service" do
88
+ assert_equal "Letter Post Registered", tracking_number.service_type
89
+ end
90
+
91
+ should "report correct shipper_id" do
92
+ assert_nil tracking_number.shipper_id
93
+ end
94
+
95
+ should "report correct no destination" do
96
+ assert_nil tracking_number.destination_zip
97
+ end
98
+
99
+ should "report correct no package info" do
100
+ assert_nil tracking_number.package_type
101
+ end
102
+ end
103
+
104
+ context "tracking number additional data for USPS 20" do
105
+ tracking_number = TrackingNumber.new("0307 1790 0005 2348 3741")
106
+
107
+ should "report correct courier name" do
108
+ assert_equal "United States Postal Service", tracking_number.courier_name
109
+ end
110
+
111
+ should "report correct service" do
112
+ assert_equal "Delivery Confirmation", tracking_number.service_type
113
+ end
114
+
115
+ should "report correct shipper_id" do
116
+ assert_equal "071790000", tracking_number.shipper_id
117
+ end
118
+
119
+ should "report correct no destination" do
120
+ assert_nil tracking_number.destination_zip
121
+ end
122
+
123
+ should "report correct no package info" do
124
+ assert_nil tracking_number.package_type
125
+ end
126
+
127
+ should "have valid tracking url" do
128
+ assert tracking_number.tracking_url, "Tracking url should not be blank"
129
+ assert tracking_number.tracking_url.include?(tracking_number.tracking_number), "Should include tracking number in the url"
130
+ end
131
+ end
132
+
133
+ context "tracking number additional data for USPS 34v2" do
134
+ tracking_number = TrackingNumber.new("4201002334249200190132607600833457")
135
+
136
+ should "report correct courier name" do
137
+ assert_equal "United States Postal Service", tracking_number.courier_name
138
+ end
139
+
140
+ should "report correct service" do
141
+ assert_nil tracking_number.service_type
142
+ end
143
+
144
+ should "report correct shipper_id" do
145
+ assert_equal "901326076", tracking_number.shipper_id
146
+ end
147
+
148
+ should "report correct no destination" do
149
+ assert_equal "10023", tracking_number.destination_zip
150
+ end
151
+
152
+ should "report correct no package info" do
153
+ assert_nil tracking_number.package_type
154
+ end
155
+
156
+ should "report no partnership" do
157
+ assert_equal false, tracking_number.partnership?
158
+ end
159
+
160
+ should "report no partners" do
161
+ assert_nil tracking_number.partners
162
+ end
163
+
164
+ should "report as shipper and carrier" do
165
+ assert_equal true, tracking_number.shipper?
166
+ assert_equal true, tracking_number.carrier?
167
+ end
168
+
169
+ should "have valid tracking url" do
170
+ assert tracking_number.tracking_url, "Tracking url should not be blank"
171
+ assert tracking_number.tracking_url.include?(tracking_number.tracking_number), "Should include tracking number in the url"
172
+ end
173
+ end
174
+
175
+ context "tracking number additional data for USPS Parcel Select" do
176
+ tracking_number = TrackingNumber.new("420 11213 92 6129098349792366623 8")
177
+
178
+ should "report correct courier name" do
179
+ assert_equal "United States Postal Service", tracking_number.courier_name
180
+ end
181
+
182
+ should "report correct courier code" do
183
+ assert_equal :usps, tracking_number.courier_code
184
+ end
185
+
186
+ should "report correct service type" do
187
+ assert_equal "Parcel Select", tracking_number.service_type
188
+ end
189
+
190
+ should "report no partnership" do
191
+ assert_equal false, tracking_number.partnership?
192
+ end
193
+
194
+ should "report as shipper and carrier" do
195
+ assert_equal true, tracking_number.shipper?
196
+ assert_equal true, tracking_number.carrier?
197
+ end
198
+
199
+ should "report no partners" do
200
+ assert_nil tracking_number.partners
201
+ end
202
+ end
203
+
204
+ context "searching for numbers" do
205
+ parcel_select_number = "420 11213 92 6129098349792366623 8"
206
+ single_number = "92001903060085300042901077"
207
+
208
+ search_string = ["number that matches two services", parcel_select_number, " number that matches only one: ", single_number, "let's see if that does it"].join(' ')
209
+
210
+ should "match only carriers by default" do
211
+ matches = TrackingNumber.search(search_string)
212
+ assert_equal 2, matches.size
213
+ assert_equal [true, true], matches.collect { |t| t.carrier? }
214
+ end
215
+
216
+ should "match all if specified" do
217
+ matches = TrackingNumber.search(search_string, match: :all)
218
+ assert_equal 2, matches.size
219
+ end
220
+
221
+ should "match only shippers if specified" do
222
+ matches = TrackingNumber.search(search_string, match: :shipper)
223
+ assert_equal 2, matches.size
224
+ end
34
225
  end
35
226
  end
@@ -1,32 +1,63 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "tracking_number/version"
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'tracking_number/version'
4
6
 
5
7
  Gem::Specification.new do |s|
6
- s.name = %q{tracking_number}
8
+ s.name = 'tracking_number'
7
9
  s.version = TrackingNumber::VERSION
8
10
  s.platform = Gem::Platform::RUBY
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jeff Keen"]
12
- s.date = %q{2017-02-21}
13
- s.description = %q{This gem identifies valid tracking numbers and the service they're associated with. It can also tell you a little bit about the package purely from the number—there's quite a bit of info tucked away into those numbers, it turns out.}
14
- s.email = %q{jeff@keen.me}
11
+ s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
12
+ s.required_ruby_version = Gem::Requirement.new('>= 3.0.0')
13
+ s.authors = ['Jeff Keen']
14
+ s.description = "This gem identifies valid tracking numbers and the service they're associated with. It can also tell you a little bit about the package purely from the number—there's quite a bit of info tucked away into those numbers, it turns out."
15
+ s.email = 'jeff@keen.me'
15
16
  s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
+ 'LICENSE.txt'
17
18
  ]
18
- s.files = `git ls-files`.split("\n")
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+
22
+ gem_dir = "#{File.expand_path(File.join(__FILE__, '..'))}/"
23
+ `git submodule --quiet foreach pwd`.split($OUTPUT_RECORD_SEPARATOR).each do |submodule_path|
24
+ Dir.chdir(submodule_path.chomp) do
25
+ submodule_relative_path = submodule_path.sub gem_dir, ''
26
+
27
+ # issue git ls-files in submodule's directory
28
+ submodule_files = `git ls-files -- couriers/*`.split($OUTPUT_RECORD_SEPARATOR)
29
+
30
+ # prepend the submodule path to create absolute file paths
31
+ submodule_files_fullpaths = submodule_files.map do |filename|
32
+ "#{submodule_path}/#{filename}"
33
+ end
34
+
35
+ # remove leading path parts to get paths relative to the gem's root dir
36
+ # (this assumes, that the gemspec resides in the gem's root dir)
37
+ submodule_files_paths = submodule_files_fullpaths.map do |filename|
38
+ filename.gsub gem_dir, ''
39
+ end
40
+
41
+ # add relative paths to gem.files
42
+ s.files += submodule_files_paths
43
+ end
44
+ end
45
+
19
46
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
- s.require_paths = ["lib"]
22
- s.homepage = %q{http://github.com/jkeen/tracking_number}
23
- s.licenses = ["MIT"]
24
- s.rubygems_version = %q{1.7.2}
25
- s.summary = %q{Identifies valid tracking numbers}
26
-
27
- s.add_development_dependency('rake', '~> 10.4.2')
47
+
48
+ s.require_paths = ['lib']
49
+ s.homepage = 'http://github.com/jkeen/tracking_number'
50
+ s.licenses = ['MIT']
51
+ s.summary = 'Identifies valid tracking numbers'
52
+
53
+ s.add_runtime_dependency('activesupport', '>= 4.2.5')
54
+ s.add_runtime_dependency('json', '>= 1.8.3')
55
+ s.add_development_dependency('activemodel', '> 4.2.5.1')
56
+ s.add_development_dependency('irb')
57
+ s.add_development_dependency('minitest', '~> 5.5')
58
+ s.add_development_dependency('minitest-reporters', '~> 1.1')
59
+ s.add_development_dependency('rake', '~> 13.0')
28
60
  s.add_development_dependency('shoulda')
29
61
  s.add_development_dependency('simplecov')
30
- s.add_development_dependency('activemodel', '~> 4.2.5.1')
31
- s.add_development_dependency('minitest','~> 5.5')
62
+ s.add_development_dependency('terminal-table')
32
63
  end