easypost 3.0.0 → 3.1.5
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 +35 -0
- data/README.md +2 -1
- data/VERSION +1 -1
- data/easypost.gemspec +24 -20
- data/lib/easypost/address.rb +47 -47
- data/lib/easypost/batch.rb +34 -38
- data/lib/easypost/carrier_account.rb +4 -6
- data/lib/easypost/customs_info.rb +3 -2
- data/lib/easypost/customs_item.rb +3 -2
- data/lib/easypost/error.rb +25 -33
- data/lib/easypost/event.rb +3 -6
- data/lib/easypost/insurance.rb +1 -3
- data/lib/easypost/item.rb +4 -8
- data/lib/easypost/object.rb +111 -113
- data/lib/easypost/order.rb +20 -18
- data/lib/easypost/parcel.rb +1 -3
- data/lib/easypost/pickup.rb +19 -18
- data/lib/easypost/pickup_rate.rb +1 -3
- data/lib/easypost/postage_label.rb +1 -3
- data/lib/easypost/print_job.rb +1 -5
- data/lib/easypost/printer.rb +18 -22
- data/lib/easypost/rate.rb +1 -3
- data/lib/easypost/refund.rb +1 -3
- data/lib/easypost/report.rb +22 -24
- data/lib/easypost/resource.rb +58 -60
- data/lib/easypost/scan_form.rb +4 -6
- data/lib/easypost/shipment.rb +84 -92
- data/lib/easypost/tracker.rb +10 -12
- data/lib/easypost/user.rb +33 -37
- data/lib/easypost/util.rb +99 -136
- data/lib/easypost/webhook.rb +22 -21
- data/lib/easypost.rb +108 -118
- metadata +33 -61
- 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
data/lib/easypost/object.rb
CHANGED
@@ -1,149 +1,147 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
def self.construct_from(values, api_key=nil, parent=nil, name=nil)
|
19
|
-
obj = self.new(values[:id], api_key, parent, name)
|
20
|
-
obj.refresh_from(values, api_key)
|
21
|
-
obj
|
22
|
-
end
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
class EasyPost::EasyPostObject
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_accessor :parent, :name, :api_key, :unsaved_values
|
7
|
+
@@immutable_values = Set.new([:api_key, :id])
|
8
|
+
|
9
|
+
def initialize(id=nil, api_key=nil, parent=nil, name=nil)
|
10
|
+
@api_key = api_key
|
11
|
+
@values = {}
|
12
|
+
@unsaved_values = Set.new
|
13
|
+
@transient_values = Set.new
|
14
|
+
@parent = parent
|
15
|
+
@name = name
|
16
|
+
self.id = id if id
|
17
|
+
end
|
23
18
|
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
def self.construct_from(values, api_key=nil, parent=nil, name=nil)
|
20
|
+
obj = self.new(values[:id], api_key, parent, name)
|
21
|
+
obj.refresh_from(values, api_key)
|
22
|
+
obj
|
23
|
+
end
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
25
|
+
def to_s(*args)
|
26
|
+
JSON.dump(@values)
|
27
|
+
end
|
32
28
|
|
33
|
-
|
34
|
-
|
29
|
+
def inspect
|
30
|
+
id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
|
31
|
+
"#<#{self.class}:#{id_string}> JSON: " + to_json
|
32
|
+
end
|
35
33
|
|
36
|
-
|
34
|
+
def refresh_from(values, api_key, partial=false)
|
35
|
+
@api_key = api_key
|
37
36
|
|
38
|
-
|
39
|
-
add_accessors(added)
|
40
|
-
end
|
37
|
+
added = Set.new(values.keys - @values.keys)
|
41
38
|
|
42
|
-
|
43
|
-
|
44
|
-
@transient_values.delete(k)
|
45
|
-
@unsaved_values.delete(k)
|
46
|
-
end
|
39
|
+
instance_eval do
|
40
|
+
add_accessors(added)
|
47
41
|
end
|
48
42
|
|
49
|
-
|
50
|
-
k =
|
51
|
-
@
|
43
|
+
values.each do |k, v|
|
44
|
+
@values[k.to_s] = EasyPost::Util.convert_to_easypost_object(v, api_key, self, k)
|
45
|
+
@transient_values.delete(k)
|
46
|
+
@unsaved_values.delete(k)
|
52
47
|
end
|
48
|
+
end
|
53
49
|
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
def [](k)
|
51
|
+
@values[k.to_s]
|
52
|
+
end
|
57
53
|
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
def []=(k, v)
|
55
|
+
send(:"#{k}=", v)
|
56
|
+
end
|
61
57
|
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
def keys
|
59
|
+
@values.keys
|
60
|
+
end
|
65
61
|
|
66
|
-
|
67
|
-
|
68
|
-
|
62
|
+
def values
|
63
|
+
@values.values
|
64
|
+
end
|
69
65
|
|
70
|
-
|
71
|
-
|
72
|
-
|
66
|
+
def to_json(options = {})
|
67
|
+
JSON.dump(@values)
|
68
|
+
end
|
73
69
|
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
def as_json(options = {})
|
71
|
+
@values.as_json
|
72
|
+
end
|
77
73
|
|
78
|
-
|
79
|
-
|
80
|
-
|
74
|
+
def to_hash
|
75
|
+
@values
|
76
|
+
end
|
81
77
|
|
82
|
-
|
83
|
-
|
84
|
-
|
78
|
+
def each(&blk)
|
79
|
+
@values.each(&blk)
|
80
|
+
end
|
85
81
|
|
86
|
-
|
87
|
-
|
88
|
-
|
82
|
+
def id=(id)
|
83
|
+
@values[:id] = id
|
84
|
+
end
|
89
85
|
|
90
|
-
|
86
|
+
def id
|
87
|
+
@values[:id]
|
88
|
+
end
|
91
89
|
|
92
|
-
|
93
|
-
values = {}
|
94
|
-
for key in @unsaved_values
|
95
|
-
value = @values[key]
|
90
|
+
protected
|
96
91
|
|
97
|
-
|
92
|
+
def flatten_unsaved
|
93
|
+
values = {}
|
94
|
+
for key in @unsaved_values
|
95
|
+
value = @values[key]
|
98
96
|
|
99
|
-
|
100
|
-
values[key] = flatten_unsaved(value)
|
101
|
-
end
|
102
|
-
end
|
97
|
+
values[key] = value
|
103
98
|
|
104
|
-
|
99
|
+
if value.is_a?(EasyPost::EasyPostObject)
|
100
|
+
values[key] = flatten_unsaved(value)
|
101
|
+
end
|
105
102
|
end
|
106
103
|
|
107
|
-
|
108
|
-
|
109
|
-
end
|
104
|
+
return values
|
105
|
+
end
|
110
106
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
107
|
+
def metaclass
|
108
|
+
class << self; self; end
|
109
|
+
end
|
110
|
+
|
111
|
+
def remove_accessors(keys)
|
112
|
+
metaclass.instance_eval do
|
113
|
+
keys.each do |k|
|
114
|
+
next if @@immutable_values.include?(k)
|
115
|
+
k_eq = :"#{k}="
|
116
|
+
remove_method(k) if method_defined?(k)
|
117
|
+
remove_method(k_eq) if method_defined?(k_eq)
|
119
118
|
end
|
120
119
|
end
|
120
|
+
end
|
121
121
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
end
|
139
|
-
|
140
|
-
cur = cur_parent
|
141
|
-
cur_parent = cur.parent
|
122
|
+
def add_accessors(keys)
|
123
|
+
metaclass.instance_eval do
|
124
|
+
keys.each do |k|
|
125
|
+
next if @@immutable_values.include?(k)
|
126
|
+
k = k.to_s
|
127
|
+
k_eq = :"#{k}="
|
128
|
+
define_method(k) { @values[k] }
|
129
|
+
define_method(k_eq) do |v|
|
130
|
+
@values[k] = v
|
131
|
+
@unsaved_values.add(k)
|
132
|
+
|
133
|
+
cur = self
|
134
|
+
cur_parent = self.parent
|
135
|
+
while cur_parent
|
136
|
+
if cur.name
|
137
|
+
cur_parent.unsaved_values.add(cur.name)
|
142
138
|
end
|
139
|
+
|
140
|
+
cur = cur_parent
|
141
|
+
cur_parent = cur.parent
|
143
142
|
end
|
144
143
|
end
|
145
144
|
end
|
146
145
|
end
|
147
|
-
|
148
146
|
end
|
149
147
|
end
|
data/lib/easypost/order.rb
CHANGED
@@ -1,26 +1,28 @@
|
|
1
|
-
|
2
|
-
class Order < Resource
|
1
|
+
class EasyPost::Order < EasyPost::Resource
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
def get_rates(params={})
|
4
|
+
response = EasyPost.make_request(:get, url + '/rates', @api_key, params)
|
5
|
+
self.refresh_from(response, @api_key, true)
|
7
6
|
|
8
|
-
|
9
|
-
|
7
|
+
return self
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
def buy(params={})
|
11
|
+
if params.instance_of?(EasyPost::Rate)
|
12
|
+
temp = params.clone
|
13
|
+
params = {}
|
14
|
+
params[:carrier] = temp.carrier
|
15
|
+
params[:service] = temp.service
|
16
|
+
end
|
18
17
|
|
19
|
-
|
20
|
-
|
18
|
+
response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
|
19
|
+
self.refresh_from(response, @api_key, true)
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
return self
|
22
|
+
end
|
24
23
|
|
24
|
+
def self.all(filters={}, api_key=nil)
|
25
|
+
raise NotImplementedError.new('Order.all not implemented.')
|
25
26
|
end
|
27
|
+
|
26
28
|
end
|
data/lib/easypost/parcel.rb
CHANGED
data/lib/easypost/pickup.rb
CHANGED
@@ -1,25 +1,26 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
class EasyPost::Pickup < EasyPost::Resource
|
2
|
+
def buy(params={})
|
3
|
+
if params.instance_of?(EasyPost::PickupRate)
|
4
|
+
temp = params.clone
|
5
|
+
params = {}
|
6
|
+
params[:carrier] = temp.carrier
|
7
|
+
params[:service] = temp.service
|
8
|
+
end
|
3
9
|
|
4
|
-
|
5
|
-
|
6
|
-
temp = params.clone
|
7
|
-
params = {}
|
8
|
-
params[:carrier] = temp.carrier
|
9
|
-
params[:service] = temp.service
|
10
|
-
end
|
10
|
+
response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
|
11
|
+
self.refresh_from(response, @api_key, true)
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
return self
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
def cancel(params={})
|
17
|
+
response = EasyPost.make_request(:post, url + '/cancel', @api_key, params)
|
18
|
+
self.refresh_from(response, @api_key, true)
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
self.refresh_from(response, @api_key, true)
|
20
|
+
return self
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
def self.all(filters={}, api_key=nil)
|
24
|
+
raise NotImplementedError.new('Pickup.all not implemented.')
|
24
25
|
end
|
25
26
|
end
|
data/lib/easypost/pickup_rate.rb
CHANGED
data/lib/easypost/print_job.rb
CHANGED
data/lib/easypost/printer.rb
CHANGED
@@ -1,28 +1,24 @@
|
|
1
|
-
|
2
|
-
class Printer < Resource
|
1
|
+
class EasyPost::Printer < EasyPost::Resource
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def print(params={})
|
12
|
-
if params.instance_of?(EasyPost::PostageLabel)
|
13
|
-
temp = params.clone
|
14
|
-
params = {}
|
15
|
-
params[:postage_label] = temp
|
16
|
-
end
|
3
|
+
def job
|
4
|
+
response = EasyPost.make_request(
|
5
|
+
:get, url + '/jobs', @api_key
|
6
|
+
)
|
7
|
+
return EasyPost::Util::convert_to_easypost_object(response, api_key)
|
8
|
+
end
|
17
9
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
return false
|
10
|
+
def print(params={})
|
11
|
+
if params.instance_of?(EasyPost::PostageLabel)
|
12
|
+
temp = params.clone
|
13
|
+
params = {}
|
14
|
+
params[:postage_label] = temp
|
24
15
|
end
|
25
16
|
|
17
|
+
response = EasyPost.make_request(
|
18
|
+
:post, url + '/print_postage_label', @api_key, params
|
19
|
+
)
|
20
|
+
true
|
21
|
+
rescue
|
22
|
+
false
|
26
23
|
end
|
27
24
|
end
|
28
|
-
|
data/lib/easypost/rate.rb
CHANGED
data/lib/easypost/refund.rb
CHANGED
data/lib/easypost/report.rb
CHANGED
@@ -1,31 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
wrapped_params[class_name.to_sym] = params
|
1
|
+
class EasyPost::Report < EasyPost::Resource
|
2
|
+
def self.create(params={}, api_key=nil)
|
3
|
+
url = "#{self.url}/#{params[:type]}"
|
4
|
+
wrapped_params = {}
|
5
|
+
wrapped_params[class_name.to_sym] = params
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def self.retrieve(params, api_key=nil)
|
13
|
-
id = if params.is_a?(String)
|
14
|
-
params
|
15
|
-
else
|
16
|
-
params[:id]
|
17
|
-
end
|
7
|
+
response = EasyPost.make_request(:post, url, api_key, params)
|
8
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
9
|
+
end
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
def self.retrieve(params, api_key=nil)
|
12
|
+
id = if params.is_a?(String)
|
13
|
+
params
|
14
|
+
else
|
15
|
+
params[:id]
|
22
16
|
end
|
23
17
|
|
24
|
-
|
25
|
-
|
18
|
+
instance = self.new(id, api_key)
|
19
|
+
instance.refresh
|
20
|
+
return instance
|
21
|
+
end
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
def self.all(filters={}, api_key=nil)
|
24
|
+
url = "#{self.url}/#{filters[:type]}"
|
25
|
+
|
26
|
+
response = EasyPost.make_request(:get, url, api_key, filters)
|
27
|
+
return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
|
30
28
|
end
|
31
29
|
end
|
data/lib/easypost/resource.rb
CHANGED
@@ -1,77 +1,75 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
1
|
+
class EasyPost::Resource < EasyPost::EasyPostObject
|
2
|
+
def self.class_name
|
3
|
+
camel = self.name.split('::')[-1]
|
4
|
+
snake = camel[0..0] + camel[1..-1].gsub(/([A-Z])/, '_\1')
|
5
|
+
return snake.downcase
|
6
|
+
end
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
if(self.class_name[-1..-1] == 's' || self.class_name[-1..-1] == 'h')
|
14
|
-
return "/#{CGI.escape(self.class_name.downcase)}es"
|
15
|
-
else
|
16
|
-
return "/#{CGI.escape(class_name.downcase)}s"
|
17
|
-
end
|
8
|
+
def self.url
|
9
|
+
if self.class_name == 'resource'
|
10
|
+
raise NotImplementedError.new('Resource is an abstract class. You should perform actions on its subclasses (Address, Shipment, etc.)')
|
18
11
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
return "#{self.class.url}/#{CGI.escape(id)}"
|
12
|
+
if(self.class_name[-1..-1] == 's' || self.class_name[-1..-1] == 'h')
|
13
|
+
return "/v2/#{CGI.escape(self.class_name.downcase)}es"
|
14
|
+
else
|
15
|
+
return "/v2/#{CGI.escape(class_name.downcase)}s"
|
25
16
|
end
|
17
|
+
end
|
26
18
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
return self
|
19
|
+
def url
|
20
|
+
unless self.id
|
21
|
+
raise EasyPost::Error.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{self.id.inspect}")
|
31
22
|
end
|
23
|
+
return "#{self.class.url}/#{CGI.escape(id)}"
|
24
|
+
end
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
26
|
+
def refresh
|
27
|
+
response = EasyPost.make_request(:get, url, @api_key, @retrieve_options)
|
28
|
+
refresh_from(response, api_key)
|
29
|
+
return self
|
30
|
+
end
|
37
31
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
32
|
+
def self.all(filters={}, api_key=nil)
|
33
|
+
response = EasyPost.make_request(:get, url, api_key, filters)
|
34
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
35
|
+
end
|
43
36
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
37
|
+
def self.retrieve(id, api_key=nil)
|
38
|
+
instance = self.new(id, api_key)
|
39
|
+
instance.refresh
|
40
|
+
return instance
|
41
|
+
end
|
50
42
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
43
|
+
def self.create(params={}, api_key=nil)
|
44
|
+
wrapped_params = {}
|
45
|
+
wrapped_params[self.class_name().to_sym] = params
|
46
|
+
response = EasyPost.make_request(:post, self.url, api_key, wrapped_params)
|
47
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
48
|
+
end
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
50
|
+
def delete
|
51
|
+
response = EasyPost.make_request(:delete, url, @api_key)
|
52
|
+
refresh_from(response, api_key)
|
53
|
+
return self
|
54
|
+
end
|
55
|
+
|
56
|
+
def save
|
57
|
+
if @unsaved_values.length > 0
|
58
|
+
values = {}
|
59
|
+
@unsaved_values.each { |k| values[k] = @values[k] }
|
61
60
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
61
|
+
for key in @unsaved_values
|
62
|
+
value = values[key]
|
63
|
+
if value.is_a?(EasyPost::EasyPostObject)
|
64
|
+
values[key] = value.flatten_unsaved
|
67
65
|
end
|
66
|
+
end
|
68
67
|
|
69
|
-
|
68
|
+
wrapped_params = {self.class.class_name => values}
|
70
69
|
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
return self
|
70
|
+
response = EasyPost.make_request(:put, url, @api_key, wrapped_params)
|
71
|
+
refresh_from(response, api_key)
|
75
72
|
end
|
73
|
+
return self
|
76
74
|
end
|
77
75
|
end
|
data/lib/easypost/scan_form.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
return Util.convert_to_easypost_object(response, api_key)
|
6
|
-
end
|
1
|
+
class EasyPost::ScanForm < EasyPost::Resource
|
2
|
+
def self.create(params={}, api_key=nil)
|
3
|
+
response = EasyPost.make_request(:post, self.url, api_key, params)
|
4
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
7
5
|
end
|
8
6
|
end
|