easypost 3.1.4 → 5.1.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 (148) 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 +71 -0
  8. data/.gitignore +27 -17
  9. data/.gitmodules +3 -0
  10. data/CHANGELOG.md +378 -0
  11. data/Gemfile +2 -0
  12. data/Makefile +70 -0
  13. data/README.md +193 -74
  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 +178 -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/customs_info.rb +5 -0
  63. data/lib/easypost/models/customs_item.rb +5 -0
  64. data/lib/easypost/models/end_shipper.rb +5 -0
  65. data/lib/easypost/models/error.rb +21 -0
  66. data/lib/easypost/models/event.rb +5 -0
  67. data/lib/easypost/models/insurance.rb +6 -0
  68. data/lib/easypost/models/order.rb +9 -0
  69. data/lib/easypost/models/parcel.rb +5 -0
  70. data/lib/easypost/models/payload.rb +5 -0
  71. data/lib/easypost/models/payment_method.rb +5 -0
  72. data/lib/easypost/models/pickup.rb +9 -0
  73. data/lib/easypost/models/pickup_rate.rb +5 -0
  74. data/lib/easypost/models/postage_label.rb +5 -0
  75. data/lib/easypost/models/rate.rb +5 -0
  76. data/lib/easypost/models/referral.rb +5 -0
  77. data/lib/easypost/models/refund.rb +5 -0
  78. data/lib/easypost/models/report.rb +5 -0
  79. data/lib/easypost/models/scan_form.rb +6 -0
  80. data/lib/easypost/models/shipment.rb +10 -0
  81. data/lib/easypost/models/tax_identifier.rb +6 -0
  82. data/lib/easypost/models/tracker.rb +5 -0
  83. data/lib/easypost/models/user.rb +5 -0
  84. data/lib/easypost/models/webhook.rb +6 -0
  85. data/lib/easypost/models.rb +35 -0
  86. data/lib/easypost/services/address.rb +50 -0
  87. data/lib/easypost/services/api_key.rb +8 -0
  88. data/lib/easypost/services/base.rb +27 -0
  89. data/lib/easypost/services/batch.rb +53 -0
  90. data/lib/easypost/services/beta_rate.rb +12 -0
  91. data/lib/easypost/services/beta_referral_customer.rb +40 -0
  92. data/lib/easypost/services/billing.rb +75 -0
  93. data/lib/easypost/services/carrier_account.rb +44 -0
  94. data/lib/easypost/services/carrier_metadata.rb +22 -0
  95. data/lib/easypost/services/customs_info.rb +17 -0
  96. data/lib/easypost/services/customs_item.rb +15 -0
  97. data/lib/easypost/services/end_shipper.rb +31 -0
  98. data/lib/easypost/services/event.rb +32 -0
  99. data/lib/easypost/services/insurance.rb +26 -0
  100. data/lib/easypost/services/order.rb +30 -0
  101. data/lib/easypost/services/parcel.rb +16 -0
  102. data/lib/easypost/services/pickup.rb +40 -0
  103. data/lib/easypost/services/rate.rb +8 -0
  104. data/lib/easypost/services/referral_customer.rb +103 -0
  105. data/lib/easypost/services/refund.rb +26 -0
  106. data/lib/easypost/services/report.rb +42 -0
  107. data/lib/easypost/services/scan_form.rb +25 -0
  108. data/lib/easypost/services/shipment.rb +106 -0
  109. data/lib/easypost/services/tracker.rb +38 -0
  110. data/lib/easypost/services/user.rb +66 -0
  111. data/lib/easypost/services/webhook.rb +34 -0
  112. data/lib/easypost/services.rb +32 -0
  113. data/lib/easypost/util.rb +167 -103
  114. data/lib/easypost/utilities/constants.rb +5 -0
  115. data/lib/easypost/utilities/json.rb +23 -0
  116. data/lib/easypost/utilities/static_mapper.rb +73 -0
  117. data/lib/easypost/utilities/system.rb +36 -0
  118. data/lib/easypost/version.rb +3 -1
  119. data/lib/easypost.rb +21 -137
  120. metadata +253 -49
  121. data/.travis.yml +0 -9
  122. data/CHANGELOG +0 -207
  123. data/lib/easypost/address.rb +0 -60
  124. data/lib/easypost/batch.rb +0 -53
  125. data/lib/easypost/carrier_account.rb +0 -8
  126. data/lib/easypost/customs_info.rb +0 -9
  127. data/lib/easypost/customs_item.rb +0 -9
  128. data/lib/easypost/error.rb +0 -33
  129. data/lib/easypost/event.rb +0 -10
  130. data/lib/easypost/insurance.rb +0 -4
  131. data/lib/easypost/item.rb +0 -10
  132. data/lib/easypost/object.rb +0 -149
  133. data/lib/easypost/order.rb +0 -30
  134. data/lib/easypost/parcel.rb +0 -4
  135. data/lib/easypost/pickup.rb +0 -30
  136. data/lib/easypost/pickup_rate.rb +0 -5
  137. data/lib/easypost/postage_label.rb +0 -4
  138. data/lib/easypost/print_job.rb +0 -6
  139. data/lib/easypost/printer.rb +0 -28
  140. data/lib/easypost/rate.rb +0 -4
  141. data/lib/easypost/refund.rb +0 -4
  142. data/lib/easypost/report.rb +0 -31
  143. data/lib/easypost/resource.rb +0 -77
  144. data/lib/easypost/scan_form.rb +0 -8
  145. data/lib/easypost/shipment.rb +0 -120
  146. data/lib/easypost/tracker.rb +0 -15
  147. data/lib/easypost/user.rb +0 -47
  148. data/lib/easypost/webhook.rb +0 -31
@@ -1,31 +0,0 @@
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
7
-
8
- response = EasyPost.make_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
18
-
19
- instance = self.new(id, api_key)
20
- instance.refresh
21
- return instance
22
- end
23
-
24
- def self.all(filters={}, api_key=nil)
25
- url = "#{self.url}/#{filters[:type]}"
26
-
27
- response = EasyPost.make_request(:get, url, api_key, filters)
28
- return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
29
- end
30
- end
31
- end
@@ -1,77 +0,0 @@
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
8
-
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 "/v2/#{CGI.escape(self.class_name.downcase)}es"
15
- else
16
- return "/v2/#{CGI.escape(class_name.downcase)}s"
17
- end
18
- 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)}"
25
- end
26
-
27
- def refresh
28
- response = EasyPost.make_request(:get, url, @api_key, @retrieve_options)
29
- refresh_from(response, api_key)
30
- return self
31
- end
32
-
33
- def self.all(filters={}, api_key=nil)
34
- response = EasyPost.make_request(:get, url, api_key, filters)
35
- return Util.convert_to_easypost_object(response, api_key)
36
- end
37
-
38
- def self.retrieve(id, api_key=nil)
39
- instance = self.new(id, api_key)
40
- instance.refresh
41
- return instance
42
- end
43
-
44
- def self.create(params={}, api_key=nil)
45
- wrapped_params = {}
46
- wrapped_params[self.class_name().to_sym] = params
47
- response = EasyPost.make_request(:post, self.url, api_key, wrapped_params)
48
- return Util.convert_to_easypost_object(response, api_key)
49
- end
50
-
51
- def delete
52
- response = EasyPost.make_request(:delete, url, @api_key)
53
- refresh_from(response, api_key)
54
- return self
55
- end
56
-
57
- def save
58
- if @unsaved_values.length > 0
59
- values = {}
60
- @unsaved_values.each { |k| values[k] = @values[k] }
61
-
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
67
- end
68
-
69
- wrapped_params = {self.class.class_name => values}
70
-
71
- response = EasyPost.make_request(:put, url, @api_key, wrapped_params)
72
- refresh_from(response, api_key)
73
- end
74
- return self
75
- end
76
- end
77
- end
@@ -1,8 +0,0 @@
1
- module EasyPost
2
- class ScanForm < Resource
3
- def self.create(params={}, api_key=nil)
4
- response = EasyPost.make_request(:post, self.url, api_key, params)
5
- return Util.convert_to_easypost_object(response, api_key)
6
- end
7
- end
8
- end
@@ -1,120 +0,0 @@
1
- module EasyPost
2
- class Shipment < Resource
3
-
4
- def get_rates(params={})
5
- response = EasyPost.make_request(:get, url + '/rates', @api_key, params)
6
- self.refresh_from(response, @api_key, true)
7
-
8
- return self
9
- end
10
-
11
- def buy(params={})
12
- if params.instance_of?(EasyPost::Rate)
13
- temp = params.clone
14
- params = {}
15
- params[:rate] = temp
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 insure(params={})
25
- if params.is_a?(Integer) || params.is_a?(Float)
26
- temp = params.clone
27
- params = {}
28
- params[:amount] = temp
29
- end
30
-
31
- response = EasyPost.make_request(:post, url + '/insure', @api_key, params)
32
- self.refresh_from(response, @api_key, true)
33
-
34
- return self
35
- end
36
-
37
- def refund(params={})
38
- response = EasyPost.make_request(:get, url + '/refund', @api_key, params)
39
- self.refresh_from(response, @api_key, true)
40
-
41
- return self
42
- end
43
-
44
- def print(params={})
45
- if params.instance_of?(EasyPost::Printer)
46
- return params.print(self.postage_label)
47
- end
48
- return false
49
- end
50
-
51
- def label(params={})
52
- if params.is_a?(String)
53
- temp = params.clone
54
- params = {}
55
- params[:file_format] = temp
56
- end
57
-
58
- response = EasyPost.make_request(:get, url + '/label', @api_key, params)
59
- self.refresh_from(response, @api_key, true)
60
-
61
- return self
62
- end
63
-
64
- def lowest_rate(carriers=[], services=[])
65
- lowest = nil
66
-
67
- self.get_rates unless self.rates
68
-
69
- carriers = EasyPost::Util.normalize_string_list(carriers)
70
-
71
- negative_carriers = []
72
- carriers_copy = carriers.clone
73
- carriers_copy.each do |carrier|
74
- if carrier[0,1] == '!'
75
- negative_carriers << carrier[1..-1]
76
- carriers.delete(carrier)
77
- end
78
- end
79
-
80
- services = EasyPost::Util.normalize_string_list(services)
81
-
82
- negative_services = []
83
- services_copy = services.clone
84
- services_copy.each do |service|
85
- if service[0,1] == '!'
86
- negative_services << service[1..-1]
87
- services.delete(service)
88
- end
89
- end
90
-
91
- self.rates.each do |k|
92
-
93
- rate_carrier = k.carrier.downcase
94
- if carriers.size() > 0 && !carriers.include?(rate_carrier)
95
- next
96
- end
97
- if negative_carriers.size() > 0 && negative_carriers.include?(rate_carrier)
98
- next
99
- end
100
-
101
- rate_service = k.service.downcase
102
- if services.size() > 0 && !services.include?(rate_service)
103
- next
104
- end
105
- if negative_services.size() > 0 && negative_services.include?(rate_service)
106
- next
107
- end
108
-
109
- if lowest == nil || k.rate.to_f < lowest.rate.to_f
110
- lowest = k
111
- end
112
- end
113
-
114
- raise Error.new('No rates found.') if lowest == nil
115
-
116
- return lowest
117
- end
118
-
119
- end
120
- end
@@ -1,15 +0,0 @@
1
- module EasyPost
2
- class Tracker < Resource
3
- def self.create_list(params={}, api_key=nil)
4
- url = self.url + '/create_list'
5
- response = EasyPost.make_request(:post, url, api_key, params)
6
- return true
7
- end
8
-
9
- def self.all_updated(params={}, api_key=nil)
10
- url = self.url + '/all_updated'
11
- response = EasyPost.make_request(:get, url, api_key, params)
12
- return Util.convert_to_easypost_object(response, api_key)
13
- end
14
- end
15
- end
data/lib/easypost/user.rb DELETED
@@ -1,47 +0,0 @@
1
- module EasyPost
2
- class User < Resource
3
- def self.create(params={}, api_key=nil)
4
- response = EasyPost.make_request(:post, self.url, api_key, {self.class_name.to_sym => params})
5
- return Util.convert_to_easypost_object(response, api_key)
6
- end
7
-
8
- def save
9
- if @unsaved_values.length > 0
10
- values = {}
11
- @unsaved_values.each { |k| values[k] = @values[k] }
12
-
13
- wrapped_params = {user: values}
14
-
15
- response = EasyPost.make_request(:put, url, @api_key, wrapped_params)
16
- refresh_from(response, api_key)
17
- end
18
- return self
19
- end
20
-
21
- def self.retrieve_me
22
- self.all
23
- end
24
-
25
- def self.all_api_keys
26
- response = EasyPost.make_request(:get, "/api_keys", @api_key)
27
- return Util.convert_to_easypost_object(response, api_key)
28
- end
29
-
30
- def api_keys
31
- api_keys = EasyPost::User.all_api_keys
32
-
33
- if api_keys.id == self.id
34
- my_api_keys = api_keys.keys
35
- else
36
- for child in api_keys.children
37
- if child.id == self.id
38
- my_api_keys = child.keys
39
- break
40
- end
41
- end
42
- end
43
-
44
- my_api_keys
45
- end
46
- end
47
- end
@@ -1,31 +0,0 @@
1
- module EasyPost
2
- class Webhook < Resource
3
- def update(params={})
4
- # NOTE: This method is redefined here since the "url" method conflicts
5
- # with the objects field
6
- unless self.id
7
- raise Error.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{self.id.inspect}")
8
- end
9
- instance_url = "#{self.class.url}/#{CGI.escape(id)}"
10
-
11
- response = EasyPost.make_request(:put, instance_url, @api_key, params)
12
- self.refresh_from(response, api_key, true)
13
-
14
- return self
15
- end
16
-
17
- def delete
18
- # NOTE: This method is redefined here since the "url" method conflicts
19
- # with the objects field
20
- unless self.id
21
- raise Error.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{self.id.inspect}")
22
- end
23
- instance_url = "#{self.class.url}/#{CGI.escape(id)}"
24
-
25
- response = EasyPost.make_request(:delete, instance_url, @api_key)
26
- refresh_from(response, api_key)
27
-
28
- return self
29
- end
30
- end
31
- end