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