shipwire 0.0.5 → 2.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.
- checksums.yaml +4 -4
- data/.gitignore +3 -3
- data/.rspec +2 -0
- data/.ruby-version +1 -1
- data/Gemfile +0 -1
- data/README.md +53 -29
- data/Rakefile +2 -3
- data/lib/generators/shipwire/install/install_generator.rb +13 -0
- data/lib/generators/shipwire/install/templates/config/initializers/shipwire.rb +27 -0
- data/lib/shipwire.rb +26 -33
- data/lib/shipwire/api.rb +7 -0
- data/lib/shipwire/configuration.rb +13 -3
- data/lib/shipwire/orders.rb +39 -0
- data/lib/shipwire/param_converter.rb +39 -0
- data/lib/shipwire/products.rb +53 -0
- data/lib/shipwire/products/base.rb +9 -0
- data/lib/shipwire/products/insert.rb +9 -0
- data/lib/shipwire/products/kit.rb +9 -0
- data/lib/shipwire/products/virtual_kit.rb +9 -0
- data/lib/shipwire/rate.rb +7 -0
- data/lib/shipwire/receivings.rb +50 -0
- data/lib/shipwire/request.rb +73 -0
- data/lib/shipwire/response.rb +79 -0
- data/lib/shipwire/returns.rb +35 -0
- data/lib/shipwire/secret.rb +20 -0
- data/lib/shipwire/stock.rb +7 -0
- data/lib/shipwire/utility.rb +22 -0
- data/lib/shipwire/version.rb +1 -1
- data/lib/shipwire/webhooks.rb +24 -0
- data/shipwire.gemspec +12 -15
- data/spec/features/access_spec.rb +61 -0
- data/spec/features/orders_spec.rb +280 -0
- data/spec/features/product_types_spec.rb +219 -0
- data/spec/features/products_spec.rb +282 -0
- data/spec/features/rate_spec.rb +50 -0
- data/spec/features/receivings_spec.rb +333 -0
- data/spec/features/returns_spec.rb +239 -0
- data/spec/features/secret_spec.rb +57 -0
- data/spec/features/stock_spec.rb +41 -0
- data/spec/features/webhooks_spec.rb +106 -0
- data/spec/spec_helper.rb +33 -12
- data/spec/support/shipwire.rb +10 -0
- data/spec/support/vcr.rb +9 -0
- data/spec/support/vcr_cassettes/credentials_incorrect.yml +47 -0
- data/spec/support/vcr_cassettes/credentials_missing.yml +47 -0
- data/spec/support/vcr_cassettes/order.yml +48 -0
- data/spec/support/vcr_cassettes/order_cancel.yml +54 -0
- data/spec/support/vcr_cassettes/order_cancel_fail.yml +47 -0
- data/spec/support/vcr_cassettes/order_find.yml +45 -0
- data/spec/support/vcr_cassettes/order_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_find_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/order_holds.yml +50 -0
- data/spec/support/vcr_cassettes/order_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_holds_with_params.yml +50 -0
- data/spec/support/vcr_cassettes/order_items.yml +45 -0
- data/spec/support/vcr_cassettes/order_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_returns.yml +47 -0
- data/spec/support/vcr_cassettes/order_returns_fail.yml +47 -0
- data/spec/support/vcr_cassettes/order_trackings.yml +45 -0
- data/spec/support/vcr_cassettes/order_trackings_fail.yml +45 -0
- data/spec/support/vcr_cassettes/order_update.yml +48 -0
- data/spec/support/vcr_cassettes/order_update_fail.yml +50 -0
- data/spec/support/vcr_cassettes/order_update_with_params.yml +48 -0
- data/spec/support/vcr_cassettes/order_with_warnings.yml +96 -0
- data/spec/support/vcr_cassettes/orders_list.yml +47 -0
- data/spec/support/vcr_cassettes/orders_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/product.yml +48 -0
- data/spec/support/vcr_cassettes/product_base.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_base_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_base_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_create_fail_with_invalid_classification.yml +51 -0
- data/spec/support/vcr_cassettes/product_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert.yml +50 -0
- data/spec/support/vcr_cassettes/product_insert_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_insert_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_insert_update.yml +49 -0
- data/spec/support/vcr_cassettes/product_insert_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_kit_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_kit_update_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_multiple_create_fail.yml +102 -0
- data/spec/support/vcr_cassettes/product_multiple_create_success.yml +100 -0
- data/spec/support/vcr_cassettes/product_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_update.yml +48 -0
- data/spec/support/vcr_cassettes/product_update_fail.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_find.yml +48 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_retire_id.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_retire_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_update.yml +49 -0
- data/spec/support/vcr_cassettes/product_virtual_kit_update_fail.yml +47 -0
- data/spec/support/vcr_cassettes/products_base_list.yml +49 -0
- data/spec/support/vcr_cassettes/products_base_list_with_params.yml +49 -0
- data/spec/support/vcr_cassettes/products_insert_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_insert_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/products_kit_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_kit_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/products_list.yml +49 -0
- data/spec/support/vcr_cassettes/products_list_with_params.yml +49 -0
- data/spec/support/vcr_cassettes/products_virtual_kit_list.yml +47 -0
- data/spec/support/vcr_cassettes/products_virtual_kit_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/rate_find.yml +53 -0
- data/spec/support/vcr_cassettes/rate_find_fail.yml +50 -0
- data/spec/support/vcr_cassettes/receiving.yml +53 -0
- data/spec/support/vcr_cassettes/receiving_cancel.yml +98 -0
- data/spec/support/vcr_cassettes/receiving_cancel_label.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_cancel_label_nonexistent.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_find.yml +46 -0
- data/spec/support/vcr_cassettes/receiving_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_find_with_params.yml +48 -0
- data/spec/support/vcr_cassettes/receiving_holds.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_holds_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/receiving_instructions_recipients.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_instructions_recipients_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_items.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_shipments.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_shipments_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_tracking.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_tracking_fail.yml +45 -0
- data/spec/support/vcr_cassettes/receiving_update.yml +53 -0
- data/spec/support/vcr_cassettes/receiving_update_fail.yml +49 -0
- data/spec/support/vcr_cassettes/receiving_update_with_params.yml +55 -0
- data/spec/support/vcr_cassettes/receivings_list.yml +53 -0
- data/spec/support/vcr_cassettes/receivings_list_with_params.yml +46 -0
- data/spec/support/vcr_cassettes/return.yml +98 -0
- data/spec/support/vcr_cassettes/return_cancel.yml +55 -0
- data/spec/support/vcr_cassettes/return_cancel_fail.yml +47 -0
- data/spec/support/vcr_cassettes/return_find.yml +47 -0
- data/spec/support/vcr_cassettes/return_find_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_find_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/return_holds.yml +45 -0
- data/spec/support/vcr_cassettes/return_holds_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_holds_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/return_items.yml +45 -0
- data/spec/support/vcr_cassettes/return_items_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_labels.yml +45 -0
- data/spec/support/vcr_cassettes/return_labels_fail.yml +45 -0
- data/spec/support/vcr_cassettes/return_trackings.yml +45 -0
- data/spec/support/vcr_cassettes/return_trackings_fail.yml +45 -0
- data/spec/support/vcr_cassettes/returns_list.yml +47 -0
- data/spec/support/vcr_cassettes/returns_list_with_params.yml +47 -0
- data/spec/support/vcr_cassettes/secret.yml +47 -0
- data/spec/support/vcr_cassettes/secret_find.yml +45 -0
- data/spec/support/vcr_cassettes/secret_find_fail.yml +43 -0
- data/spec/support/vcr_cassettes/secret_list.yml +45 -0
- data/spec/support/vcr_cassettes/secret_remove.yml +45 -0
- data/spec/support/vcr_cassettes/stock_with_params.yml +45 -0
- data/spec/support/vcr_cassettes/stock_with_params_no_sku.yml +45 -0
- data/spec/support/vcr_cassettes/stock_without_params.yml +45 -0
- data/spec/support/vcr_cassettes/webhook.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_create_insecure.yml +50 -0
- data/spec/support/vcr_cassettes/webhooks_find.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_find_fail.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_list.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_remove.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_update.yml +47 -0
- data/spec/support/vcr_cassettes/webhooks_update_fail.yml +49 -0
- data/spec/unit/shipwire/response_spec.rb +46 -0
- metadata +354 -80
- data/.env +0 -4
- data/.env.example +0 -4
- data/Gemfile.lock +0 -69
- data/lib/shipwire/fulfillment.rb +0 -100
- data/lib/shipwire/inventory.rb +0 -72
- data/lib/shipwire/service_request.rb +0 -42
- data/lib/shipwire/shipping_rate.rb +0 -121
- data/lib/shipwire/tracking.rb +0 -101
- data/spec/shipwire/fulfillment_spec.rb +0 -36
- data/spec/shipwire/inventory_spec.rb +0 -25
- data/spec/shipwire/shipping_rate_spec.rb +0 -62
- data/spec/shipwire/tracking_spec.rb +0 -20
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
class Receivings < Api
|
|
3
|
+
def list(params = {})
|
|
4
|
+
request(:get, 'receivings', params: params)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create(body)
|
|
8
|
+
request(:post, 'receivings', body: body)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find(id, params = {})
|
|
12
|
+
request(:get, "receivings/#{id}", params: params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def update(id, body, params = {})
|
|
16
|
+
request(:put, "receivings/#{id}", body: body, params: params)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def cancel(id)
|
|
20
|
+
request(:post, "receivings/#{id}/cancel")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def labels_cancel(id)
|
|
24
|
+
request(:post, "receivings/#{id}/labels/cancel")
|
|
25
|
+
end
|
|
26
|
+
alias_method :label_cancel, :labels_cancel
|
|
27
|
+
|
|
28
|
+
def holds(id, params = {})
|
|
29
|
+
request(:get, "receivings/#{id}/holds", params: params)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def instructions_recipients(id)
|
|
33
|
+
request(:get, "receivings/#{id}/instructionsRecipients")
|
|
34
|
+
end
|
|
35
|
+
alias_method :instructions, :instructions_recipients
|
|
36
|
+
alias_method :recipients, :instructions_recipients
|
|
37
|
+
|
|
38
|
+
def items(id)
|
|
39
|
+
request(:get, "receivings/#{id}/items")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def shipments(id)
|
|
43
|
+
request(:get, "receivings/#{id}/shipments")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def trackings(id)
|
|
47
|
+
request(:get, "receivings/#{id}/trackings")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
class Request
|
|
3
|
+
def self.send(**args)
|
|
4
|
+
new(**args).send
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
API_VERSION = 3
|
|
8
|
+
|
|
9
|
+
attr_reader :method, :path, :params, :body
|
|
10
|
+
|
|
11
|
+
def initialize(method: :get, path: '', params: {}, body: {})
|
|
12
|
+
@method = method
|
|
13
|
+
@path = path
|
|
14
|
+
@params = params
|
|
15
|
+
@body = body
|
|
16
|
+
|
|
17
|
+
@connection = build_connection
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def send
|
|
21
|
+
Response.new(underlying_response: make_request)
|
|
22
|
+
rescue Faraday::ConnectionFailed
|
|
23
|
+
Response.new(error_summary: 'Unable to connect to Shipwire')
|
|
24
|
+
rescue Faraday::TimeoutError
|
|
25
|
+
Response.new(error_summary: 'Shipwire connection timeout')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def build_connection
|
|
31
|
+
Faraday.new(url: base_url) do |connection|
|
|
32
|
+
connection.request(:basic_auth, username, password)
|
|
33
|
+
connection.request(:json)
|
|
34
|
+
connection.request(:url_encoded)
|
|
35
|
+
|
|
36
|
+
if Shipwire.configuration.logger
|
|
37
|
+
connection.response(:logger)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
connection.adapter(Faraday.default_adapter)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def make_request
|
|
45
|
+
@connection.public_send(@method, full_path) do |request|
|
|
46
|
+
request.params = params unless params.empty?
|
|
47
|
+
request.options.open_timeout = Shipwire.configuration.open_timeout
|
|
48
|
+
request.options.timeout = Shipwire.configuration.timeout
|
|
49
|
+
request.body = body unless body.empty?
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def base_url
|
|
54
|
+
Shipwire.configuration.endpoint.chomp("/")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def full_path
|
|
58
|
+
"/api/v#{API_VERSION}/#{@path}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def params
|
|
62
|
+
Utility.camel_case(@params)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def username
|
|
66
|
+
Shipwire.configuration.username
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def password
|
|
70
|
+
Shipwire.configuration.password
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
module Shipwire
|
|
4
|
+
class Response
|
|
5
|
+
attr_reader :error_summary, :validation_errors, :warnings, :body
|
|
6
|
+
|
|
7
|
+
def initialize(underlying_response: nil, error_summary: nil)
|
|
8
|
+
@error_summary = error_summary
|
|
9
|
+
|
|
10
|
+
@validation_errors = []
|
|
11
|
+
@warnings = []
|
|
12
|
+
|
|
13
|
+
if underlying_response
|
|
14
|
+
load_response(underlying_response)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def ok?
|
|
19
|
+
!has_error_summary? && !has_validation_errors?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def has_error_summary?
|
|
23
|
+
!error_summary.nil?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def has_validation_errors?
|
|
27
|
+
!validation_errors.empty?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def has_warnings?
|
|
31
|
+
!warnings.empty?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def error_report
|
|
35
|
+
report_lines = []
|
|
36
|
+
|
|
37
|
+
if has_error_summary?
|
|
38
|
+
report_lines << 'Error summary:'
|
|
39
|
+
report_lines << error_summary
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if has_validation_errors?
|
|
43
|
+
report_lines << 'Validation errors:'
|
|
44
|
+
report_lines << validation_errors.pretty_inspect.rstrip
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
report_lines.join("\n")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def load_response(response)
|
|
53
|
+
@body = JSON.parse(response.body)
|
|
54
|
+
@warnings = parse_warnings_from(body)
|
|
55
|
+
@error_summary = parse_error_summary_from(body)
|
|
56
|
+
@validation_errors = parse_validation_errors_from(body)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Errors because of a 40x or 50x error
|
|
60
|
+
def parse_error_summary_from(body)
|
|
61
|
+
if (400..599).include?(body['status']) && body.key?('message')
|
|
62
|
+
body['message']
|
|
63
|
+
else
|
|
64
|
+
nil
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Errors specified in Shipwire response body
|
|
69
|
+
def parse_validation_errors_from(body)
|
|
70
|
+
body.fetch('errors', {})
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def parse_warnings_from(body)
|
|
74
|
+
body.fetch('warnings', []).map do |warning|
|
|
75
|
+
warning.fetch('message')
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
class Returns < Api
|
|
3
|
+
def list(params = {})
|
|
4
|
+
request(:get, 'returns', params: params)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create(body)
|
|
8
|
+
request(:post, 'returns', body: body)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find(id, params = {})
|
|
12
|
+
request(:get, "returns/#{id}", params: params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def cancel(id)
|
|
16
|
+
request(:post, "returns/#{id}/cancel")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def holds(id, params = {})
|
|
20
|
+
request(:get, "returns/#{id}/holds", params: params)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def items(id)
|
|
24
|
+
request(:get, "returns/#{id}/items")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def trackings(id)
|
|
28
|
+
request(:get, "returns/#{id}/trackings")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def labels(id)
|
|
32
|
+
request(:get, "returns/#{id}/labels")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
class Secret < Api
|
|
3
|
+
def list
|
|
4
|
+
request(:get, 'secret')
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create
|
|
8
|
+
request(:post, 'secret')
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find(id)
|
|
12
|
+
request(:get, "secret/#{id}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def remove(id)
|
|
16
|
+
request(:delete, "secret/#{id}")
|
|
17
|
+
end
|
|
18
|
+
alias_method :delete, :remove
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
module Utility
|
|
3
|
+
def self.camel_case(options)
|
|
4
|
+
ParamConverter.new(options).to_h
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def self.split_to_integers(str, separator = ",")
|
|
8
|
+
str.to_s.split(separator).map(&:to_i)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.camelize(term, first_letter = :upper)
|
|
12
|
+
terms = term.split('_')
|
|
13
|
+
|
|
14
|
+
case first_letter
|
|
15
|
+
when :upper
|
|
16
|
+
terms.map(&:capitalize!).join
|
|
17
|
+
when :lower
|
|
18
|
+
([terms.first] + terms.drop(1).map(&:capitalize!)).join
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
data/lib/shipwire/version.rb
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Shipwire
|
|
2
|
+
class Webhooks < Api
|
|
3
|
+
def list
|
|
4
|
+
request(:get, 'webhooks')
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def create(body)
|
|
8
|
+
request(:post, 'webhooks', body: body)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def find(id)
|
|
12
|
+
request(:get, "webhooks/#{id}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def update(id, body)
|
|
16
|
+
request(:put, "webhooks/#{id}", body: body)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def remove(id)
|
|
20
|
+
request(:delete, "webhooks/#{id}")
|
|
21
|
+
end
|
|
22
|
+
alias_method :delete, :remove
|
|
23
|
+
end
|
|
24
|
+
end
|
data/shipwire.gemspec
CHANGED
|
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.version = Shipwire::VERSION
|
|
9
9
|
spec.authors = ["Bill Rowell"]
|
|
10
10
|
spec.email = ["billr578@gmail.com"]
|
|
11
|
-
spec.summary =
|
|
12
|
-
spec.description =
|
|
11
|
+
spec.summary = 'Exchange data with Shipwire fullfillment'
|
|
12
|
+
spec.description = 'Provides a wrapper for API calls to Shipwire'
|
|
13
13
|
spec.homepage = "https://github.com/morbid-enterprises/shipwire"
|
|
14
14
|
spec.license = "MIT"
|
|
15
15
|
|
|
@@ -18,18 +18,15 @@ Gem::Specification.new do |spec|
|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
19
|
spec.require_paths = ["lib"]
|
|
20
20
|
|
|
21
|
-
spec.add_dependency "
|
|
22
|
-
spec.add_dependency "
|
|
21
|
+
spec.add_dependency "deep_merge", "~> 1.0.0"
|
|
22
|
+
spec.add_dependency "faraday", "~> 0.9.1"
|
|
23
|
+
spec.add_dependency "faraday_middleware", "~> 0.10.0"
|
|
24
|
+
spec.add_dependency "recursive-open-struct", "~> 0.6.4"
|
|
23
25
|
|
|
24
|
-
spec.add_development_dependency "
|
|
25
|
-
spec.add_development_dependency "
|
|
26
|
-
spec.add_development_dependency "
|
|
27
|
-
spec.add_development_dependency "
|
|
28
|
-
spec.add_development_dependency "
|
|
29
|
-
|
|
30
|
-
spec.add_development_dependency "dotenv"
|
|
31
|
-
|
|
32
|
-
spec.add_development_dependency "webmock"
|
|
33
|
-
spec.add_development_dependency "vcr"
|
|
34
|
-
spec.add_development_dependency "pry"
|
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.2.0"
|
|
27
|
+
spec.add_development_dependency "ffaker", "~> 2.0.0"
|
|
28
|
+
spec.add_development_dependency "simplecov", "~> 0.10.0"
|
|
29
|
+
spec.add_development_dependency "vcr", "~> 2.9.3"
|
|
30
|
+
spec.add_development_dependency "webmock", "~> 1.21.0"
|
|
31
|
+
spec.add_development_dependency "pry", "~> 0.10.1"
|
|
35
32
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe "General access", type: :feature, vcr: true do
|
|
4
|
+
describe 'with missing credentials' do
|
|
5
|
+
before do
|
|
6
|
+
Shipwire.configuration.username = nil
|
|
7
|
+
Shipwire.configuration.password = nil
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "raises an error" do
|
|
11
|
+
VCR.use_cassette("credentials_missing") do
|
|
12
|
+
response = Shipwire::Secret.new.list
|
|
13
|
+
|
|
14
|
+
expect(response.ok?).to be_falsy
|
|
15
|
+
expect(response.error_summary).to eq(
|
|
16
|
+
'Please include a valid Authorization header (Basic)'
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "with incorrect credentials" do
|
|
23
|
+
before do
|
|
24
|
+
Shipwire.configuration.username = 'fake@email.com'
|
|
25
|
+
Shipwire.configuration.password = 'fake-password'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "raises an error" do
|
|
29
|
+
VCR.use_cassette("credentials_incorrect") do
|
|
30
|
+
response = Shipwire::Secret.new.list
|
|
31
|
+
|
|
32
|
+
expect(response.ok?).to be_falsy
|
|
33
|
+
expect(response.error_summary).to eq(
|
|
34
|
+
'Please include a valid Authorization header (Basic)'
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe "with incorrect base endpoint" do
|
|
41
|
+
before { Shipwire.configuration.endpoint = 'https://api.fake.shipwire.com' }
|
|
42
|
+
|
|
43
|
+
it "raises an error" do
|
|
44
|
+
response = Shipwire::Secret.new.list
|
|
45
|
+
|
|
46
|
+
expect(response.ok?).to be_falsy
|
|
47
|
+
expect(response.error_summary).to eq 'Unable to connect to Shipwire'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "with API timeout" do
|
|
52
|
+
before { Shipwire.configuration.timeout = 0.0001 }
|
|
53
|
+
|
|
54
|
+
it "raises an error" do
|
|
55
|
+
response = Shipwire::Secret.new.list
|
|
56
|
+
|
|
57
|
+
expect(response.ok?).to be_falsy
|
|
58
|
+
expect(response.error_summary).to eq 'Shipwire connection timeout'
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|