easypost 2.7.2 → 3.1.4
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 +5 -5
- data/.travis.yml +9 -0
- data/CHANGELOG +39 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/easypost.gemspec +24 -19
- data/lib/easypost.rb +108 -118
- data/lib/easypost/address.rb +9 -7
- 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 -22
- data/lib/easypost/item.rb +1 -1
- data/lib/easypost/object.rb +8 -8
- 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 +7 -11
- data/lib/easypost/tracker.rb +2 -2
- data/lib/easypost/user.rb +3 -5
- data/lib/easypost/util.rb +10 -45
- data/lib/easypost/webhook.rb +6 -3
- metadata +42 -70
- 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
|
+
SHA256:
|
3
|
+
metadata.gz: 3f2b1945f7283b88880be5fa9700332289d7007137056113d6223a61e59be79a
|
4
|
+
data.tar.gz: a168444a606c919ca7a5f1a940040b2822d25ee88d555ca7a11fb289a3e06962
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e53924a901d7dc9f25272991d589d7c08b1f28ccba941792925d9fd6ad8b65a57568caf5a15062e227086a2c9d997d85d72d655b21c1be08addc47093a956bff
|
7
|
+
data.tar.gz: 6bf95b960ec71c8b79effae947a38fd11a902fba63d98db28b6f7d448a05b4914f7f8a56ffc33452d8660e5898b60a0f953de10f7be0764b9b2b40058034ec4c
|
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
=== 3.1.4 2020-09-29
|
2
|
+
|
3
|
+
* Don't modify params passed into Address#create (#78; thanks @TheRusskiy)
|
4
|
+
* Don't modify `carriers` and `services` parameters to `Shipment.lowest_rate` (#71 / #103, thanks @vladvinnikov and @jurisgalang)
|
5
|
+
* When constructing an easypost object, convert the key to a string (#102; thanks @Geesu)
|
6
|
+
* Expose the raw HTTP response as `#http_body` on `EasyPost::Error` objects (#101; thanks @Geesu)
|
7
|
+
|
8
|
+
=== 3.1.3 2020-06-26
|
9
|
+
|
10
|
+
* Fix bug causing Authorization header to be included in User-Agent header. All users must upgrade.
|
11
|
+
|
12
|
+
=== 3.1.2 2020-06-24
|
13
|
+
|
14
|
+
* Bad gem push. New version required.
|
15
|
+
|
16
|
+
=== 3.1.1 2020-06-23
|
17
|
+
|
18
|
+
* Fix bug where EasyPost.http_config was invalid when not explicitly initialized.
|
19
|
+
|
20
|
+
=== 3.1.0 2020-06-23
|
21
|
+
|
22
|
+
* Add Shipment Invoice and Refund Report
|
23
|
+
* Remove dependencies on `RestClient` and `MultiJson`
|
24
|
+
* Remove some deprecated endpoints
|
25
|
+
|
26
|
+
=== 3.0.1 2018-05-17
|
27
|
+
|
28
|
+
* Enforce TLS certificate validity by default
|
29
|
+
|
30
|
+
=== 3.0.0 2018-02-09
|
31
|
+
|
32
|
+
* Require use of ruby ~> 2.0 and TLSv1.2
|
33
|
+
|
34
|
+
|
35
|
+
=== 2.7.3 2017-05-25
|
36
|
+
|
37
|
+
* Fix bug with introduced around certain JSON objects with IDs (thanks vladvinnikov!)
|
38
|
+
|
39
|
+
|
1
40
|
=== 2.7.2 2018-01-31
|
2
41
|
|
3
42
|
* Removed unused and unsupported code paths for Container model
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# EasyPost Ruby Client Library
|
2
2
|
|
3
|
-
[
|
3
|
+
[](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
|
-
|
1
|
+
3.1.4
|
data/easypost.gemspec
CHANGED
@@ -1,26 +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.
|
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"
|
20
25
|
|
21
|
-
spec.
|
22
|
-
spec.
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
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"
|
26
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
|
-
|
53
|
+
@api_base
|
63
54
|
end
|
64
55
|
|
65
|
-
def self.
|
66
|
-
|
67
|
-
|
56
|
+
def self.reset_http_config
|
57
|
+
@http_config = {
|
58
|
+
timeout: 60,
|
59
|
+
open_timeout: 30,
|
60
|
+
verify_ssl: OpenSSL::SSL::VERIFY_PEER,
|
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
|
68
69
|
|
69
|
-
|
70
|
-
@@api_version
|
70
|
+
@http_config
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.http_config
|
74
|
-
|
75
|
-
timeout: 60,
|
76
|
-
open_timeout: 30,
|
77
|
-
verify_ssl: false,
|
78
|
-
ssl_version: "TLSv1",
|
79
|
-
}
|
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"], response.body)
|
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
@@ -5,9 +5,11 @@ module EasyPost
|
|
5
5
|
def self.create(params={}, api_key=nil)
|
6
6
|
url = self.url
|
7
7
|
|
8
|
+
address = params.reject { |k,_| k == :verify || k == :verify_strict }
|
9
|
+
|
8
10
|
if params[:verify] || params[:verify_strict]
|
9
|
-
verify = params
|
10
|
-
verify_strict = params
|
11
|
+
verify = params[:verify] || []
|
12
|
+
verify_strict = params[:verify_strict] || []
|
11
13
|
|
12
14
|
url += "?"
|
13
15
|
verify.each do |verification|
|
@@ -18,7 +20,7 @@ module EasyPost
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
response
|
23
|
+
response = EasyPost.make_request(:post, url, api_key, {address: address})
|
22
24
|
return Util.convert_to_easypost_object(response, api_key)
|
23
25
|
end
|
24
26
|
|
@@ -26,7 +28,7 @@ module EasyPost
|
|
26
28
|
wrapped_params = {}
|
27
29
|
wrapped_params[self.class_name().to_sym] = params
|
28
30
|
wrapped_params[:carrier] = carrier
|
29
|
-
response
|
31
|
+
response = EasyPost.make_request(:post, url + '/create_and_verify', api_key, wrapped_params)
|
30
32
|
|
31
33
|
if response.has_key?(:address)
|
32
34
|
if response.has_key?(:message)
|
@@ -41,13 +43,13 @@ module EasyPost
|
|
41
43
|
|
42
44
|
def verify(params={}, carrier=nil)
|
43
45
|
begin
|
44
|
-
response
|
46
|
+
response = EasyPost.make_request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
|
45
47
|
rescue
|
46
48
|
raise Error.new("Unable to verify address.")
|
47
49
|
end
|
48
50
|
|
49
|
-
if response.has_key?(
|
50
|
-
return EasyPost::Util::convert_to_easypost_object(response[
|
51
|
+
if response.has_key?("address")
|
52
|
+
return EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
|
51
53
|
else
|
52
54
|
raise Error.new("Unable to verify address.")
|
53
55
|
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
|