stripe 4.21.2 → 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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +17 -4
  3. data/.rubocop_todo.yml +10 -9
  4. data/.travis.yml +2 -6
  5. data/CHANGELOG.md +40 -1
  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/api_operations/list.rb +0 -6
  11. data/lib/stripe/api_resource.rb +16 -0
  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 -4
  18. data/lib/stripe/resources/account.rb +7 -7
  19. data/lib/stripe/resources/account_link.rb +1 -1
  20. data/lib/stripe/resources/alipay_account.rb +1 -1
  21. data/lib/stripe/resources/apple_pay_domain.rb +1 -1
  22. data/lib/stripe/resources/application_fee.rb +1 -12
  23. data/lib/stripe/resources/application_fee_refund.rb +1 -1
  24. data/lib/stripe/resources/balance.rb +1 -1
  25. data/lib/stripe/resources/balance_transaction.rb +1 -5
  26. data/lib/stripe/resources/bank_account.rb +1 -1
  27. data/lib/stripe/resources/bitcoin_receiver.rb +1 -1
  28. data/lib/stripe/resources/bitcoin_transaction.rb +1 -1
  29. data/lib/stripe/resources/capability.rb +1 -1
  30. data/lib/stripe/resources/card.rb +1 -1
  31. data/lib/stripe/resources/charge.rb +7 -69
  32. data/lib/stripe/resources/checkout/session.rb +1 -1
  33. data/lib/stripe/resources/country_spec.rb +1 -1
  34. data/lib/stripe/resources/coupon.rb +1 -1
  35. data/lib/stripe/resources/credit_note.rb +7 -3
  36. data/lib/stripe/resources/customer.rb +3 -63
  37. data/lib/stripe/resources/customer_balance_transaction.rb +1 -1
  38. data/lib/stripe/resources/discount.rb +1 -1
  39. data/lib/stripe/resources/dispute.rb +7 -9
  40. data/lib/stripe/resources/ephemeral_key.rb +1 -1
  41. data/lib/stripe/resources/event.rb +1 -1
  42. data/lib/stripe/resources/exchange_rate.rb +1 -1
  43. data/lib/stripe/resources/file.rb +3 -13
  44. data/lib/stripe/resources/file_link.rb +1 -1
  45. data/lib/stripe/resources/invoice.rb +36 -11
  46. data/lib/stripe/resources/invoice_item.rb +1 -1
  47. data/lib/stripe/resources/invoice_line_item.rb +1 -1
  48. data/lib/stripe/resources/issuing/authorization.rb +13 -5
  49. data/lib/stripe/resources/issuing/card.rb +7 -3
  50. data/lib/stripe/resources/issuing/card_details.rb +1 -1
  51. data/lib/stripe/resources/issuing/cardholder.rb +1 -1
  52. data/lib/stripe/resources/issuing/dispute.rb +1 -1
  53. data/lib/stripe/resources/issuing/transaction.rb +1 -1
  54. data/lib/stripe/resources/login_link.rb +1 -1
  55. data/lib/stripe/resources/order.rb +13 -13
  56. data/lib/stripe/resources/order_return.rb +1 -1
  57. data/lib/stripe/resources/payment_intent.rb +19 -7
  58. data/lib/stripe/resources/payment_method.rb +13 -5
  59. data/lib/stripe/resources/payout.rb +7 -9
  60. data/lib/stripe/resources/person.rb +1 -1
  61. data/lib/stripe/resources/plan.rb +1 -1
  62. data/lib/stripe/resources/product.rb +1 -1
  63. data/lib/stripe/resources/radar/early_fraud_warning.rb +1 -1
  64. data/lib/stripe/resources/radar/value_list.rb +1 -1
  65. data/lib/stripe/resources/radar/value_list_item.rb +1 -1
  66. data/lib/stripe/resources/recipient.rb +1 -5
  67. data/lib/stripe/resources/recipient_transfer.rb +1 -1
  68. data/lib/stripe/resources/refund.rb +1 -1
  69. data/lib/stripe/resources/reporting/report_run.rb +1 -1
  70. data/lib/stripe/resources/reporting/report_type.rb +1 -1
  71. data/lib/stripe/resources/reversal.rb +1 -1
  72. data/lib/stripe/resources/review.rb +7 -3
  73. data/lib/stripe/resources/setup_intent.rb +13 -5
  74. data/lib/stripe/resources/sigma/scheduled_query_run.rb +1 -1
  75. data/lib/stripe/resources/sku.rb +1 -1
  76. data/lib/stripe/resources/source.rb +7 -9
  77. data/lib/stripe/resources/source_transaction.rb +1 -1
  78. data/lib/stripe/resources/subscription.rb +9 -9
  79. data/lib/stripe/resources/subscription_item.rb +4 -1
  80. data/lib/stripe/resources/subscription_schedule.rb +13 -13
  81. data/lib/stripe/resources/tax_id.rb +1 -1
  82. data/lib/stripe/resources/tax_rate.rb +1 -1
  83. data/lib/stripe/resources/terminal/connection_token.rb +1 -1
  84. data/lib/stripe/resources/terminal/location.rb +1 -1
  85. data/lib/stripe/resources/terminal/reader.rb +1 -1
  86. data/lib/stripe/resources/three_d_secure.rb +1 -1
  87. data/lib/stripe/resources/token.rb +1 -1
  88. data/lib/stripe/resources/topup.rb +7 -3
  89. data/lib/stripe/resources/transfer.rb +7 -8
  90. data/lib/stripe/resources/usage_record.rb +1 -17
  91. data/lib/stripe/resources/usage_record_summary.rb +1 -1
  92. data/lib/stripe/resources/webhook_endpoint.rb +1 -1
  93. data/lib/stripe/resources.rb +0 -2
  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 +14 -11
  98. data/lib/stripe/version.rb +1 -1
  99. data/lib/stripe/webhook.rb +1 -1
  100. data/lib/stripe.rb +56 -15
  101. data/stripe.gemspec +6 -9
  102. data/test/stripe/account_test.rb +0 -16
  103. data/test/stripe/api_operations_test.rb +2 -2
  104. data/test/stripe/api_resource_test.rb +98 -8
  105. data/test/stripe/balance_transaction_test.rb +20 -0
  106. data/test/stripe/charge_test.rb +0 -16
  107. data/test/stripe/connection_manager_test.rb +138 -0
  108. data/test/stripe/customer_test.rb +1 -44
  109. data/test/stripe/errors_test.rb +29 -8
  110. data/test/stripe/file_test.rb +0 -10
  111. data/test/stripe/invoice_test.rb +17 -1
  112. data/test/stripe/list_object_test.rb +0 -16
  113. data/test/stripe/login_link_test.rb +1 -1
  114. data/test/stripe/multipart_encoder_test.rb +130 -0
  115. data/test/stripe/payment_intent_test.rb +1 -1
  116. data/test/stripe/setup_intent_test.rb +1 -1
  117. data/test/stripe/source_test.rb +0 -18
  118. data/test/stripe/stripe_client_test.rb +214 -29
  119. data/test/stripe/stripe_object_test.rb +7 -35
  120. data/test/stripe/stripe_response_test.rb +70 -24
  121. data/test/stripe/subscription_item_test.rb +12 -0
  122. data/test/stripe/subscription_schedule_test.rb +0 -34
  123. data/test/stripe/subscription_test.rb +2 -2
  124. data/test/stripe/webhook_test.rb +2 -2
  125. data/test/stripe_mock.rb +4 -3
  126. data/test/stripe_test.rb +0 -13
  127. data/test/test_helper.rb +10 -5
  128. metadata +13 -42
  129. data/lib/stripe/resources/issuer_fraud_record.rb +0 -9
  130. data/lib/stripe/resources/subscription_schedule_revision.rb +0 -34
  131. data/test/stripe/file_upload_test.rb +0 -79
  132. data/test/stripe/issuer_fraud_record_test.rb +0 -20
  133. data/test/stripe/subscription_schedule_revision_test.rb +0 -37
  134. data/test/stripe/usage_record_test.rb +0 -28
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require "tempfile"
5
+
6
+ module Stripe
7
+ # Encodes parameters into a `multipart/form-data` payload as described by RFC
8
+ # 2388:
9
+ #
10
+ # https://tools.ietf.org/html/rfc2388
11
+ #
12
+ # This is most useful for transferring file-like objects.
13
+ #
14
+ # Parameters should be added with `#encode`. When ready, use `#body` to get
15
+ # the encoded result and `#content_type` to get the value that should be
16
+ # placed in the `Content-Type` header of a subsequent request (which includes
17
+ # a boundary value).
18
+ class MultipartEncoder
19
+ MULTIPART_FORM_DATA = "multipart/form-data"
20
+
21
+ # A shortcut for encoding a single set of parameters and finalizing a
22
+ # result.
23
+ #
24
+ # Returns an encoded body and the value that should be set in the content
25
+ # type header of a subsequent request.
26
+ def self.encode(params)
27
+ encoder = MultipartEncoder.new
28
+ encoder.encode(params)
29
+ encoder.close
30
+ [encoder.body, encoder.content_type]
31
+ end
32
+
33
+ # Gets the object's randomly generated boundary string.
34
+ attr_reader :boundary
35
+
36
+ # Initializes a new multipart encoder.
37
+ def initialize
38
+ # Kind of weird, but required by Rubocop because the unary plus operator
39
+ # is considered faster than `Stripe.new`.
40
+ @body = +""
41
+
42
+ # Chose the same number of random bytes that Go uses in its standard
43
+ # library implementation. Easily enough entropy to ensure that it won't
44
+ # be present in a file we're sending.
45
+ @boundary = SecureRandom.hex(30)
46
+
47
+ @closed = false
48
+ @first_field = true
49
+ end
50
+
51
+ # Gets the encoded body. `#close` must be called first.
52
+ def body
53
+ raise "object must be closed before getting body" unless @closed
54
+
55
+ @body
56
+ end
57
+
58
+ # Finalizes the object by writing the final boundary.
59
+ def close
60
+ raise "object already closed" if @closed
61
+
62
+ @body << "\r\n"
63
+ @body << "--#{@boundary}--"
64
+
65
+ @closed = true
66
+
67
+ nil
68
+ end
69
+
70
+ # Gets the value including boundary that should be put into a multipart
71
+ # request's `Content-Type`.
72
+ def content_type
73
+ "#{MULTIPART_FORM_DATA}; boundary=#{@boundary}"
74
+ end
75
+
76
+ # Encodes a set of parameters to the body.
77
+ #
78
+ # Note that parameters are expected to be a hash, but a "flat" hash such
79
+ # that complex substructures like hashes and arrays have already been
80
+ # appropriately Stripe-encoded. Pass a complex structure through
81
+ # `Util.flatten_params` first before handing it off to this method.
82
+ def encode(params)
83
+ raise "no more parameters can be written to closed object" if @closed
84
+
85
+ params.each do |name, val|
86
+ if val.is_a?(::File) || val.is_a?(::Tempfile)
87
+ write_field(name, val.read, filename: ::File.basename(val.path))
88
+ elsif val.respond_to?(:read)
89
+ write_field(name, val.read, filename: "blob")
90
+ else
91
+ write_field(name, val, filename: nil)
92
+ end
93
+ end
94
+
95
+ nil
96
+ end
97
+
98
+ #
99
+ # private
100
+ #
101
+
102
+ # Escapes double quotes so that the given value can be used in a
103
+ # double-quoted string and replaces any linebreak characters with spaces.
104
+ private def escape(str)
105
+ str.gsub('"', "%22").tr("\n", " ").tr("\r", " ")
106
+ end
107
+
108
+ private def write_field(name, data, filename:)
109
+ if !@first_field
110
+ @body << "\r\n"
111
+ else
112
+ @first_field = false
113
+ end
114
+
115
+ @body << "--#{@boundary}\r\n"
116
+
117
+ if filename
118
+ @body << %(Content-Disposition: form-data) +
119
+ %(; name="#{escape(name.to_s)}") +
120
+ %(; filename="#{escape(filename)}"\r\n)
121
+ @body << %(Content-Type: application/octet-stream\r\n)
122
+ else
123
+ @body << %(Content-Disposition: form-data) +
124
+ %(; name="#{escape(name.to_s)}"\r\n)
125
+ end
126
+
127
+ @body << "\r\n"
128
+ @body << data.to_s
129
+ end
130
+ end
131
+ end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/LineLength
4
3
  # rubocop:disable Metrics/MethodLength
5
4
 
6
5
  module Stripe
@@ -42,7 +41,6 @@ module Stripe
42
41
  Invoice::OBJECT_NAME => Invoice,
43
42
  InvoiceItem::OBJECT_NAME => InvoiceItem,
44
43
  InvoiceLineItem::OBJECT_NAME => InvoiceLineItem,
45
- IssuerFraudRecord::OBJECT_NAME => IssuerFraudRecord,
46
44
  Issuing::Authorization::OBJECT_NAME => Issuing::Authorization,
47
45
  Issuing::Card::OBJECT_NAME => Issuing::Card,
48
46
  Issuing::CardDetails::OBJECT_NAME => Issuing::CardDetails,
@@ -76,7 +74,6 @@ module Stripe
76
74
  Subscription::OBJECT_NAME => Subscription,
77
75
  SubscriptionItem::OBJECT_NAME => SubscriptionItem,
78
76
  SubscriptionSchedule::OBJECT_NAME => SubscriptionSchedule,
79
- SubscriptionScheduleRevision::OBJECT_NAME => SubscriptionScheduleRevision,
80
77
  TaxId::OBJECT_NAME => TaxId,
81
78
  TaxRate::OBJECT_NAME => TaxRate,
82
79
  Terminal::ConnectionToken::OBJECT_NAME => Terminal::ConnectionToken,
@@ -94,5 +91,4 @@ module Stripe
94
91
  end
95
92
  end
96
93
 
97
- # rubocop:enable Metrics/LineLength
98
94
  # rubocop:enable Metrics/MethodLength
@@ -9,7 +9,7 @@ module Stripe
9
9
  include Stripe::APIOperations::Save
10
10
  extend Stripe::APIOperations::NestedResource
11
11
 
12
- OBJECT_NAME = "account".freeze
12
+ OBJECT_NAME = "account"
13
13
 
14
14
  custom_method :reject, http_verb: :post
15
15
 
@@ -20,8 +20,12 @@ module Stripe
20
20
  operations: %i[create retrieve update delete list]
21
21
 
22
22
  def reject(params = {}, opts = {})
23
- resp, opts = request(:post, resource_url + "/reject", params, opts)
24
- initialize_from(resp.data, opts)
23
+ request_stripe_object(
24
+ method: :post,
25
+ path: resource_url + "/reject",
26
+ params: params,
27
+ opts: opts
28
+ )
25
29
  end
26
30
 
27
31
  save_nested_resource :external_account
@@ -31,10 +35,6 @@ module Stripe
31
35
 
32
36
  nested_resource_class_methods :login_link, operations: %i[create]
33
37
 
34
- # This method is deprecated. Please use `#external_account=` instead.
35
- save_nested_resource :bank_account
36
- deprecate :bank_account=, "#external_account=", 2017, 8
37
-
38
38
  def resource_url
39
39
  if self["id"]
40
40
  super
@@ -4,6 +4,6 @@ module Stripe
4
4
  class AccountLink < APIResource
5
5
  extend Stripe::APIOperations::Create
6
6
 
7
- OBJECT_NAME = "account_link".freeze
7
+ OBJECT_NAME = "account_link"
8
8
  end
9
9
  end
@@ -5,7 +5,7 @@ module Stripe
5
5
  include Stripe::APIOperations::Save
6
6
  include Stripe::APIOperations::Delete
7
7
 
8
- OBJECT_NAME = "alipay_account".freeze
8
+ OBJECT_NAME = "alipay_account"
9
9
 
10
10
  def resource_url
11
11
  if !respond_to?(:customer) || customer.nil?
@@ -7,7 +7,7 @@ module Stripe
7
7
  include Stripe::APIOperations::Delete
8
8
  extend Stripe::APIOperations::List
9
9
 
10
- OBJECT_NAME = "apple_pay_domain".freeze
10
+ OBJECT_NAME = "apple_pay_domain"
11
11
 
12
12
  def self.resource_url
13
13
  "/v1/apple_pay/domains"
@@ -5,20 +5,9 @@ module Stripe
5
5
  extend Stripe::APIOperations::List
6
6
  extend Stripe::APIOperations::NestedResource
7
7
 
8
- OBJECT_NAME = "application_fee".freeze
8
+ OBJECT_NAME = "application_fee"
9
9
 
10
10
  nested_resource_class_methods :refund,
11
11
  operations: %i[create retrieve update list]
12
-
13
- # If you don't need access to an updated fee object after the refund, it's
14
- # more performant to just call `fee.refunds.create` directly.
15
- def refund(params = {}, opts = {})
16
- refunds.create(params, opts)
17
-
18
- # now that a refund has been created, we expect the state of this object
19
- # to change as well (i.e. `refunded` will now be `true`) so refresh it
20
- # from the server
21
- refresh
22
- end
23
12
  end
24
13
  end
@@ -5,7 +5,7 @@ module Stripe
5
5
  include Stripe::APIOperations::Save
6
6
  extend Stripe::APIOperations::List
7
7
 
8
- OBJECT_NAME = "fee_refund".freeze
8
+ OBJECT_NAME = "fee_refund"
9
9
 
10
10
  def resource_url
11
11
  "#{ApplicationFee.resource_url}/#{CGI.escape(fee)}/refunds" \
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Stripe
4
4
  class Balance < SingletonAPIResource
5
- OBJECT_NAME = "balance".freeze
5
+ OBJECT_NAME = "balance"
6
6
  end
7
7
  end
@@ -4,10 +4,6 @@ module Stripe
4
4
  class BalanceTransaction < APIResource
5
5
  extend Stripe::APIOperations::List
6
6
 
7
- OBJECT_NAME = "balance_transaction".freeze
8
-
9
- def self.resource_url
10
- "/v1/balance/history"
11
- end
7
+ OBJECT_NAME = "balance_transaction"
12
8
  end
13
9
  end
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
7
  include Stripe::APIOperations::Save
8
8
 
9
- OBJECT_NAME = "bank_account".freeze
9
+ OBJECT_NAME = "bank_account"
10
10
 
11
11
  def verify(params = {}, opts = {})
12
12
  resp, opts = request(:post, resource_url + "/verify", params, opts)
@@ -6,7 +6,7 @@ module Stripe
6
6
  class BitcoinReceiver < APIResource
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"
@@ -5,7 +5,7 @@ module Stripe
5
5
  extend Stripe::APIOperations::List
6
6
  include Stripe::APIOperations::Save
7
7
 
8
- OBJECT_NAME = "capability".freeze
8
+ OBJECT_NAME = "capability"
9
9
 
10
10
  def resource_url
11
11
  if !respond_to?(:account) || account.nil?
@@ -6,7 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::List
7
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?
@@ -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,13 +6,17 @@ 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
 
13
13
  def void_credit_note(params = {}, opts = {})
14
- resp, opts = request(:post, resource_url + "/void", params, opts)
15
- initialize_from(resp.data, opts)
14
+ request_stripe_object(
15
+ method: :post,
16
+ path: resource_url + "/void",
17
+ params: params,
18
+ opts: opts
19
+ )
16
20
  end
17
21
  end
18
22
  end
@@ -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,19 +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
10
  custom_method :close, http_verb: :post
11
11
 
12
12
  def close(params = {}, opts = {})
13
- resp, opts = request(:post, resource_url + "/close", params, opts)
14
- initialize_from(resp.data, opts)
13
+ request_stripe_object(
14
+ method: :post,
15
+ path: resource_url + "/close",
16
+ params: params,
17
+ opts: opts
18
+ )
15
19
  end
16
-
17
- def close_url
18
- resource_url + "/close"
19
- end
20
- extend Gem::Deprecate
21
- deprecate :close_url, :none, 2019, 11
22
20
  end
23
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