easypost 3.0.1 → 3.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +9 -0
- data/CHANGELOG +18 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/easypost.gemspec +24 -20
- data/lib/easypost.rb +108 -118
- data/lib/easypost/address.rb +5 -5
- data/lib/easypost/batch.rb +7 -7
- data/lib/easypost/carrier_account.rb +1 -1
- data/lib/easypost/customs_info.rb +5 -0
- data/lib/easypost/customs_item.rb +5 -0
- data/lib/easypost/error.rb +16 -23
- data/lib/easypost/item.rb +1 -1
- data/lib/easypost/object.rb +7 -7
- data/lib/easypost/order.rb +6 -2
- data/lib/easypost/pickup.rb +7 -2
- data/lib/easypost/printer.rb +2 -2
- data/lib/easypost/report.rb +2 -2
- data/lib/easypost/resource.rb +7 -7
- data/lib/easypost/scan_form.rb +1 -1
- data/lib/easypost/shipment.rb +5 -5
- data/lib/easypost/tracker.rb +2 -2
- data/lib/easypost/user.rb +3 -5
- data/lib/easypost/util.rb +4 -44
- data/lib/easypost/webhook.rb +6 -3
- metadata +33 -60
- data/circle.yml +0 -3
- data/spec/address_spec.rb +0 -81
- data/spec/batch_spec.rb +0 -48
- data/spec/carrier_account_spec.rb +0 -121
- data/spec/insurance_spec.rb +0 -69
- data/spec/item_spec.rb +0 -105
- data/spec/order_spec.rb +0 -58
- data/spec/pickup_spec.rb +0 -83
- data/spec/report_spec.rb +0 -59
- data/spec/scan_form_spec.rb +0 -46
- data/spec/shipment_spec.rb +0 -144
- data/spec/spec_helper.rb +0 -10
- data/spec/support/constant.rb +0 -106
- data/spec/tracker_spec.rb +0 -94
- data/spec/user_spec.rb +0 -88
- data/spec/webhook_spec.rb +0 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c78ad14a13a665a9397b5d2ade56cdad38a669f0
|
4
|
+
data.tar.gz: e73234c20adee8cfcbc37f2b93fb1c5aa2a6843d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29e64cace8628e794a110868fbf3395fe560f1334ebe04218ccab054edf84f64631895196a09967ad06021b405162ee660eb29e86992847dfcfd45dc5b7b1549
|
7
|
+
data.tar.gz: f5e58cd6bdbe1cf61b3e272986470eb5beb7c9ba8738a4ebe05b727803c741a518ab5d64876ba2ff8bbb5ae2f331c8f6b977b4f53c1839336ebb72c3ef08337a
|
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 3.1.3 2020-06-26
|
2
|
+
|
3
|
+
* Fix bug causing Authorization header to be included in User-Agent header. All users must upgrade.
|
4
|
+
|
5
|
+
=== 3.1.2 2020-06-24
|
6
|
+
|
7
|
+
* Bad gem push. New version required.
|
8
|
+
|
9
|
+
=== 3.1.1 2020-06-23
|
10
|
+
|
11
|
+
* Fix bug where EasyPost.http_config was invalid when not explicitly initialized.
|
12
|
+
|
13
|
+
=== 3.1.0 2020-06-23
|
14
|
+
|
15
|
+
* Add Shipment Invoice and Refund Report
|
16
|
+
* Remove dependencies on `RestClient` and `MultiJson`
|
17
|
+
* Remove some deprecated endpoints
|
18
|
+
|
1
19
|
=== 3.0.1 2018-05-17
|
2
20
|
|
3
21
|
* Enforce TLS certificate validity by default
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# EasyPost Ruby Client Library
|
2
2
|
|
3
|
-
[
|
3
|
+
[![Build Status](https://travis-ci.com/EasyPost/easypost-ruby.svg?branch=master)](https://travis-ci.com/EasyPost/easypost-ruby)
|
4
4
|
|
5
5
|
|
6
6
|
EasyPost is a simple shipping API. You can sign up for an account at https://easypost.com
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.1.3
|
data/easypost.gemspec
CHANGED
@@ -1,27 +1,31 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require "easypost/version"
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.
|
10
|
-
spec.
|
11
|
-
spec.
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
8
|
+
spec.name = "easypost"
|
9
|
+
spec.version = EasyPost::VERSION
|
10
|
+
spec.licenses = ["MIT"]
|
11
|
+
spec.date = Time.now.strftime("%Y-%m-%d")
|
12
|
+
spec.summary = "EasyPost Ruby Client Library"
|
13
|
+
spec.description = "Client library for accessing the EasyPost shipping API via Ruby."
|
14
|
+
spec.authors = ["Jake Epstein", "Andrew Tribone", "James Brown"]
|
15
|
+
spec.email = "support@easypost.com"
|
16
|
+
spec.homepage = "https://www.easypost.com/docs"
|
15
17
|
|
16
|
-
spec.files
|
17
|
-
|
18
|
-
|
19
|
-
spec.
|
20
|
-
spec.
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
|
+
f.match(%r{^(test|spec|features)/})
|
20
|
+
end
|
21
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
spec.required_ruby_version = "~> 2.2"
|
21
25
|
|
22
|
-
spec.
|
23
|
-
spec.
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency "pry", "~> 0.13"
|
27
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3.9"
|
29
|
+
spec.add_development_dependency "webmock", "~> 3.8"
|
30
|
+
spec.add_development_dependency "vcr", "~> 5.1"
|
27
31
|
end
|
data/lib/easypost.rb
CHANGED
@@ -1,157 +1,147 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require 'rest_client'
|
5
|
-
require 'multi_json'
|
1
|
+
require "base64"
|
2
|
+
require "cgi"
|
3
|
+
require "net/http"
|
6
4
|
|
7
5
|
# Resources
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require
|
35
|
-
|
36
|
-
require
|
6
|
+
require "easypost/version"
|
7
|
+
require "easypost/util"
|
8
|
+
require "easypost/object"
|
9
|
+
require "easypost/resource"
|
10
|
+
require "easypost/address"
|
11
|
+
require "easypost/parcel"
|
12
|
+
require "easypost/customs_item"
|
13
|
+
require "easypost/customs_info"
|
14
|
+
require "easypost/shipment"
|
15
|
+
require "easypost/rate"
|
16
|
+
require "easypost/postage_label"
|
17
|
+
require "easypost/scan_form"
|
18
|
+
require "easypost/refund"
|
19
|
+
require "easypost/insurance"
|
20
|
+
require "easypost/event"
|
21
|
+
require "easypost/batch"
|
22
|
+
require "easypost/tracker"
|
23
|
+
require "easypost/item"
|
24
|
+
require "easypost/order"
|
25
|
+
require "easypost/pickup"
|
26
|
+
require "easypost/pickup_rate"
|
27
|
+
require "easypost/printer"
|
28
|
+
require "easypost/print_job"
|
29
|
+
require "easypost/carrier_account"
|
30
|
+
require "easypost/user"
|
31
|
+
require "easypost/report"
|
32
|
+
require "easypost/webhook"
|
33
|
+
|
34
|
+
require "easypost/error"
|
37
35
|
|
38
36
|
module EasyPost
|
39
|
-
|
40
|
-
|
41
|
-
@@api_version = nil
|
42
|
-
@@open_timeout = 30
|
43
|
-
@@timeout = 60
|
44
|
-
|
45
|
-
def self.api_url(url='')
|
46
|
-
@@api_base + url
|
47
|
-
end
|
37
|
+
@api_key = nil
|
38
|
+
@api_base = "https://api.easypost.com"
|
48
39
|
|
49
40
|
def self.api_key=(api_key)
|
50
|
-
|
41
|
+
@api_key = api_key
|
51
42
|
end
|
52
43
|
|
53
44
|
def self.api_key
|
54
|
-
|
45
|
+
@api_key
|
55
46
|
end
|
56
47
|
|
57
48
|
def self.api_base=(api_base)
|
58
|
-
|
49
|
+
@api_base = api_base
|
59
50
|
end
|
60
51
|
|
61
52
|
def self.api_base
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.api_version=(version)
|
66
|
-
@@api_version = version
|
53
|
+
@api_base
|
67
54
|
end
|
68
55
|
|
69
|
-
def self.
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.http_config
|
74
|
-
@@http_config ||= {
|
56
|
+
def self.reset_http_config
|
57
|
+
@http_config = {
|
75
58
|
timeout: 60,
|
76
59
|
open_timeout: 30,
|
77
60
|
verify_ssl: OpenSSL::SSL::VERIFY_PEER,
|
78
|
-
ssl_version: :TLSv1_2,
|
79
61
|
}
|
62
|
+
|
63
|
+
ruby_version = Gem::Version.new(RUBY_VERSION)
|
64
|
+
if ruby_version >= Gem::Version.new("2.5.0")
|
65
|
+
@http_config[:min_version] = OpenSSL::SSL::TLS1_2_VERSION
|
66
|
+
else
|
67
|
+
@http_config[:ssl_version] = :TLSv1_2
|
68
|
+
end
|
69
|
+
|
70
|
+
@http_config
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.http_config
|
74
|
+
@http_config ||= reset_http_config
|
80
75
|
end
|
81
76
|
|
82
77
|
def self.http_config=(http_config_params)
|
83
|
-
|
78
|
+
http_config.merge!(http_config_params)
|
84
79
|
end
|
85
80
|
|
86
|
-
def self.
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
81
|
+
def self.make_client(uri)
|
82
|
+
client = if http_config[:proxy]
|
83
|
+
proxy_uri = URI(http_config[:proxy])
|
84
|
+
Net::HTTP.new(
|
85
|
+
uri.host,
|
86
|
+
uri.port,
|
87
|
+
proxy_uri.host,
|
88
|
+
proxy_uri.port,
|
89
|
+
proxy_uri.user,
|
90
|
+
proxy_uri.password
|
91
|
+
)
|
92
|
+
else
|
93
|
+
Net::HTTP.new(uri.host, uri.port)
|
94
|
+
end
|
95
|
+
client.use_ssl = true
|
96
|
+
|
97
|
+
http_config.each do |name, value|
|
98
|
+
# Discrepancies between RestClient and Net::HTTP.
|
99
|
+
if name == :verify_ssl
|
100
|
+
name = :verify_mode
|
101
|
+
elsif name == :timeout
|
102
|
+
name = :read_timeout
|
103
|
+
end
|
91
104
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
when :get, :head, :delete
|
96
|
-
# Make params into GET parameters
|
97
|
-
if params && params.count > 0
|
98
|
-
query_string = Util.flatten_params(params).collect{|key, value| "#{key}=#{Util.url_encode(value)}"}.join('&')
|
99
|
-
url += "#{URI.parse(url).query ? '&' : '?'}#{query_string}"
|
105
|
+
# Handled in the creation of the client.
|
106
|
+
if name == :proxy
|
107
|
+
next
|
100
108
|
end
|
101
|
-
|
102
|
-
|
103
|
-
payload = Util.flatten_params(params).collect{|(key, value)| "#{key}=#{Util.url_encode(value)}"}.join('&')
|
109
|
+
|
110
|
+
client.send("#{name}=", value)
|
104
111
|
end
|
105
112
|
|
106
|
-
|
107
|
-
|
108
|
-
:authorization => "Bearer #{api_key}",
|
109
|
-
:content_type => 'application/x-www-form-urlencoded'
|
110
|
-
}.merge(headers)
|
111
|
-
|
112
|
-
opts = http_config.merge(
|
113
|
-
{
|
114
|
-
:method => method,
|
115
|
-
:url => url,
|
116
|
-
:headers => headers,
|
117
|
-
:payload => payload
|
118
|
-
}
|
119
|
-
)
|
113
|
+
client
|
114
|
+
end
|
120
115
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
rescue MultiJson::DecodeError
|
128
|
-
raise Error.new("Invalid response from API, unable to decode.", response_code, response_body)
|
129
|
-
end
|
130
|
-
begin
|
131
|
-
raise NoMethodError if response_json[:error][:message] == nil
|
132
|
-
raise Error.new(response_json[:error][:message], response_code, response_body, response_json)
|
133
|
-
rescue NoMethodError, TypeError
|
134
|
-
raise Error.new(response_json[:error], response_code, response_body, response_json)
|
135
|
-
end
|
136
|
-
else
|
137
|
-
raise Error.new(e.message)
|
138
|
-
end
|
139
|
-
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
140
|
-
raise Error.new(e.message)
|
116
|
+
def self.make_request(method, path, api_key=nil, body=nil)
|
117
|
+
client = make_client(URI(@api_base))
|
118
|
+
|
119
|
+
request = Net::HTTP.const_get(method.capitalize).new(path)
|
120
|
+
if body
|
121
|
+
request.body = JSON.dump(Util.objects_to_ids(body))
|
141
122
|
end
|
142
123
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
124
|
+
request["Content-Type"] = "application/json"
|
125
|
+
request["User-Agent"] = "EasyPost/v2 RubyClient/#{VERSION} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
126
|
+
if api_key = api_key || @api_key
|
127
|
+
request["Authorization"] = "Basic #{Base64.strict_encode64("#{api_key}:")}"
|
147
128
|
end
|
148
129
|
|
149
|
-
|
150
|
-
end
|
130
|
+
response = client.request(request)
|
151
131
|
|
152
|
-
|
132
|
+
if (400..599).include? response.code.to_i
|
133
|
+
error = JSON.parse(response.body)["error"]
|
134
|
+
raise Error.new(error["message"], response.code.to_i, error["code"], error["errors"])
|
135
|
+
end
|
153
136
|
|
154
|
-
|
155
|
-
|
137
|
+
if response["Content-Type"].include? "application/json"
|
138
|
+
JSON.parse(response.body)
|
139
|
+
else
|
140
|
+
response.body
|
141
|
+
end
|
142
|
+
rescue JSON::ParserError
|
143
|
+
raise RuntimeError.new(
|
144
|
+
"Invalid response object from API, unable to decode.\n#{response.body}"
|
145
|
+
)
|
156
146
|
end
|
157
147
|
end
|
data/lib/easypost/address.rb
CHANGED
@@ -18,7 +18,7 @@ module EasyPost
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
response
|
21
|
+
response = EasyPost.make_request(:post, url, api_key, {address: params})
|
22
22
|
return Util.convert_to_easypost_object(response, api_key)
|
23
23
|
end
|
24
24
|
|
@@ -26,7 +26,7 @@ module EasyPost
|
|
26
26
|
wrapped_params = {}
|
27
27
|
wrapped_params[self.class_name().to_sym] = params
|
28
28
|
wrapped_params[:carrier] = carrier
|
29
|
-
response
|
29
|
+
response = EasyPost.make_request(:post, url + '/create_and_verify', api_key, wrapped_params)
|
30
30
|
|
31
31
|
if response.has_key?(:address)
|
32
32
|
if response.has_key?(:message)
|
@@ -41,13 +41,13 @@ module EasyPost
|
|
41
41
|
|
42
42
|
def verify(params={}, carrier=nil)
|
43
43
|
begin
|
44
|
-
response
|
44
|
+
response = EasyPost.make_request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
|
45
45
|
rescue
|
46
46
|
raise Error.new("Unable to verify address.")
|
47
47
|
end
|
48
48
|
|
49
|
-
if response.has_key?(
|
50
|
-
return EasyPost::Util::convert_to_easypost_object(response[
|
49
|
+
if response.has_key?("address")
|
50
|
+
return EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
|
51
51
|
else
|
52
52
|
raise Error.new("Unable to verify address.")
|
53
53
|
end
|
data/lib/easypost/batch.rb
CHANGED
@@ -4,47 +4,47 @@ module EasyPost
|
|
4
4
|
def self.create_and_buy(params={}, api_key=nil)
|
5
5
|
wrapped_params = {}
|
6
6
|
wrapped_params[self.class_name().to_sym] = params
|
7
|
-
response
|
7
|
+
response = EasyPost.make_request(:post, url + '/create_and_buy', api_key, wrapped_params)
|
8
8
|
|
9
9
|
return Util.convert_to_easypost_object(response, api_key)
|
10
10
|
end
|
11
11
|
|
12
12
|
def buy(params={})
|
13
|
-
response
|
13
|
+
response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
|
14
14
|
self.refresh_from(response, @api_key, true)
|
15
15
|
|
16
16
|
return self
|
17
17
|
end
|
18
18
|
|
19
19
|
def label(params={})
|
20
|
-
response
|
20
|
+
response = EasyPost.make_request(:post, url + '/label', @api_key, params)
|
21
21
|
self.refresh_from(response, @api_key, true)
|
22
22
|
|
23
23
|
return self
|
24
24
|
end
|
25
25
|
|
26
26
|
def remove_shipments(params={})
|
27
|
-
response
|
27
|
+
response = EasyPost.make_request(:post, url + '/remove_shipments', @api_key, params)
|
28
28
|
self.refresh_from(response, @api_key, true)
|
29
29
|
|
30
30
|
return self
|
31
31
|
end
|
32
32
|
|
33
33
|
def add_shipments(params={})
|
34
|
-
response
|
34
|
+
response = EasyPost.make_request(:post, url + '/add_shipments', @api_key, params)
|
35
35
|
self.refresh_from(response, @api_key, true)
|
36
36
|
|
37
37
|
return self
|
38
38
|
end
|
39
39
|
|
40
40
|
def stamp_and_barcode_by_reference(params={})
|
41
|
-
response
|
41
|
+
response = EasyPost.make_request(:get, url + '/stamp_and_barcode_by_reference', @api_key, params)
|
42
42
|
|
43
43
|
return response
|
44
44
|
end
|
45
45
|
|
46
46
|
def create_scan_form(params={})
|
47
|
-
response
|
47
|
+
response = EasyPost.make_request(:post, url + '/scan_form', @api_key, params)
|
48
48
|
|
49
49
|
return response
|
50
50
|
end
|