shipengine_ruby 0.0.1

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +305 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +9 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +111 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +14 -0
  10. data/Rakefile +8 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/lib/shipengine/client.rb +71 -0
  14. data/lib/shipengine/configuration.rb +26 -0
  15. data/lib/shipengine/constants.rb +203 -0
  16. data/lib/shipengine/domains/addresses.rb +33 -0
  17. data/lib/shipengine/domains/batches.rb +103 -0
  18. data/lib/shipengine/domains/carriers.rb +67 -0
  19. data/lib/shipengine/domains/carriers_accounts.rb +49 -0
  20. data/lib/shipengine/domains/labels.rb +94 -0
  21. data/lib/shipengine/domains/manifests.rb +49 -0
  22. data/lib/shipengine/domains/package_pickups.rb +49 -0
  23. data/lib/shipengine/domains/package_types.rb +58 -0
  24. data/lib/shipengine/domains/rates.rb +49 -0
  25. data/lib/shipengine/domains/service_points.rb +31 -0
  26. data/lib/shipengine/domains/shipments.rb +103 -0
  27. data/lib/shipengine/domains/shipsurance.rb +49 -0
  28. data/lib/shipengine/domains/tags.rb +49 -0
  29. data/lib/shipengine/domains/tokens.rb +22 -0
  30. data/lib/shipengine/domains/tracking.rb +40 -0
  31. data/lib/shipengine/domains/warehouses.rb +58 -0
  32. data/lib/shipengine/domains/webhooks.rb +58 -0
  33. data/lib/shipengine/domains.rb +19 -0
  34. data/lib/shipengine/enums/address_residential_indicator_types.rb +20 -0
  35. data/lib/shipengine/enums/address_status.rb +34 -0
  36. data/lib/shipengine/enums/batch_status.rb +34 -0
  37. data/lib/shipengine/enums/carriers_names.rb +91 -0
  38. data/lib/shipengine/enums/label_status.rb +22 -0
  39. data/lib/shipengine/enums/message_types.rb +30 -0
  40. data/lib/shipengine/enums/validate_address_types.rb +19 -0
  41. data/lib/shipengine/enums/webhooks_types.rb +52 -0
  42. data/lib/shipengine/enums.rb +9 -0
  43. data/lib/shipengine/errors/error_code.rb +224 -0
  44. data/lib/shipengine/errors/error_source.rb +39 -0
  45. data/lib/shipengine/errors/error_type.rb +49 -0
  46. data/lib/shipengine/exceptions.rb +79 -0
  47. data/lib/shipengine/faraday/raise_http_exception.rb +83 -0
  48. data/lib/shipengine/utils/validate.rb +102 -0
  49. data/lib/shipengine/utils.rb +3 -0
  50. data/lib/shipengine/version.rb +7 -0
  51. data/lib/shipengine.rb +26 -0
  52. data/shipengine.gemspec +41 -0
  53. metadata +249 -0
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "faraday"
4
+
5
+ module ShipEngine
6
+ module FaradayMiddleware
7
+ class RaiseHttpException < Faraday::Middleware
8
+ def call(env)
9
+ @app.call(env).on_complete do |response|
10
+ status_code = response[:status].to_i
11
+ if [400, 401, 404, 500, 502, 503, 504].include?(status_code)
12
+ raise ShipEngine::Exceptions::ShipEngineError.new(
13
+ message: error_body(response[:body]),
14
+ source: error_source(response[:body]),
15
+ type: error_type(response[:body]),
16
+ code: error_code(response[:body]),
17
+ url: response[:url].to_s
18
+ )
19
+ elsif [429].include?(status_code)
20
+ raise ShipEngine::Exceptions::RateLimitError.new(
21
+ retries: env.request_headers["Retries"].to_i,
22
+ source: error_source(response[:body])
23
+ )
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def error_message_400(response)
31
+ "#{response[:method].to_s.upcase} #{response[:url]}: #{response[:status]}#{error_body(response[:body])}"
32
+ end
33
+
34
+ def error_body(body)
35
+ if !body.nil? && !body.empty? && body.is_a?(String)
36
+ body = JSON.parse(body)
37
+ end
38
+
39
+ if body.nil?
40
+ nil
41
+ elsif body["errors"] && !body["errors"].empty?
42
+ body["errors"][0]["message"]
43
+ end
44
+ end
45
+
46
+ def error_source(body)
47
+ if !body.nil? && !body.empty? && body.is_a?(String)
48
+ body = JSON.parse(body)
49
+ end
50
+
51
+ if body.nil?
52
+ nil
53
+ elsif body["errors"] && !body["errors"].empty?
54
+ body["errors"][0]["error_source"]
55
+ end
56
+ end
57
+
58
+ def error_type(body)
59
+ if !body.nil? && !body.empty? && body.is_a?(String)
60
+ body = JSON.parse(body)
61
+ end
62
+
63
+ if body.nil?
64
+ nil
65
+ elsif body["errors"] && !body["errors"].empty?
66
+ body["errors"][0]["error_type"]
67
+ end
68
+ end
69
+
70
+ def error_code(body)
71
+ if !body.nil? && !body.empty? && body.is_a?(String)
72
+ body = JSON.parse(body)
73
+ end
74
+
75
+ if body.nil?
76
+ nil
77
+ elsif body["errors"] && !body["errors"].empty?
78
+ body["errors"][0]["error_code"]
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module Utils
5
+ module Validate
6
+ class << self
7
+ def not_nil(field, value)
8
+ return unless value.nil?
9
+
10
+ raise ShipEngine::Exceptions.required_error(field_name: field)
11
+ end
12
+
13
+ def not_nil_or_empty_str(field, value)
14
+ not_nil(field, value)
15
+ return unless value == ""
16
+
17
+ raise ShipEngine::Exceptions.required_error(field_name: field)
18
+ end
19
+
20
+ def str(field, value)
21
+ not_nil(field, value)
22
+ return if value.is_a?(String)
23
+
24
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be a String.")
25
+ end
26
+
27
+ def non_empty_str(field, value)
28
+ str(field, value)
29
+ return unless value.empty?
30
+
31
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} cannot be empty.")
32
+ end
33
+
34
+ def non_whitespace_str(field, value)
35
+ str(field, value)
36
+ return unless value.strip.empty?
37
+
38
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} cannot be all whitespace.")
39
+ end
40
+
41
+ def hash(field, value)
42
+ not_nil(field, value)
43
+ return if value.is_a?(Hash)
44
+
45
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be Hash.")
46
+ end
47
+
48
+ def bool(field, value)
49
+ not_nil(field, value)
50
+ return if [true, false].include?(value)
51
+
52
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be a Boolean.")
53
+ end
54
+
55
+ def number(field, value)
56
+ not_nil(field, value)
57
+ return if value.is_a?(Numeric)
58
+
59
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be Numeric.")
60
+ end
61
+
62
+ def int(field, value)
63
+ number(field, value)
64
+ return if value.to_i == value
65
+
66
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be a whole number.")
67
+ end
68
+
69
+ def non_neg_int(field, value)
70
+ int(field, value)
71
+ return if value >= 0
72
+
73
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be zero or greater.")
74
+ end
75
+
76
+ def positive_int(field, value)
77
+ int(field, value)
78
+ return if value.positive?
79
+
80
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be greater than zero.")
81
+ end
82
+
83
+ def array(field, value)
84
+ not_nil(field, value)
85
+
86
+ return if value.is_a?(Array)
87
+
88
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be an Array.")
89
+ end
90
+
91
+ def array_of_str(field, value)
92
+ array(field, value)
93
+ value.each do |v|
94
+ next if v.is_a?(String)
95
+
96
+ raise ShipEngine::Exceptions.invalid_field_value_error(message: "#{field} must be an Array of Strings.")
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shipengine/utils/validate"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShipEngine
4
+ module VERSION
5
+ VERSION = "0.0.1"
6
+ end
7
+ end
data/lib/shipengine.rb ADDED
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shipengine/client"
4
+ require "shipengine/configuration"
5
+ require "shipengine/constants"
6
+ require "shipengine/domains"
7
+ require "shipengine/enums"
8
+ require "shipengine/exceptions"
9
+ require "shipengine/utils"
10
+ require "shipengine/version"
11
+
12
+ module ShipEngine
13
+ # Configures global settings for ShipEngine
14
+ # ShipEngine.configure do |config|
15
+ # config.api_key = 'api-key'
16
+ # end
17
+ class << self
18
+ def configure
19
+ yield configs if block_given?
20
+ end
21
+
22
+ def configs
23
+ @configs ||= Configuration.new
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,41 @@
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 "shipengine/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "shipengine_ruby"
9
+ spec.summary = "Ruby SDK for ShipEngine"
10
+ spec.homepage = "https://github.com/MuhmdRaouf/shipengine"
11
+ spec.license = "MIT"
12
+
13
+ spec.email = ["mohammed@raouf.me"]
14
+ spec.authors = ["Mohammed Abdel Raouf"]
15
+
16
+ spec.version = ShipEngine::VERSION::VERSION
17
+ spec.platform = Gem::Platform::RUBY
18
+ spec.required_ruby_version = ">= 2.5"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ %x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_runtime_dependency("faraday", "~> 1.0")
30
+ spec.add_runtime_dependency("faraday_middleware", "~> 1.0")
31
+ spec.add_runtime_dependency("hashie", "~> 3.4")
32
+
33
+ spec.add_development_dependency("bundler", "~> 1.17")
34
+ spec.add_development_dependency("pry", "~> 0.14")
35
+ spec.add_development_dependency("rake", "~> 13.0")
36
+ spec.add_development_dependency("rspec", "~> 3.12")
37
+ spec.add_development_dependency("rubocop", "~> 1.28")
38
+ spec.add_development_dependency("rubocop-performance", "~> 1.13")
39
+ spec.add_development_dependency("rubocop-shopify", "~> 2.5")
40
+ spec.add_development_dependency("webmock", "~> 3.18")
41
+ end
metadata ADDED
@@ -0,0 +1,249 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shipengine_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mohammed Abdel Raouf
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-11-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: hashie
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.17'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.17'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '13.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '13.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.12'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.12'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.28'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.28'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.13'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.13'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-shopify
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.5'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.5'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.18'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.18'
167
+ description:
168
+ email:
169
+ - mohammed@raouf.me
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".gitignore"
175
+ - ".rspec"
176
+ - ".rubocop.yml"
177
+ - CODE_OF_CONDUCT.md
178
+ - Gemfile
179
+ - Gemfile.lock
180
+ - LICENSE.txt
181
+ - README.md
182
+ - Rakefile
183
+ - bin/console
184
+ - bin/setup
185
+ - lib/shipengine.rb
186
+ - lib/shipengine/client.rb
187
+ - lib/shipengine/configuration.rb
188
+ - lib/shipengine/constants.rb
189
+ - lib/shipengine/domains.rb
190
+ - lib/shipengine/domains/addresses.rb
191
+ - lib/shipengine/domains/batches.rb
192
+ - lib/shipengine/domains/carriers.rb
193
+ - lib/shipengine/domains/carriers_accounts.rb
194
+ - lib/shipengine/domains/labels.rb
195
+ - lib/shipengine/domains/manifests.rb
196
+ - lib/shipengine/domains/package_pickups.rb
197
+ - lib/shipengine/domains/package_types.rb
198
+ - lib/shipengine/domains/rates.rb
199
+ - lib/shipengine/domains/service_points.rb
200
+ - lib/shipengine/domains/shipments.rb
201
+ - lib/shipengine/domains/shipsurance.rb
202
+ - lib/shipengine/domains/tags.rb
203
+ - lib/shipengine/domains/tokens.rb
204
+ - lib/shipengine/domains/tracking.rb
205
+ - lib/shipengine/domains/warehouses.rb
206
+ - lib/shipengine/domains/webhooks.rb
207
+ - lib/shipengine/enums.rb
208
+ - lib/shipengine/enums/address_residential_indicator_types.rb
209
+ - lib/shipengine/enums/address_status.rb
210
+ - lib/shipengine/enums/batch_status.rb
211
+ - lib/shipengine/enums/carriers_names.rb
212
+ - lib/shipengine/enums/label_status.rb
213
+ - lib/shipengine/enums/message_types.rb
214
+ - lib/shipengine/enums/validate_address_types.rb
215
+ - lib/shipengine/enums/webhooks_types.rb
216
+ - lib/shipengine/errors/error_code.rb
217
+ - lib/shipengine/errors/error_source.rb
218
+ - lib/shipengine/errors/error_type.rb
219
+ - lib/shipengine/exceptions.rb
220
+ - lib/shipengine/faraday/raise_http_exception.rb
221
+ - lib/shipengine/utils.rb
222
+ - lib/shipengine/utils/validate.rb
223
+ - lib/shipengine/version.rb
224
+ - shipengine.gemspec
225
+ homepage: https://github.com/MuhmdRaouf/shipengine
226
+ licenses:
227
+ - MIT
228
+ metadata: {}
229
+ post_install_message:
230
+ rdoc_options: []
231
+ require_paths:
232
+ - lib
233
+ required_ruby_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '2.5'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ requirements: []
244
+ rubyforge_project:
245
+ rubygems_version: 2.7.6.2
246
+ signing_key:
247
+ specification_version: 4
248
+ summary: Ruby SDK for ShipEngine
249
+ test_files: []