stripe 4.9.0 → 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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +10 -0
  3. data/.rubocop.yml +28 -4
  4. data/.rubocop_todo.yml +11 -22
  5. data/.travis.yml +3 -6
  6. data/.vscode/extensions.json +7 -0
  7. data/.vscode/settings.json +8 -0
  8. data/CHANGELOG.md +102 -2
  9. data/Gemfile +2 -10
  10. data/README.md +96 -40
  11. data/Rakefile +8 -7
  12. data/VERSION +1 -1
  13. data/lib/stripe.rb +64 -85
  14. data/lib/stripe/api_operations/delete.rb +23 -1
  15. data/lib/stripe/api_operations/list.rb +0 -6
  16. data/lib/stripe/api_operations/nested_resource.rb +14 -7
  17. data/lib/stripe/api_operations/request.rb +3 -7
  18. data/lib/stripe/api_operations/save.rb +1 -3
  19. data/lib/stripe/api_resource.rb +50 -2
  20. data/lib/stripe/connection_manager.rb +141 -0
  21. data/lib/stripe/error_object.rb +94 -0
  22. data/lib/stripe/errors.rb +22 -9
  23. data/lib/stripe/list_object.rb +11 -5
  24. data/lib/stripe/multipart_encoder.rb +131 -0
  25. data/lib/stripe/object_types.rb +94 -0
  26. data/lib/stripe/resources.rb +77 -0
  27. data/lib/stripe/{account.rb → resources/account.rb} +49 -27
  28. data/lib/stripe/{account_link.rb → resources/account_link.rb} +1 -1
  29. data/lib/stripe/resources/alipay_account.rb +34 -0
  30. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +1 -1
  31. data/lib/stripe/resources/application_fee.rb +13 -0
  32. data/lib/stripe/resources/application_fee_refund.rb +30 -0
  33. data/lib/stripe/{balance.rb → resources/balance.rb} +1 -1
  34. data/lib/stripe/{balance_transaction.rb → resources/balance_transaction.rb} +1 -5
  35. data/lib/stripe/{bank_account.rb → resources/bank_account.rb} +14 -4
  36. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +3 -3
  37. data/lib/stripe/{bitcoin_transaction.rb → resources/bitcoin_transaction.rb} +1 -1
  38. data/lib/stripe/resources/capability.rb +33 -0
  39. data/lib/stripe/{card.rb → resources/card.rb} +12 -4
  40. data/lib/stripe/resources/charge.rb +22 -0
  41. data/lib/stripe/{checkout → resources/checkout}/session.rb +2 -2
  42. data/lib/stripe/{country_spec.rb → resources/country_spec.rb} +1 -1
  43. data/lib/stripe/{coupon.rb → resources/coupon.rb} +2 -2
  44. data/lib/stripe/resources/credit_note.rb +22 -0
  45. data/lib/stripe/resources/customer.rb +35 -0
  46. data/lib/stripe/resources/customer_balance_transaction.rb +30 -0
  47. data/lib/stripe/resources/discount.rb +7 -0
  48. data/lib/stripe/{dispute.rb → resources/dispute.rb} +9 -7
  49. data/lib/stripe/{ephemeral_key.rb → resources/ephemeral_key.rb} +5 -2
  50. data/lib/stripe/{event.rb → resources/event.rb} +1 -1
  51. data/lib/stripe/{exchange_rate.rb → resources/exchange_rate.rb} +1 -1
  52. data/lib/stripe/{file.rb → resources/file.rb} +8 -11
  53. data/lib/stripe/{file_link.rb → resources/file_link.rb} +2 -2
  54. data/lib/stripe/resources/invoice.rb +73 -0
  55. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +2 -2
  56. data/lib/stripe/{invoice_line_item.rb → resources/invoice_line_item.rb} +1 -1
  57. data/lib/stripe/resources/issuing/authorization.rb +33 -0
  58. data/lib/stripe/resources/issuing/card.rb +24 -0
  59. data/lib/stripe/{issuing → resources/issuing}/card_details.rb +1 -1
  60. data/lib/stripe/{issuing → resources/issuing}/cardholder.rb +2 -2
  61. data/lib/stripe/{issuing → resources/issuing}/dispute.rb +2 -2
  62. data/lib/stripe/{issuing → resources/issuing}/transaction.rb +2 -2
  63. data/lib/stripe/resources/login_link.rb +14 -0
  64. data/lib/stripe/resources/order.rb +32 -0
  65. data/lib/stripe/{order_return.rb → resources/order_return.rb} +1 -1
  66. data/lib/stripe/resources/payment_intent.rb +42 -0
  67. data/lib/stripe/resources/payment_method.rb +32 -0
  68. data/lib/stripe/resources/payout.rb +22 -0
  69. data/lib/stripe/{person.rb → resources/person.rb} +8 -3
  70. data/lib/stripe/{plan.rb → resources/plan.rb} +1 -1
  71. data/lib/stripe/{product.rb → resources/product.rb} +3 -3
  72. data/lib/stripe/resources/radar/early_fraud_warning.rb +11 -0
  73. data/lib/stripe/{radar → resources/radar}/value_list.rb +2 -2
  74. data/lib/stripe/{radar → resources/radar}/value_list_item.rb +2 -2
  75. data/lib/stripe/{recipient.rb → resources/recipient.rb} +2 -6
  76. data/lib/stripe/{recipient_transfer.rb → resources/recipient_transfer.rb} +1 -1
  77. data/lib/stripe/{refund.rb → resources/refund.rb} +1 -1
  78. data/lib/stripe/{reporting → resources/reporting}/report_run.rb +2 -2
  79. data/lib/stripe/{reporting → resources/reporting}/report_type.rb +2 -2
  80. data/lib/stripe/resources/reversal.rb +29 -0
  81. data/lib/stripe/resources/review.rb +20 -0
  82. data/lib/stripe/resources/setup_intent.rb +32 -0
  83. data/lib/stripe/{sigma → resources/sigma}/scheduled_query_run.rb +2 -2
  84. data/lib/stripe/{sku.rb → resources/sku.rb} +3 -3
  85. data/lib/stripe/{source.rb → resources/source.rb} +17 -15
  86. data/lib/stripe/{source_transaction.rb → resources/source_transaction.rb} +1 -1
  87. data/lib/stripe/resources/subscription.rb +25 -0
  88. data/lib/stripe/{subscription_item.rb → resources/subscription_item.rb} +5 -2
  89. data/lib/stripe/resources/subscription_schedule.rb +32 -0
  90. data/lib/stripe/resources/tax_id.rb +26 -0
  91. data/lib/stripe/resources/tax_rate.rb +11 -0
  92. data/lib/stripe/{terminal → resources/terminal}/connection_token.rb +2 -2
  93. data/lib/stripe/{terminal → resources/terminal}/location.rb +3 -2
  94. data/lib/stripe/{terminal → resources/terminal}/reader.rb +3 -2
  95. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +1 -1
  96. data/lib/stripe/{token.rb → resources/token.rb} +1 -1
  97. data/lib/stripe/resources/topup.rb +22 -0
  98. data/lib/stripe/resources/transfer.rb +26 -0
  99. data/lib/stripe/resources/usage_record.rb +7 -0
  100. data/lib/stripe/{usage_record_summary.rb → resources/usage_record_summary.rb} +1 -1
  101. data/lib/stripe/{webhook_endpoint.rb → resources/webhook_endpoint.rb} +2 -2
  102. data/lib/stripe/singleton_api_resource.rb +3 -1
  103. data/lib/stripe/stripe_client.rb +347 -218
  104. data/lib/stripe/stripe_object.rb +72 -59
  105. data/lib/stripe/stripe_response.rb +53 -21
  106. data/lib/stripe/util.rb +54 -109
  107. data/lib/stripe/version.rb +1 -1
  108. data/lib/stripe/webhook.rb +5 -3
  109. data/stripe.gemspec +14 -5
  110. data/test/stripe/account_link_test.rb +1 -1
  111. data/test/stripe/account_test.rb +193 -32
  112. data/test/stripe/alipay_account_test.rb +1 -1
  113. data/test/stripe/api_operations_test.rb +3 -4
  114. data/test/stripe/api_resource_test.rb +119 -30
  115. data/test/stripe/apple_pay_domain_test.rb +18 -5
  116. data/test/stripe/application_fee_refund_test.rb +1 -1
  117. data/test/stripe/application_fee_test.rb +45 -1
  118. data/test/stripe/balance_test.rb +1 -1
  119. data/test/stripe/balance_transaction_test.rb +20 -0
  120. data/test/stripe/bank_account_test.rb +1 -1
  121. data/test/stripe/capability_test.rb +45 -0
  122. data/test/stripe/charge_test.rb +13 -8
  123. data/test/stripe/checkout/session_test.rb +7 -1
  124. data/test/stripe/connection_manager_test.rb +138 -0
  125. data/test/stripe/country_spec_test.rb +1 -1
  126. data/test/stripe/coupon_test.rb +16 -6
  127. data/test/stripe/credit_note_test.rb +61 -0
  128. data/test/stripe/customer_balance_transaction_test.rb +37 -0
  129. data/test/stripe/customer_card_test.rb +1 -1
  130. data/test/stripe/customer_test.rb +151 -40
  131. data/test/stripe/dispute_test.rb +10 -1
  132. data/test/stripe/ephemeral_key_test.rb +8 -1
  133. data/test/stripe/errors_test.rb +30 -9
  134. data/test/stripe/exchange_rate_test.rb +1 -1
  135. data/test/stripe/file_link_test.rb +1 -1
  136. data/test/stripe/file_test.rb +19 -5
  137. data/test/stripe/invoice_item_test.rb +18 -7
  138. data/test/stripe/invoice_line_item_test.rb +1 -1
  139. data/test/stripe/invoice_test.rb +77 -9
  140. data/test/stripe/issuing/authorization_test.rb +33 -11
  141. data/test/stripe/issuing/card_test.rb +15 -6
  142. data/test/stripe/issuing/cardholder_test.rb +1 -1
  143. data/test/stripe/issuing/dispute_test.rb +1 -1
  144. data/test/stripe/issuing/transaction_test.rb +1 -1
  145. data/test/stripe/list_object_test.rb +1 -17
  146. data/test/stripe/login_link_test.rb +2 -2
  147. data/test/stripe/multipart_encoder_test.rb +130 -0
  148. data/test/stripe/oauth_test.rb +1 -1
  149. data/test/stripe/order_return_test.rb +1 -1
  150. data/test/stripe/order_test.rb +28 -3
  151. data/test/stripe/payment_intent_test.rb +31 -4
  152. data/test/stripe/payment_method_test.rb +84 -0
  153. data/test/stripe/payout_test.rb +8 -1
  154. data/test/stripe/person_test.rb +1 -1
  155. data/test/stripe/plan_test.rb +26 -20
  156. data/test/stripe/product_test.rb +16 -6
  157. data/test/stripe/radar/early_fraud_warning_test.rb +22 -0
  158. data/test/stripe/radar/value_list_item_test.rb +16 -6
  159. data/test/stripe/radar/value_list_test.rb +16 -6
  160. data/test/stripe/recipient_test.rb +18 -5
  161. data/test/stripe/refund_test.rb +1 -1
  162. data/test/stripe/reporting/report_run_test.rb +1 -1
  163. data/test/stripe/reporting/report_type_test.rb +1 -1
  164. data/test/stripe/reversal_test.rb +1 -1
  165. data/test/stripe/review_test.rb +1 -1
  166. data/test/stripe/setup_intent_test.rb +84 -0
  167. data/test/stripe/sigma/scheduled_query_run_test.rb +1 -1
  168. data/test/stripe/sku_test.rb +16 -6
  169. data/test/stripe/source_test.rb +14 -19
  170. data/test/stripe/source_transaction_test.rb +1 -1
  171. data/test/stripe/stripe_client_test.rb +242 -26
  172. data/test/stripe/stripe_object_test.rb +8 -36
  173. data/test/stripe/stripe_response_test.rb +71 -25
  174. data/test/stripe/subscription_item_test.rb +28 -6
  175. data/test/stripe/subscription_schedule_test.rb +19 -1
  176. data/test/stripe/subscription_test.rb +29 -9
  177. data/test/stripe/tax_id_test.rb +31 -0
  178. data/test/stripe/tax_rate_test.rb +43 -0
  179. data/test/stripe/terminal/connection_token_test.rb +1 -1
  180. data/test/stripe/terminal/location_test.rb +18 -1
  181. data/test/stripe/terminal/reader_test.rb +18 -1
  182. data/test/stripe/three_d_secure_test.rb +1 -1
  183. data/test/stripe/topup_test.rb +9 -1
  184. data/test/stripe/transfer_test.rb +46 -1
  185. data/test/stripe/usage_record_summary_test.rb +1 -1
  186. data/test/stripe/util_test.rb +1 -1
  187. data/test/stripe/webhook_endpoint_test.rb +18 -1
  188. data/test/stripe/webhook_test.rb +4 -4
  189. data/test/stripe_mock.rb +4 -3
  190. data/test/stripe_test.rb +1 -14
  191. data/test/test_helper.rb +14 -11
  192. metadata +117 -125
  193. data/lib/stripe/alipay_account.rb +0 -27
  194. data/lib/stripe/application_fee.rb +0 -23
  195. data/lib/stripe/application_fee_refund.rb +0 -22
  196. data/lib/stripe/charge.rb +0 -84
  197. data/lib/stripe/customer.rb +0 -90
  198. data/lib/stripe/invoice.rb +0 -48
  199. data/lib/stripe/issuer_fraud_record.rb +0 -9
  200. data/lib/stripe/issuing/authorization.rb +0 -22
  201. data/lib/stripe/issuing/card.rb +0 -18
  202. data/lib/stripe/login_link.rb +0 -11
  203. data/lib/stripe/order.rb +0 -31
  204. data/lib/stripe/payment_intent.rb +0 -26
  205. data/lib/stripe/payout.rb +0 -20
  206. data/lib/stripe/reversal.rb +0 -22
  207. data/lib/stripe/review.rb +0 -14
  208. data/lib/stripe/subscription.rb +0 -25
  209. data/lib/stripe/subscription_schedule.rb +0 -32
  210. data/lib/stripe/subscription_schedule_revision.rb +0 -25
  211. data/lib/stripe/topup.rb +0 -16
  212. data/lib/stripe/transfer.rb +0 -23
  213. data/lib/stripe/usage_record.rb +0 -14
  214. data/test/stripe/account_external_accounts_operations_test.rb +0 -69
  215. data/test/stripe/account_login_links_operations_test.rb +0 -21
  216. data/test/stripe/account_persons_operations_test.rb +0 -70
  217. data/test/stripe/application_fee_refunds_operations_test.rb +0 -56
  218. data/test/stripe/customer_sources_operations_test.rb +0 -64
  219. data/test/stripe/file_upload_test.rb +0 -76
  220. data/test/stripe/issuer_fraud_record_test.rb +0 -20
  221. data/test/stripe/subscription_schedule_revision_test.rb +0 -37
  222. data/test/stripe/subscription_schedule_revisions_operations_test.rb +0 -35
  223. data/test/stripe/transfer_reversals_operations_test.rb +0 -57
  224. data/test/stripe/usage_record_test.rb +0 -28
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
+ # Directly creating or retrieving BitcoinReceivers is deprecated. Please use
5
+ # the Sources API instead: https://stripe.com/docs/sources/bitcoin
4
6
  class BitcoinReceiver < APIResource
5
- # Directly creating or retrieving BitcoinReceivers is deprecated. Please use
6
- # the Sources API instead: https://stripe.com/docs/sources/bitcoin
7
7
  extend Stripe::APIOperations::List
8
8
 
9
- OBJECT_NAME = "bitcoin_receiver".freeze
9
+ OBJECT_NAME = "bitcoin_receiver"
10
10
 
11
11
  def self.resource_url
12
12
  "/v1/bitcoin/receivers"
@@ -6,7 +6,7 @@ module Stripe
6
6
  # Sources API instead: https://stripe.com/docs/sources/bitcoin
7
7
  extend Stripe::APIOperations::List
8
8
 
9
- OBJECT_NAME = "bitcoin_transaction".freeze
9
+ OBJECT_NAME = "bitcoin_transaction"
10
10
 
11
11
  def self.resource_url
12
12
  "/v1/bitcoin/transactions"
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class Capability < APIResource
5
+ extend Stripe::APIOperations::List
6
+ include Stripe::APIOperations::Save
7
+
8
+ OBJECT_NAME = "capability"
9
+
10
+ def resource_url
11
+ if !respond_to?(:account) || account.nil?
12
+ raise NotImplementedError,
13
+ "Capabilities cannot be accessed without an account ID."
14
+ end
15
+ "#{Account.resource_url}/#{CGI.escape(account)}/capabilities" \
16
+ "/#{CGI.escape(id)}"
17
+ end
18
+
19
+ def self.retrieve(_id, _opts = {})
20
+ raise NotImplementedError,
21
+ "Capabilities cannot be retrieve without an account ID. " \
22
+ "Retrieve a capability using Account.retrieve_capability(" \
23
+ "'account_id', 'capability_id')`"
24
+ end
25
+
26
+ def self.update(_id, _params = nil, _opts = nil)
27
+ raise NotImplementedError,
28
+ "Capabilities cannot be updated without an account ID. Update a " \
29
+ "capability using Account.update_capability('account_id', " \
30
+ "'capability_id', update_params)`"
31
+ end
32
+ end
33
+ end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Stripe
4
4
  class Card < APIResource
5
- include Stripe::APIOperations::Save
6
5
  include Stripe::APIOperations::Delete
7
6
  extend Stripe::APIOperations::List
7
+ include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "card".freeze
9
+ OBJECT_NAME = "card"
10
10
 
11
11
  def resource_url
12
12
  if respond_to?(:recipient) && !recipient.nil? && !recipient.empty?
@@ -19,11 +19,19 @@ module Stripe
19
19
  end
20
20
 
21
21
  def self.update(_id, _params = nil, _opts = nil)
22
- raise NotImplementedError, "Cards cannot be updated without a customer ID. Update a card using `c = customer.sources.retrieve('card_id'); c.save`"
22
+ raise NotImplementedError,
23
+ "Card cannot be updated without a customer ID or an account ID. " \
24
+ "Update a card using `Customer.update_source('customer_id', " \
25
+ "'card_id', update_params)` or `Account.update_external_account(" \
26
+ "'account_id', 'card_id', update_params)`"
23
27
  end
24
28
 
25
29
  def self.retrieve(_id, _opts = nil)
26
- raise NotImplementedError, "Cards cannot be retrieved without a customer ID. Retrieve a card using customer.sources.retrieve('card_id')"
30
+ raise NotImplementedError,
31
+ "Card cannot be retrieved without a customer ID or an account " \
32
+ "ID. Retrieve a card using `Customer.retrieve_source(" \
33
+ "'customer_id', 'card_id')` or " \
34
+ "`Account.retrieve_external_account('account_id', 'card_id')`"
27
35
  end
28
36
  end
29
37
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class Charge < APIResource
5
+ extend Stripe::APIOperations::Create
6
+ extend Stripe::APIOperations::List
7
+ include Stripe::APIOperations::Save
8
+
9
+ OBJECT_NAME = "charge"
10
+
11
+ custom_method :capture, http_verb: :post
12
+
13
+ def capture(params = {}, opts = {})
14
+ request_stripe_object(
15
+ method: :post,
16
+ path: resource_url + "/capture",
17
+ params: params,
18
+ opts: opts
19
+ )
20
+ end
21
+ end
22
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  module Stripe
4
4
  module Checkout
5
- class Session < Stripe::APIResource
5
+ class Session < APIResource
6
6
  extend Stripe::APIOperations::Create
7
7
 
8
- OBJECT_NAME = "checkout.session".freeze
8
+ OBJECT_NAME = "checkout.session"
9
9
  end
10
10
  end
11
11
  end
@@ -4,6 +4,6 @@ module Stripe
4
4
  class CountrySpec < APIResource
5
5
  extend Stripe::APIOperations::List
6
6
 
7
- OBJECT_NAME = "country_spec".freeze
7
+ OBJECT_NAME = "country_spec"
8
8
  end
9
9
  end
@@ -3,10 +3,10 @@
3
3
  module Stripe
4
4
  class Coupon < APIResource
5
5
  extend Stripe::APIOperations::Create
6
- include Stripe::APIOperations::Save
7
6
  include Stripe::APIOperations::Delete
8
7
  extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "coupon".freeze
10
+ OBJECT_NAME = "coupon"
11
11
  end
12
12
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class CreditNote < APIResource
5
+ extend Stripe::APIOperations::Create
6
+ extend Stripe::APIOperations::List
7
+ include Stripe::APIOperations::Save
8
+
9
+ OBJECT_NAME = "credit_note"
10
+
11
+ custom_method :void_credit_note, http_verb: :post, http_path: "void"
12
+
13
+ def void_credit_note(params = {}, opts = {})
14
+ request_stripe_object(
15
+ method: :post,
16
+ path: resource_url + "/void",
17
+ params: params,
18
+ opts: opts
19
+ )
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class Customer < APIResource
5
+ extend Stripe::APIOperations::Create
6
+ include Stripe::APIOperations::Delete
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+ extend Stripe::APIOperations::NestedResource
10
+
11
+ OBJECT_NAME = "customer"
12
+
13
+ nested_resource_class_methods :balance_transaction,
14
+ operations: %i[create retrieve update list]
15
+ nested_resource_class_methods :tax_id,
16
+ operations: %i[create retrieve delete list]
17
+
18
+ custom_method :delete_discount, http_verb: :delete, http_path: "discount"
19
+
20
+ save_nested_resource :source
21
+ nested_resource_class_methods :source,
22
+ operations: %i[create retrieve update delete list]
23
+
24
+ # The API request for deleting a card or bank account and for detaching a
25
+ # source object are the same.
26
+ class << self
27
+ alias detach_source delete_source
28
+ end
29
+
30
+ def delete_discount
31
+ resp, opts = request(:delete, resource_url + "/discount")
32
+ initialize_from(resp.data, opts, true)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class CustomerBalanceTransaction < APIResource
5
+ extend Stripe::APIOperations::List
6
+ include Stripe::APIOperations::Save
7
+
8
+ OBJECT_NAME = "customer_balance_transaction"
9
+
10
+ def resource_url
11
+ if !respond_to?(:customer) || customer.nil?
12
+ raise NotImplementedError,
13
+ "Customer Balance Transactions cannot be accessed without a customer ID."
14
+ end
15
+ "#{Customer.resource_url}/#{CGI.escape(customer)}/balance_transactions/#{CGI.escape(id)}"
16
+ end
17
+
18
+ def self.retrieve(_id, _opts = {})
19
+ raise NotImplementedError,
20
+ "Customer Balance Transactions cannot be retrieved without a customer ID. " \
21
+ "Retrieve a Customer Balance Transaction using Customer.retrieve_balance_transaction('cus_123', 'cbtxn_123')"
22
+ end
23
+
24
+ def self.update(_id, _params = nil, _opts = nil)
25
+ raise NotImplementedError,
26
+ "Customer Balance Transactions cannot be retrieved without a customer ID. " \
27
+ "Update a Customer Balance Transaction using Customer.update_balance_transaction('cus_123', 'cbtxn_123', params)"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class Discount < StripeObject
5
+ OBJECT_NAME = "discount"
6
+ end
7
+ end
@@ -5,15 +5,17 @@ module Stripe
5
5
  extend Stripe::APIOperations::List
6
6
  include Stripe::APIOperations::Save
7
7
 
8
- OBJECT_NAME = "dispute".freeze
8
+ OBJECT_NAME = "dispute"
9
9
 
10
- def close(params = {}, opts = {})
11
- resp, opts = request(:post, close_url, params, opts)
12
- initialize_from(resp.data, opts)
13
- end
10
+ custom_method :close, http_verb: :post
14
11
 
15
- def close_url
16
- resource_url + "/close"
12
+ def close(params = {}, opts = {})
13
+ request_stripe_object(
14
+ method: :post,
15
+ path: resource_url + "/close",
16
+ params: params,
17
+ opts: opts
18
+ )
17
19
  end
18
20
  end
19
21
  end
@@ -5,11 +5,14 @@ module Stripe
5
5
  extend Stripe::APIOperations::Create
6
6
  include Stripe::APIOperations::Delete
7
7
 
8
- OBJECT_NAME = "ephemeral_key".freeze
8
+ OBJECT_NAME = "ephemeral_key"
9
9
 
10
10
  def self.create(params = {}, opts = {})
11
11
  opts = Util.normalize_opts(opts)
12
- raise ArgumentError, "stripe_version must be specified to create an ephemeral key" unless opts[:stripe_version]
12
+ unless opts[:stripe_version]
13
+ raise ArgumentError,
14
+ "stripe_version must be specified to create an ephemeral key"
15
+ end
13
16
  super
14
17
  end
15
18
  end
@@ -4,6 +4,6 @@ module Stripe
4
4
  class Event < APIResource
5
5
  extend Stripe::APIOperations::List
6
6
 
7
- OBJECT_NAME = "event".freeze
7
+ OBJECT_NAME = "event"
8
8
  end
9
9
  end
@@ -4,6 +4,6 @@ module Stripe
4
4
  class ExchangeRate < APIResource
5
5
  extend Stripe::APIOperations::List
6
6
 
7
- OBJECT_NAME = "exchange_rate".freeze
7
+ OBJECT_NAME = "exchange_rate"
8
8
  end
9
9
  end
@@ -5,33 +5,30 @@ module Stripe
5
5
  extend Stripe::APIOperations::Create
6
6
  extend Stripe::APIOperations::List
7
7
 
8
+ OBJECT_NAME = "file"
9
+
8
10
  # This resource can have two different object names. In latter API
9
11
  # versions, only `file` is used, but since stripe-ruby may be used with
10
12
  # any API version, we need to support deserializing the older
11
13
  # `file_upload` object into the same class.
12
- OBJECT_NAME = "file".freeze
13
- OBJECT_NAME_ALT = "file_upload".freeze
14
+ OBJECT_NAME_ALT = "file_upload"
14
15
 
15
16
  def self.resource_url
16
17
  "/v1/files"
17
18
  end
18
19
 
19
20
  def self.create(params = {}, opts = {})
20
- # rest-client would accept a vanilla `File` for upload, but Faraday does
21
- # not. Support the old API by wrapping a `File`-like object with an
22
- # `UploadIO` object if we're given one.
23
- if params[:file] && params[:file].respond_to?(:path) && params[:file].respond_to?(:read)
24
- params[:file] = Faraday::UploadIO.new(params[:file], nil)
21
+ if params[:file] && !params[:file].is_a?(String)
22
+ unless params[:file].respond_to?(:read)
23
+ raise ArgumentError, "file must respond to `#read`"
24
+ end
25
25
  end
26
26
 
27
27
  opts = {
28
28
  api_base: Stripe.uploads_base,
29
- content_type: "multipart/form-data",
29
+ content_type: MultipartEncoder::MULTIPART_FORM_DATA,
30
30
  }.merge(Util.normalize_opts(opts))
31
31
  super
32
32
  end
33
33
  end
34
-
35
- # For backwards compatibility, the `File` class is aliased to `FileUpload`.
36
- FileUpload = File
37
34
  end
@@ -3,9 +3,9 @@
3
3
  module Stripe
4
4
  class FileLink < APIResource
5
5
  extend Stripe::APIOperations::Create
6
- include Stripe::APIOperations::Save
7
6
  extend Stripe::APIOperations::List
7
+ include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "file_link".freeze
9
+ OBJECT_NAME = "file_link"
10
10
  end
11
11
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class Invoice < APIResource
5
+ extend Stripe::APIOperations::Create
6
+ include Stripe::APIOperations::Delete
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+
10
+ OBJECT_NAME = "invoice"
11
+
12
+ custom_method :finalize_invoice, http_verb: :post, http_path: "finalize"
13
+ custom_method :mark_uncollectible, http_verb: :post
14
+ custom_method :pay, http_verb: :post
15
+ custom_method :send_invoice, http_verb: :post, http_path: "send"
16
+ custom_method :void_invoice, http_verb: :post, http_path: "void"
17
+
18
+ def finalize_invoice(params = {}, opts = {})
19
+ request_stripe_object(
20
+ method: :post,
21
+ path: resource_url + "/finalize",
22
+ params: params,
23
+ opts: opts
24
+ )
25
+ end
26
+
27
+ def mark_uncollectible(params = {}, opts = {})
28
+ request_stripe_object(
29
+ method: :post,
30
+ path: resource_url + "/mark_uncollectible",
31
+ params: params,
32
+ opts: opts
33
+ )
34
+ end
35
+
36
+ def pay(params = {}, opts = {})
37
+ request_stripe_object(
38
+ method: :post,
39
+ path: resource_url + "/pay",
40
+ params: params,
41
+ opts: opts
42
+ )
43
+ end
44
+
45
+ def send_invoice(params = {}, opts = {})
46
+ request_stripe_object(
47
+ method: :post,
48
+ path: resource_url + "/send",
49
+ params: params,
50
+ opts: opts
51
+ )
52
+ end
53
+
54
+ def void_invoice(params = {}, opts = {})
55
+ request_stripe_object(
56
+ method: :post,
57
+ path: resource_url + "/void",
58
+ params: params,
59
+ opts: opts
60
+ )
61
+ end
62
+
63
+ def self.upcoming(params, opts = {})
64
+ resp, opts = request(:get, resource_url + "/upcoming", params, opts)
65
+ Util.convert_to_stripe_object(resp.data, opts)
66
+ end
67
+
68
+ def self.list_upcoming_line_items(params, opts = {})
69
+ resp, opts = request(:get, resource_url + "/upcoming/lines", params, opts)
70
+ Util.convert_to_stripe_object(resp.data, opts)
71
+ end
72
+ end
73
+ end