stripe 4.24.0 → 5.0.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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -4
  3. data/.rubocop_todo.yml +10 -9
  4. data/.travis.yml +1 -5
  5. data/CHANGELOG.md +22 -0
  6. data/Gemfile +2 -12
  7. data/README.md +10 -10
  8. data/Rakefile +8 -7
  9. data/VERSION +1 -1
  10. data/lib/stripe.rb +56 -15
  11. data/lib/stripe/api_operations/list.rb +0 -6
  12. data/lib/stripe/connection_manager.rb +131 -0
  13. data/lib/stripe/error_object.rb +94 -0
  14. data/lib/stripe/errors.rb +15 -2
  15. data/lib/stripe/list_object.rb +2 -1
  16. data/lib/stripe/multipart_encoder.rb +131 -0
  17. data/lib/stripe/object_types.rb +0 -1
  18. data/lib/stripe/resources.rb +0 -1
  19. data/lib/stripe/resources/account.rb +1 -5
  20. data/lib/stripe/resources/account_link.rb +1 -1
  21. data/lib/stripe/resources/alipay_account.rb +1 -1
  22. data/lib/stripe/resources/apple_pay_domain.rb +1 -1
  23. data/lib/stripe/resources/application_fee.rb +1 -12
  24. data/lib/stripe/resources/application_fee_refund.rb +1 -1
  25. data/lib/stripe/resources/balance.rb +1 -1
  26. data/lib/stripe/resources/balance_transaction.rb +1 -1
  27. data/lib/stripe/resources/bank_account.rb +1 -1
  28. data/lib/stripe/resources/bitcoin_receiver.rb +1 -1
  29. data/lib/stripe/resources/bitcoin_transaction.rb +1 -1
  30. data/lib/stripe/resources/capability.rb +1 -1
  31. data/lib/stripe/resources/card.rb +1 -1
  32. data/lib/stripe/resources/charge.rb +7 -69
  33. data/lib/stripe/resources/checkout/session.rb +1 -1
  34. data/lib/stripe/resources/country_spec.rb +1 -1
  35. data/lib/stripe/resources/coupon.rb +1 -1
  36. data/lib/stripe/resources/credit_note.rb +1 -1
  37. data/lib/stripe/resources/customer.rb +3 -63
  38. data/lib/stripe/resources/customer_balance_transaction.rb +1 -1
  39. data/lib/stripe/resources/discount.rb +1 -1
  40. data/lib/stripe/resources/dispute.rb +1 -7
  41. data/lib/stripe/resources/ephemeral_key.rb +1 -1
  42. data/lib/stripe/resources/event.rb +1 -1
  43. data/lib/stripe/resources/exchange_rate.rb +1 -1
  44. data/lib/stripe/resources/file.rb +3 -13
  45. data/lib/stripe/resources/file_link.rb +1 -1
  46. data/lib/stripe/resources/invoice.rb +6 -1
  47. data/lib/stripe/resources/invoice_item.rb +1 -1
  48. data/lib/stripe/resources/invoice_line_item.rb +1 -1
  49. data/lib/stripe/resources/issuing/authorization.rb +1 -1
  50. data/lib/stripe/resources/issuing/card.rb +1 -1
  51. data/lib/stripe/resources/issuing/card_details.rb +1 -1
  52. data/lib/stripe/resources/issuing/cardholder.rb +1 -1
  53. data/lib/stripe/resources/issuing/dispute.rb +1 -1
  54. data/lib/stripe/resources/issuing/transaction.rb +1 -1
  55. data/lib/stripe/resources/login_link.rb +1 -1
  56. data/lib/stripe/resources/order.rb +1 -9
  57. data/lib/stripe/resources/order_return.rb +1 -1
  58. data/lib/stripe/resources/payment_intent.rb +1 -1
  59. data/lib/stripe/resources/payment_method.rb +1 -1
  60. data/lib/stripe/resources/payout.rb +1 -7
  61. data/lib/stripe/resources/person.rb +1 -1
  62. data/lib/stripe/resources/plan.rb +1 -1
  63. data/lib/stripe/resources/product.rb +1 -1
  64. data/lib/stripe/resources/radar/early_fraud_warning.rb +1 -1
  65. data/lib/stripe/resources/radar/value_list.rb +1 -1
  66. data/lib/stripe/resources/radar/value_list_item.rb +1 -1
  67. data/lib/stripe/resources/recipient.rb +1 -5
  68. data/lib/stripe/resources/recipient_transfer.rb +1 -1
  69. data/lib/stripe/resources/refund.rb +1 -1
  70. data/lib/stripe/resources/reporting/report_run.rb +1 -1
  71. data/lib/stripe/resources/reporting/report_type.rb +1 -1
  72. data/lib/stripe/resources/reversal.rb +1 -1
  73. data/lib/stripe/resources/review.rb +1 -1
  74. data/lib/stripe/resources/setup_intent.rb +1 -1
  75. data/lib/stripe/resources/sigma/scheduled_query_run.rb +1 -1
  76. data/lib/stripe/resources/sku.rb +1 -1
  77. data/lib/stripe/resources/source.rb +1 -7
  78. data/lib/stripe/resources/source_transaction.rb +1 -1
  79. data/lib/stripe/resources/subscription.rb +9 -9
  80. data/lib/stripe/resources/subscription_item.rb +1 -1
  81. data/lib/stripe/resources/subscription_schedule.rb +1 -1
  82. data/lib/stripe/resources/tax_id.rb +1 -1
  83. data/lib/stripe/resources/tax_rate.rb +1 -1
  84. data/lib/stripe/resources/terminal/connection_token.rb +1 -1
  85. data/lib/stripe/resources/terminal/location.rb +1 -1
  86. data/lib/stripe/resources/terminal/reader.rb +1 -1
  87. data/lib/stripe/resources/three_d_secure.rb +1 -1
  88. data/lib/stripe/resources/token.rb +1 -1
  89. data/lib/stripe/resources/topup.rb +1 -1
  90. data/lib/stripe/resources/transfer.rb +1 -6
  91. data/lib/stripe/resources/usage_record.rb +1 -17
  92. data/lib/stripe/resources/usage_record_summary.rb +1 -1
  93. data/lib/stripe/resources/webhook_endpoint.rb +1 -1
  94. data/lib/stripe/stripe_client.rb +281 -183
  95. data/lib/stripe/stripe_object.rb +4 -23
  96. data/lib/stripe/stripe_response.rb +53 -21
  97. data/lib/stripe/util.rb +10 -11
  98. data/lib/stripe/version.rb +1 -1
  99. data/lib/stripe/webhook.rb +1 -1
  100. data/stripe.gemspec +6 -9
  101. data/test/stripe/account_test.rb +0 -16
  102. data/test/stripe/api_operations_test.rb +2 -2
  103. data/test/stripe/api_resource_test.rb +2 -10
  104. data/test/stripe/charge_test.rb +0 -16
  105. data/test/stripe/connection_manager_test.rb +138 -0
  106. data/test/stripe/customer_test.rb +1 -44
  107. data/test/stripe/errors_test.rb +29 -8
  108. data/test/stripe/file_test.rb +0 -10
  109. data/test/stripe/invoice_test.rb +17 -1
  110. data/test/stripe/list_object_test.rb +0 -16
  111. data/test/stripe/login_link_test.rb +1 -1
  112. data/test/stripe/multipart_encoder_test.rb +130 -0
  113. data/test/stripe/payment_intent_test.rb +1 -1
  114. data/test/stripe/setup_intent_test.rb +1 -1
  115. data/test/stripe/source_test.rb +0 -18
  116. data/test/stripe/stripe_client_test.rb +214 -29
  117. data/test/stripe/stripe_object_test.rb +7 -35
  118. data/test/stripe/stripe_response_test.rb +70 -24
  119. data/test/stripe/subscription_test.rb +2 -2
  120. data/test/stripe/webhook_test.rb +2 -2
  121. data/test/stripe_mock.rb +4 -3
  122. data/test/stripe_test.rb +0 -13
  123. data/test/test_helper.rb +10 -5
  124. metadata +11 -39
  125. data/lib/stripe/resources/issuer_fraud_record.rb +0 -9
  126. data/test/stripe/file_upload_test.rb +0 -79
  127. data/test/stripe/issuer_fraud_record_test.rb +0 -20
  128. data/test/stripe/usage_record_test.rb +0 -28
@@ -6,79 +6,17 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "charge".freeze
9
+ OBJECT_NAME = "charge"
10
10
 
11
11
  custom_method :capture, http_verb: :post
12
12
 
13
- def refund(params = {}, opts = {})
14
- # Old versions of charge objects included a `refunds` field that was just
15
- # a vanilla array instead of a Stripe list object.
16
- #
17
- # Where possible, we'd still like to use the new refund endpoint (thus
18
- # `self.refunds.create`), but detect the old API version by looking for
19
- # an `Array` and fall back to the old refund URL if necessary so as to
20
- # maintain internal compatibility.
21
- if refunds.is_a?(Array)
22
- resp, opts = request(:post, refund_url, params, opts)
23
- initialize_from(resp.data, opts)
24
- else
25
- refunds.create(params, opts)
26
-
27
- # now that a refund has been created, we expect the state of this object
28
- # to change as well (i.e. `refunded` will now be `true`) so refresh it
29
- # from the server
30
- refresh
31
- end
32
- end
33
-
34
13
  def capture(params = {}, opts = {})
35
- resp, opts = request(:post, capture_url, params, opts)
36
- initialize_from(resp.data, opts)
37
- end
38
-
39
- def update_dispute(params = {}, opts = {})
40
- resp, opts = request(:post, dispute_url, params, opts)
41
- initialize_from({ dispute: resp.data }, opts, true)
42
- dispute
43
- end
44
-
45
- def close_dispute(params = {}, opts = {})
46
- resp, opts = request(:post, close_dispute_url, params, opts)
47
- initialize_from(resp.data, opts)
48
- end
49
-
50
- def mark_as_fraudulent
51
- params = {
52
- fraud_details: { user_report: "fraudulent" },
53
- }
54
- resp, opts = request(:post, resource_url, params)
55
- initialize_from(resp.data, opts)
56
- end
57
-
58
- def mark_as_safe
59
- params = {
60
- fraud_details: { user_report: "safe" },
61
- }
62
- resp, opts = request(:post, resource_url, params)
63
- initialize_from(resp.data, opts)
64
- end
65
-
66
- private def capture_url
67
- resource_url + "/capture"
68
- end
69
-
70
- private def dispute_url
71
- resource_url + "/dispute"
72
- end
73
-
74
- private def close_dispute_url
75
- resource_url + "/dispute/close"
76
- end
77
-
78
- # Note that this is actually the *old* refund URL and its use is no longer
79
- # preferred.
80
- private def refund_url
81
- resource_url + "/refund"
14
+ request_stripe_object(
15
+ method: :post,
16
+ path: resource_url + "/capture",
17
+ params: params,
18
+ opts: opts
19
+ )
82
20
  end
83
21
  end
84
22
  end
@@ -5,7 +5,7 @@ module Stripe
5
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
@@ -7,6 +7,6 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "coupon".freeze
10
+ OBJECT_NAME = "coupon"
11
11
  end
12
12
  end
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "credit_note".freeze
9
+ OBJECT_NAME = "credit_note"
10
10
 
11
11
  custom_method :void_credit_note, http_verb: :post, http_path: "void"
12
12
 
@@ -8,7 +8,7 @@ module Stripe
8
8
  include Stripe::APIOperations::Save
9
9
  extend Stripe::APIOperations::NestedResource
10
10
 
11
- OBJECT_NAME = "customer".freeze
11
+ OBJECT_NAME = "customer"
12
12
 
13
13
  nested_resource_class_methods :balance_transaction,
14
14
  operations: %i[create retrieve update list]
@@ -27,69 +27,9 @@ module Stripe
27
27
  alias detach_source delete_source
28
28
  end
29
29
 
30
- def add_invoice_item(params, opts = {})
31
- opts = @opts.merge(Util.normalize_opts(opts))
32
- InvoiceItem.create(params.merge(customer: id), opts)
33
- end
34
-
35
- def invoices(params = {}, opts = {})
36
- opts = @opts.merge(Util.normalize_opts(opts))
37
- Invoice.all(params.merge(customer: id), opts)
38
- end
39
-
40
- def invoice_items(params = {}, opts = {})
41
- opts = @opts.merge(Util.normalize_opts(opts))
42
- InvoiceItem.all(params.merge(customer: id), opts)
43
- end
44
-
45
- def upcoming_invoice(params = {}, opts = {})
46
- opts = @opts.merge(Util.normalize_opts(opts))
47
- Invoice.upcoming(params.merge(customer: id), opts)
48
- end
49
-
50
- def charges(params = {}, opts = {})
51
- opts = @opts.merge(Util.normalize_opts(opts))
52
- Charge.all(params.merge(customer: id), opts)
53
- end
54
-
55
- def create_upcoming_invoice(params = {}, opts = {})
56
- opts = @opts.merge(Util.normalize_opts(opts))
57
- Invoice.create(params.merge(customer: id), opts)
58
- end
59
-
60
- def cancel_subscription(params = {}, opts = {})
61
- resp, opts = request(:delete, subscription_url, params, opts)
62
- initialize_from({ subscription: resp.data }, opts, true)
63
- subscription
64
- end
65
-
66
- def update_subscription(params = {}, opts = {})
67
- resp, opts = request(:post, subscription_url, params, opts)
68
- initialize_from({ subscription: resp.data }, opts, true)
69
- subscription
70
- end
71
-
72
- def create_subscription(params = {}, opts = {})
73
- resp, opts = request(:post, subscriptions_url, params, opts)
74
- initialize_from({ subscription: resp.data }, opts, true)
75
- subscription
76
- end
77
-
78
30
  def delete_discount
79
- _, opts = request(:delete, discount_url)
80
- initialize_from({ discount: nil }, opts, true)
81
- end
82
-
83
- private def discount_url
84
- resource_url + "/discount"
85
- end
86
-
87
- private def subscription_url
88
- resource_url + "/subscription"
89
- end
90
-
91
- private def subscriptions_url
92
- resource_url + "/subscriptions"
31
+ resp, opts = request(:delete, resource_url + "/discount")
32
+ initialize_from(resp.data, opts, true)
93
33
  end
94
34
  end
95
35
  end
@@ -5,7 +5,7 @@ module Stripe
5
5
  extend Stripe::APIOperations::List
6
6
  include Stripe::APIOperations::Save
7
7
 
8
- OBJECT_NAME = "customer_balance_transaction".freeze
8
+ OBJECT_NAME = "customer_balance_transaction"
9
9
 
10
10
  def resource_url
11
11
  if !respond_to?(:customer) || customer.nil?
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Stripe
4
4
  class Discount < StripeObject
5
- OBJECT_NAME = "discount".freeze
5
+ OBJECT_NAME = "discount"
6
6
  end
7
7
  end
@@ -5,7 +5,7 @@ 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
10
  custom_method :close, http_verb: :post
11
11
 
@@ -17,11 +17,5 @@ module Stripe
17
17
  opts: opts
18
18
  )
19
19
  end
20
-
21
- def close_url
22
- resource_url + "/close"
23
- end
24
- extend Gem::Deprecate
25
- deprecate :close_url, :none, 2019, 11
26
20
  end
27
21
  end
@@ -5,7 +5,7 @@ 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)
@@ -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,40 +5,30 @@ module Stripe
5
5
  extend Stripe::APIOperations::Create
6
6
  extend Stripe::APIOperations::List
7
7
 
8
- OBJECT_NAME = "file".freeze
8
+ OBJECT_NAME = "file"
9
9
 
10
10
  # This resource can have two different object names. In latter API
11
11
  # versions, only `file` is used, but since stripe-ruby may be used with
12
12
  # any API version, we need to support deserializing the older
13
13
  # `file_upload` object into the same class.
14
- OBJECT_NAME_ALT = "file_upload".freeze
14
+ OBJECT_NAME_ALT = "file_upload"
15
15
 
16
16
  def self.resource_url
17
17
  "/v1/files"
18
18
  end
19
19
 
20
20
  def self.create(params = {}, opts = {})
21
- # rest-client would accept a vanilla `File` for upload, but Faraday does
22
- # not. Support the old API by wrapping a `File`-like object with an
23
- # `UploadIO` object if we're given one.
24
21
  if params[:file] && !params[:file].is_a?(String)
25
22
  unless params[:file].respond_to?(:read)
26
23
  raise ArgumentError, "file must respond to `#read`"
27
24
  end
28
-
29
- params[:file] = Faraday::UploadIO.new(params[:file], nil)
30
25
  end
31
26
 
32
27
  opts = {
33
28
  api_base: Stripe.uploads_base,
34
- content_type: "multipart/form-data",
29
+ content_type: MultipartEncoder::MULTIPART_FORM_DATA,
35
30
  }.merge(Util.normalize_opts(opts))
36
31
  super
37
32
  end
38
33
  end
39
34
  end
40
-
41
- module Stripe
42
- # For backwards compatibility, the `File` class is aliased to `FileUpload`.
43
- FileUpload = File
44
- end
@@ -6,6 +6,6 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "file_link".freeze
9
+ OBJECT_NAME = "file_link"
10
10
  end
11
11
  end
@@ -7,7 +7,7 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "invoice".freeze
10
+ OBJECT_NAME = "invoice"
11
11
 
12
12
  custom_method :finalize_invoice, http_verb: :post, http_path: "finalize"
13
13
  custom_method :mark_uncollectible, http_verb: :post
@@ -64,5 +64,10 @@ module Stripe
64
64
  resp, opts = request(:get, resource_url + "/upcoming", params, opts)
65
65
  Util.convert_to_stripe_object(resp.data, opts)
66
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
67
72
  end
68
73
  end
@@ -7,6 +7,6 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "invoiceitem".freeze
10
+ OBJECT_NAME = "invoiceitem"
11
11
  end
12
12
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Stripe
4
4
  class InvoiceLineItem < StripeObject
5
- OBJECT_NAME = "line_item".freeze
5
+ OBJECT_NAME = "line_item"
6
6
  end
7
7
  end
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "issuing.authorization".freeze
9
+ OBJECT_NAME = "issuing.authorization"
10
10
 
11
11
  custom_method :approve, http_verb: :post
12
12
  custom_method :decline, http_verb: :post
@@ -7,7 +7,7 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "issuing.card".freeze
10
+ OBJECT_NAME = "issuing.card"
11
11
 
12
12
  custom_method :details, http_verb: :get
13
13
 
@@ -3,7 +3,7 @@
3
3
  module Stripe
4
4
  module Issuing
5
5
  class CardDetails < Stripe::StripeObject
6
- OBJECT_NAME = "issuing.card_details".freeze
6
+ OBJECT_NAME = "issuing.card_details"
7
7
  end
8
8
  end
9
9
  end
@@ -7,7 +7,7 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "issuing.cardholder".freeze
10
+ OBJECT_NAME = "issuing.cardholder"
11
11
  end
12
12
  end
13
13
  end
@@ -7,7 +7,7 @@ module Stripe
7
7
  extend Stripe::APIOperations::List
8
8
  include Stripe::APIOperations::Save
9
9
 
10
- OBJECT_NAME = "issuing.dispute".freeze
10
+ OBJECT_NAME = "issuing.dispute"
11
11
  end
12
12
  end
13
13
  end
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "issuing.transaction".freeze
9
+ OBJECT_NAME = "issuing.transaction"
10
10
  end
11
11
  end
12
12
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Stripe
4
4
  class LoginLink < APIResource
5
- OBJECT_NAME = "login_link".freeze
5
+ OBJECT_NAME = "login_link"
6
6
 
7
7
  def self.retrieve(_id, _opts = nil)
8
8
  raise NotImplementedError,
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "order".freeze
9
+ OBJECT_NAME = "order"
10
10
 
11
11
  custom_method :pay, http_verb: :post
12
12
  custom_method :return_order, http_verb: :post, http_path: "returns"
@@ -28,13 +28,5 @@ module Stripe
28
28
  opts: opts
29
29
  )
30
30
  end
31
-
32
- private def pay_url
33
- resource_url + "/pay"
34
- end
35
-
36
- private def returns_url
37
- resource_url + "/returns"
38
- end
39
31
  end
40
32
  end