easypost 3.5.1 → 5.2.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.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +9 -0
  3. data/.github/CODEOWNERS +2 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yml +81 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.yml +37 -0
  6. data/.github/PULL_REQUEST_TEMPLATE.md +22 -0
  7. data/.github/workflows/ci.yml +54 -5
  8. data/.gitignore +27 -17
  9. data/.gitmodules +3 -0
  10. data/CHANGELOG.md +295 -119
  11. data/Gemfile +2 -0
  12. data/Makefile +70 -0
  13. data/README.md +184 -72
  14. data/Rakefile +2 -1
  15. data/UPGRADE_GUIDE.md +181 -0
  16. data/VERSION +1 -1
  17. data/bin/easypost-irb +5 -3
  18. data/easypost.gemspec +27 -20
  19. data/lib/easypost/client.rb +179 -0
  20. data/lib/easypost/connection.rb +64 -0
  21. data/lib/easypost/constants.rb +15 -0
  22. data/lib/easypost/errors/api/api_error.rb +108 -0
  23. data/lib/easypost/errors/api/bad_request_error.rb +6 -0
  24. data/lib/easypost/errors/api/connection_error.rb +6 -0
  25. data/lib/easypost/errors/api/external_api_error.rb +18 -0
  26. data/lib/easypost/errors/api/forbidden_error.rb +6 -0
  27. data/lib/easypost/errors/api/gateway_timeout_error.rb +6 -0
  28. data/lib/easypost/errors/api/internal_server_error.rb +6 -0
  29. data/lib/easypost/errors/api/invalid_request_error.rb +6 -0
  30. data/lib/easypost/errors/api/method_not_allowed_error.rb +6 -0
  31. data/lib/easypost/errors/api/not_found_error.rb +6 -0
  32. data/lib/easypost/errors/api/payment_error.rb +6 -0
  33. data/lib/easypost/errors/api/proxy_error.rb +6 -0
  34. data/lib/easypost/errors/api/rate_limit_error.rb +6 -0
  35. data/lib/easypost/errors/api/redirect_error.rb +6 -0
  36. data/lib/easypost/errors/api/retry_error.rb +6 -0
  37. data/lib/easypost/errors/api/service_unavailable_error.rb +6 -0
  38. data/lib/easypost/errors/api/ssl_error.rb +6 -0
  39. data/lib/easypost/errors/api/timeout_error.rb +6 -0
  40. data/lib/easypost/errors/api/unauthorized_error.rb +6 -0
  41. data/lib/easypost/errors/api/unknown_api_error.rb +6 -0
  42. data/lib/easypost/errors/easy_post_error.rb +7 -0
  43. data/lib/easypost/errors/end_of_pagination_error.rb +7 -0
  44. data/lib/easypost/errors/filtering_error.rb +4 -0
  45. data/lib/easypost/errors/invalid_object_error.rb +4 -0
  46. data/lib/easypost/errors/invalid_parameter_error.rb +11 -0
  47. data/lib/easypost/errors/missing_parameter_error.rb +9 -0
  48. data/lib/easypost/errors/signature_verification_error.rb +4 -0
  49. data/lib/easypost/errors.rb +32 -0
  50. data/lib/easypost/hooks/request_context.rb +16 -0
  51. data/lib/easypost/hooks/response_context.rb +23 -0
  52. data/lib/easypost/hooks.rb +34 -0
  53. data/lib/easypost/http_client.rb +117 -0
  54. data/lib/easypost/internal_utilities.rb +66 -0
  55. data/lib/easypost/models/address.rb +5 -0
  56. data/lib/easypost/models/api_key.rb +5 -0
  57. data/lib/easypost/models/base.rb +58 -0
  58. data/lib/easypost/models/batch.rb +5 -0
  59. data/lib/easypost/models/brand.rb +5 -0
  60. data/lib/easypost/models/carbon_offset.rb +5 -0
  61. data/lib/easypost/models/carrier_account.rb +5 -0
  62. data/lib/easypost/models/carrier_type.rb +5 -0
  63. data/lib/easypost/models/customs_info.rb +5 -0
  64. data/lib/easypost/models/customs_item.rb +5 -0
  65. data/lib/easypost/models/end_shipper.rb +5 -0
  66. data/lib/easypost/models/error.rb +21 -0
  67. data/lib/easypost/models/event.rb +5 -0
  68. data/lib/easypost/models/insurance.rb +6 -0
  69. data/lib/easypost/models/order.rb +9 -0
  70. data/lib/easypost/models/parcel.rb +5 -0
  71. data/lib/easypost/models/payload.rb +5 -0
  72. data/lib/easypost/models/payment_method.rb +5 -0
  73. data/lib/easypost/models/pickup.rb +9 -0
  74. data/lib/easypost/models/pickup_rate.rb +5 -0
  75. data/lib/easypost/models/postage_label.rb +5 -0
  76. data/lib/easypost/models/rate.rb +5 -0
  77. data/lib/easypost/models/referral.rb +5 -0
  78. data/lib/easypost/models/refund.rb +5 -0
  79. data/lib/easypost/models/report.rb +5 -0
  80. data/lib/easypost/models/scan_form.rb +6 -0
  81. data/lib/easypost/models/shipment.rb +10 -0
  82. data/lib/easypost/models/tax_identifier.rb +6 -0
  83. data/lib/easypost/models/tracker.rb +5 -0
  84. data/lib/easypost/models/user.rb +5 -0
  85. data/lib/easypost/models/webhook.rb +6 -0
  86. data/lib/easypost/models.rb +36 -0
  87. data/lib/easypost/services/address.rb +50 -0
  88. data/lib/easypost/services/api_key.rb +8 -0
  89. data/lib/easypost/services/base.rb +27 -0
  90. data/lib/easypost/services/batch.rb +53 -0
  91. data/lib/easypost/services/beta_rate.rb +12 -0
  92. data/lib/easypost/services/beta_referral_customer.rb +40 -0
  93. data/lib/easypost/services/billing.rb +75 -0
  94. data/lib/easypost/services/carrier_account.rb +44 -0
  95. data/lib/easypost/services/carrier_metadata.rb +22 -0
  96. data/lib/easypost/services/carrier_type.rb +10 -0
  97. data/lib/easypost/services/customs_info.rb +17 -0
  98. data/lib/easypost/services/customs_item.rb +15 -0
  99. data/lib/easypost/services/end_shipper.rb +31 -0
  100. data/lib/easypost/services/event.rb +32 -0
  101. data/lib/easypost/services/insurance.rb +26 -0
  102. data/lib/easypost/services/order.rb +30 -0
  103. data/lib/easypost/services/parcel.rb +16 -0
  104. data/lib/easypost/services/pickup.rb +40 -0
  105. data/lib/easypost/services/rate.rb +8 -0
  106. data/lib/easypost/services/referral_customer.rb +103 -0
  107. data/lib/easypost/services/refund.rb +26 -0
  108. data/lib/easypost/services/report.rb +42 -0
  109. data/lib/easypost/services/scan_form.rb +25 -0
  110. data/lib/easypost/services/shipment.rb +106 -0
  111. data/lib/easypost/services/tracker.rb +38 -0
  112. data/lib/easypost/services/user.rb +66 -0
  113. data/lib/easypost/services/webhook.rb +34 -0
  114. data/lib/easypost/services.rb +33 -0
  115. data/lib/easypost/util.rb +160 -116
  116. data/lib/easypost/utilities/constants.rb +5 -0
  117. data/lib/easypost/utilities/json.rb +23 -0
  118. data/lib/easypost/utilities/static_mapper.rb +73 -0
  119. data/lib/easypost/utilities/system.rb +36 -0
  120. data/lib/easypost/version.rb +3 -1
  121. data/lib/easypost.rb +20 -143
  122. metadata +249 -46
  123. data/lib/easypost/address.rb +0 -58
  124. data/lib/easypost/api_key.rb +0 -2
  125. data/lib/easypost/batch.rb +0 -49
  126. data/lib/easypost/brand.rb +0 -9
  127. data/lib/easypost/carrier_account.rb +0 -5
  128. data/lib/easypost/carrier_type.rb +0 -2
  129. data/lib/easypost/customs_info.rb +0 -5
  130. data/lib/easypost/customs_item.rb +0 -5
  131. data/lib/easypost/error.rb +0 -31
  132. data/lib/easypost/event.rb +0 -7
  133. data/lib/easypost/insurance.rb +0 -2
  134. data/lib/easypost/object.rb +0 -151
  135. data/lib/easypost/order.rb +0 -28
  136. data/lib/easypost/parcel.rb +0 -2
  137. data/lib/easypost/pickup.rb +0 -26
  138. data/lib/easypost/pickup_rate.rb +0 -3
  139. data/lib/easypost/postage_label.rb +0 -2
  140. data/lib/easypost/print_job.rb +0 -2
  141. data/lib/easypost/printer.rb +0 -24
  142. data/lib/easypost/rate.rb +0 -2
  143. data/lib/easypost/refund.rb +0 -2
  144. data/lib/easypost/report.rb +0 -29
  145. data/lib/easypost/resource.rb +0 -75
  146. data/lib/easypost/scan_form.rb +0 -6
  147. data/lib/easypost/shipment.rb +0 -129
  148. data/lib/easypost/tax_identifier.rb +0 -2
  149. data/lib/easypost/tracker.rb +0 -7
  150. data/lib/easypost/user.rb +0 -56
  151. data/lib/easypost/webhook.rb +0 -29
@@ -1,58 +0,0 @@
1
- class EasyPost::Address < EasyPost::Resource
2
- attr_accessor :message # Backwards compatibility
3
-
4
- def self.create(params={}, api_key=nil)
5
- url = self.url
6
-
7
- address = params.reject { |k,_| k == :verify || k == :verify_strict }
8
-
9
- if params[:verify] || params[:verify_strict]
10
- verify = params[:verify] || []
11
- verify_strict = params[:verify_strict] || []
12
-
13
- url += "?"
14
- verify.each do |verification|
15
- url += "verify[]=#{verification}&"
16
- end
17
- verify_strict.each do |verification|
18
- url += "verify_strict[]=#{verification}&"
19
- end
20
- end
21
-
22
- response = EasyPost.make_request(:post, url, api_key, {address: address})
23
- return EasyPost::Util.convert_to_easypost_object(response, api_key)
24
- end
25
-
26
- def self.create_and_verify(params={}, carrier=nil, api_key=nil)
27
- wrapped_params = {}
28
- wrapped_params[self.class_name().to_sym] = params
29
- wrapped_params[:carrier] = carrier
30
- response = EasyPost.make_request(:post, url + '/create_and_verify', api_key, wrapped_params)
31
-
32
- if response.has_key?("address")
33
- if response.has_key?("message")
34
- response["address"]["message"] = response["message"]
35
- end
36
- verified_address = EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
37
- return verified_address
38
- else
39
- raise EasyPost::Error.new("Unable to verify address.")
40
- end
41
- end
42
-
43
- def verify(params={}, carrier=nil)
44
- begin
45
- response = EasyPost.make_request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
46
- rescue
47
- raise EasyPost::Error.new("Unable to verify address.")
48
- end
49
-
50
- if response.has_key?("address")
51
- return EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
52
- else
53
- raise EasyPost::Error.new("Unable to verify address.")
54
- end
55
-
56
- return self
57
- end
58
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::ApiKey < EasyPost::Resource
2
- end
@@ -1,49 +0,0 @@
1
- class EasyPost::Batch < EasyPost::Resource
2
- def self.create_and_buy(params={}, api_key=nil)
3
- wrapped_params = {}
4
- wrapped_params[self.class_name().to_sym] = params
5
- response = EasyPost.make_request(:post, url + '/create_and_buy', api_key, wrapped_params)
6
-
7
- return EasyPost::Util.convert_to_easypost_object(response, api_key)
8
- end
9
-
10
- def buy(params={})
11
- response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
12
- self.refresh_from(response, @api_key, true)
13
-
14
- return self
15
- end
16
-
17
- def label(params={})
18
- response = EasyPost.make_request(:post, url + '/label', @api_key, params)
19
- self.refresh_from(response, @api_key, true)
20
-
21
- return self
22
- end
23
-
24
- def remove_shipments(params={})
25
- response = EasyPost.make_request(:post, url + '/remove_shipments', @api_key, params)
26
- self.refresh_from(response, @api_key, true)
27
-
28
- return self
29
- end
30
-
31
- def add_shipments(params={})
32
- response = EasyPost.make_request(:post, url + '/add_shipments', @api_key, params)
33
- self.refresh_from(response, @api_key, true)
34
-
35
- return self
36
- end
37
-
38
- def stamp_and_barcode_by_reference(params={})
39
- response = EasyPost.make_request(:get, url + '/stamp_and_barcode_by_reference', @api_key, params)
40
-
41
- return response
42
- end
43
-
44
- def create_scan_form(params={})
45
- response = EasyPost.make_request(:post, url + '/scan_form', @api_key, params)
46
-
47
- return response
48
- end
49
- end
@@ -1,9 +0,0 @@
1
- class EasyPost::Brand < EasyPost::Resource
2
- def url
3
- if user_id.nil? || user_id.empty?
4
- raise EasyPost::Error, "Missing user_id: #{self.class} instance is missing user_id"
5
- end
6
-
7
- "#{::EasyPost::User.url}/#{CGI.escape(user_id)}/brand"
8
- end
9
- end
@@ -1,5 +0,0 @@
1
- class EasyPost::CarrierAccount < EasyPost::Resource
2
- def self.types
3
- EasyPost::CarrierType.all
4
- end
5
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::CarrierType < EasyPost::Resource
2
- end
@@ -1,5 +0,0 @@
1
- class EasyPost::CustomsInfo < EasyPost::Resource
2
- def self.all(filters={}, api_key=nil)
3
- raise NotImplementedError.new('CustomsInfo.all not implemented.')
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class EasyPost::CustomsItem < EasyPost::Resource
2
- def self.all(filters={}, api_key=nil)
3
- raise NotImplementedError.new('CustomsItem.all not implemented.')
4
- end
5
- end
@@ -1,31 +0,0 @@
1
- class EasyPost::Error < StandardError
2
- attr_reader :message
3
- attr_reader :status
4
- attr_reader :http_status # deprecated
5
- attr_reader :http_body
6
- attr_reader :code
7
- attr_reader :errors
8
-
9
- def initialize(message = nil, status = nil, code = nil, errors = nil, http_body = nil)
10
- @message = message
11
- @status = status
12
- @http_status = status # deprecated
13
- @code = code
14
- @errors = errors
15
- @http_body = http_body
16
-
17
- super(message)
18
- end
19
-
20
- def to_s
21
- "#{code} (#{status}): #{message} #{errors}".strip
22
- end
23
-
24
- def ==(other)
25
- other.is_a?(EasyPost::Error) &&
26
- message == other.message &&
27
- status == other.status &&
28
- code == other.code &&
29
- errors == other.errors
30
- end
31
- end
@@ -1,7 +0,0 @@
1
- require 'json'
2
-
3
- class EasyPost::Event < EasyPost::Resource
4
- def self.receive(values)
5
- return EasyPost::Util::convert_to_easypost_object(JSON.parse(values), nil)
6
- end
7
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::Insurance < EasyPost::Resource
2
- end
@@ -1,151 +0,0 @@
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
18
-
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
24
-
25
- def to_s(*args)
26
- JSON.dump(@values)
27
- end
28
-
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
33
-
34
- def refresh_from(values, api_key, partial=false)
35
- @api_key = api_key
36
-
37
- added = Set.new(values.keys - @values.keys)
38
-
39
- instance_eval do
40
- add_accessors(added)
41
- end
42
-
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)
47
- end
48
- end
49
-
50
- def [](k)
51
- @values[k.to_s]
52
- end
53
-
54
- def []=(k, v)
55
- send(:"#{k}=", v)
56
- end
57
-
58
- def keys
59
- @values.keys
60
- end
61
-
62
- def values
63
- @values.values
64
- end
65
-
66
- def to_json(options = {})
67
- JSON.dump(@values)
68
- end
69
-
70
- def as_json(options = {})
71
- @values.as_json
72
- end
73
-
74
- def to_hash
75
- @values
76
- end
77
-
78
- def deconstruct_keys(_keys)
79
- @values.transform_keys(&:to_sym)
80
- end
81
-
82
- def each(&blk)
83
- @values.each(&blk)
84
- end
85
-
86
- def id=(id)
87
- @values[:id] = id
88
- end
89
-
90
- def id
91
- @values[:id]
92
- end
93
-
94
- protected
95
-
96
- def flatten_unsaved
97
- values = {}
98
- for key in @unsaved_values
99
- value = @values[key]
100
-
101
- values[key] = value
102
-
103
- if value.is_a?(EasyPost::EasyPostObject)
104
- values[key] = flatten_unsaved(value)
105
- end
106
- end
107
-
108
- return values
109
- end
110
-
111
- def metaclass
112
- class << self; self; end
113
- end
114
-
115
- def remove_accessors(keys)
116
- metaclass.instance_eval do
117
- keys.each do |k|
118
- next if @@immutable_values.include?(k)
119
- k_eq = :"#{k}="
120
- remove_method(k) if method_defined?(k)
121
- remove_method(k_eq) if method_defined?(k_eq)
122
- end
123
- end
124
- end
125
-
126
- def add_accessors(keys)
127
- metaclass.instance_eval do
128
- keys.each do |k|
129
- next if @@immutable_values.include?(k)
130
- k = k.to_s
131
- k_eq = :"#{k}="
132
- define_method(k) { @values[k] }
133
- define_method(k_eq) do |v|
134
- @values[k] = v
135
- @unsaved_values.add(k)
136
-
137
- cur = self
138
- cur_parent = self.parent
139
- while cur_parent
140
- if cur.name
141
- cur_parent.unsaved_values.add(cur.name)
142
- end
143
-
144
- cur = cur_parent
145
- cur_parent = cur.parent
146
- end
147
- end
148
- end
149
- end
150
- end
151
- end
@@ -1,28 +0,0 @@
1
- class EasyPost::Order < EasyPost::Resource
2
-
3
- def get_rates(params={})
4
- response = EasyPost.make_request(:get, url + '/rates', @api_key, params)
5
- self.refresh_from(response, @api_key, true)
6
-
7
- return self
8
- end
9
-
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
17
-
18
- response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
19
- self.refresh_from(response, @api_key, true)
20
-
21
- return self
22
- end
23
-
24
- def self.all(filters={}, api_key=nil)
25
- raise NotImplementedError.new('Order.all not implemented.')
26
- end
27
-
28
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::Parcel < EasyPost::Resource
2
- end
@@ -1,26 +0,0 @@
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
9
-
10
- response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
11
- self.refresh_from(response, @api_key, true)
12
-
13
- return self
14
- end
15
-
16
- def cancel(params={})
17
- response = EasyPost.make_request(:post, url + '/cancel', @api_key, params)
18
- self.refresh_from(response, @api_key, true)
19
-
20
- return self
21
- end
22
-
23
- def self.all(filters={}, api_key=nil)
24
- raise NotImplementedError.new('Pickup.all not implemented.')
25
- end
26
- end
@@ -1,3 +0,0 @@
1
- class EasyPost::PickupRate < EasyPost::Resource
2
-
3
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::PostageLabel < EasyPost::Resource
2
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::PrintJob < EasyPost::Resource
2
- end
@@ -1,24 +0,0 @@
1
- class EasyPost::Printer < EasyPost::Resource
2
-
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
9
-
10
- def print(params={})
11
- if params.instance_of?(EasyPost::PostageLabel)
12
- temp = params.clone
13
- params = {}
14
- params[:postage_label] = temp
15
- end
16
-
17
- response = EasyPost.make_request(
18
- :post, url + '/print_postage_label', @api_key, params
19
- )
20
- true
21
- rescue
22
- false
23
- end
24
- end
data/lib/easypost/rate.rb DELETED
@@ -1,2 +0,0 @@
1
- class EasyPost::Rate < EasyPost::Resource
2
- end
@@ -1,2 +0,0 @@
1
- class EasyPost::Refund < EasyPost::Resource
2
- end
@@ -1,29 +0,0 @@
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
6
-
7
- response = EasyPost.make_request(:post, url, api_key, params)
8
- return EasyPost::Util.convert_to_easypost_object(response, api_key)
9
- end
10
-
11
- def self.retrieve(params, api_key=nil)
12
- id = if params.is_a?(String)
13
- params
14
- else
15
- params[:id]
16
- end
17
-
18
- instance = self.new(id, api_key)
19
- instance.refresh
20
- return instance
21
- end
22
-
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
28
- end
29
- end
@@ -1,75 +0,0 @@
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
7
-
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.)')
11
- end
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"
16
- end
17
- end
18
-
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}")
22
- end
23
- return "#{self.class.url}/#{CGI.escape(id)}"
24
- end
25
-
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
31
-
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
36
-
37
- def self.retrieve(id, api_key=nil)
38
- instance = self.new(id, api_key)
39
- instance.refresh
40
- return instance
41
- end
42
-
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
49
-
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] }
60
-
61
- for key in @unsaved_values
62
- value = values[key]
63
- if value.is_a?(EasyPost::EasyPostObject)
64
- values[key] = value.flatten_unsaved
65
- end
66
- end
67
-
68
- wrapped_params = {self.class.class_name => values}
69
-
70
- response = EasyPost.make_request(:put, url, @api_key, wrapped_params)
71
- refresh_from(response, api_key)
72
- end
73
- return self
74
- end
75
- end
@@ -1,6 +0,0 @@
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)
5
- end
6
- end
@@ -1,129 +0,0 @@
1
- class EasyPost::Shipment < EasyPost::Resource
2
- def get_rates(params={})
3
- response = EasyPost.make_request(:get, url + '/rates', @api_key, params)
4
- self.refresh_from(response, @api_key, true)
5
-
6
- return self
7
- end
8
-
9
- def regenerate_rates(params={})
10
- response = EasyPost.make_request(:post, url + '/rerate', @api_key, params)
11
- self.refresh_from(response, @api_key, true)
12
-
13
- return self
14
- end
15
-
16
- def get_smartrates
17
- response = EasyPost.make_request(:get, url + '/smartrate', @api_key)
18
-
19
- return response.fetch('result', [])
20
- end
21
-
22
- def buy(params={})
23
- if params.instance_of?(EasyPost::Rate)
24
- temp = params.clone
25
- params = {}
26
- params[:rate] = temp
27
- end
28
-
29
- response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
30
- self.refresh_from(response, @api_key, true)
31
-
32
- return self
33
- end
34
-
35
- def insure(params={})
36
- if params.is_a?(Integer) || params.is_a?(Float)
37
- temp = params.clone
38
- params = {}
39
- params[:amount] = temp
40
- end
41
-
42
- response = EasyPost.make_request(:post, url + '/insure', @api_key, params)
43
- self.refresh_from(response, @api_key, true)
44
-
45
- return self
46
- end
47
-
48
- def refund(params={})
49
- response = EasyPost.make_request(:get, url + '/refund', @api_key, params)
50
- self.refresh_from(response, @api_key, true)
51
-
52
- return self
53
- end
54
-
55
- def print(params={})
56
- if params.instance_of?(EasyPost::Printer)
57
- return params.print(self.postage_label)
58
- end
59
- return false
60
- end
61
-
62
- def label(params={})
63
- if params.is_a?(String)
64
- temp = params.clone
65
- params = {}
66
- params[:file_format] = temp
67
- end
68
-
69
- response = EasyPost.make_request(:get, url + '/label', @api_key, params)
70
- self.refresh_from(response, @api_key, true)
71
-
72
- return self
73
- end
74
-
75
- def lowest_rate(carriers=[], services=[])
76
- lowest = nil
77
-
78
- self.get_rates unless self.rates
79
-
80
- carriers = EasyPost::Util.normalize_string_list(carriers)
81
-
82
- negative_carriers = []
83
- carriers_copy = carriers.clone
84
- carriers_copy.each do |carrier|
85
- if carrier[0,1] == '!'
86
- negative_carriers << carrier[1..-1]
87
- carriers.delete(carrier)
88
- end
89
- end
90
-
91
- services = EasyPost::Util.normalize_string_list(services)
92
-
93
- negative_services = []
94
- services_copy = services.clone
95
- services_copy.each do |service|
96
- if service[0,1] == '!'
97
- negative_services << service[1..-1]
98
- services.delete(service)
99
- end
100
- end
101
-
102
- self.rates.each do |k|
103
-
104
- rate_carrier = k.carrier.downcase
105
- if carriers.size() > 0 && !carriers.include?(rate_carrier)
106
- next
107
- end
108
- if negative_carriers.size() > 0 && negative_carriers.include?(rate_carrier)
109
- next
110
- end
111
-
112
- rate_service = k.service.downcase
113
- if services.size() > 0 && !services.include?(rate_service)
114
- next
115
- end
116
- if negative_services.size() > 0 && negative_services.include?(rate_service)
117
- next
118
- end
119
-
120
- if lowest == nil || k.rate.to_f < lowest.rate.to_f
121
- lowest = k
122
- end
123
- end
124
-
125
- raise EasyPost::Error.new('No rates found.') if lowest == nil
126
-
127
- return lowest
128
- end
129
- end