stripe 3.3.1 → 5.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +962 -0
  3. data/CODE_OF_CONDUCT.md +77 -0
  4. data/Gemfile +24 -22
  5. data/History.txt +1 -689
  6. data/README.md +202 -55
  7. data/Rakefile +18 -12
  8. data/VERSION +1 -1
  9. data/bin/stripe-console +5 -3
  10. data/lib/stripe/api_operations/create.rb +4 -2
  11. data/lib/stripe/api_operations/delete.rb +31 -3
  12. data/lib/stripe/api_operations/list.rb +4 -13
  13. data/lib/stripe/api_operations/nested_resource.rb +73 -0
  14. data/lib/stripe/api_operations/request.rb +84 -17
  15. data/lib/stripe/api_operations/save.rb +25 -13
  16. data/lib/stripe/api_resource.rb +70 -11
  17. data/lib/stripe/connection_manager.rb +179 -0
  18. data/lib/stripe/error_object.rb +93 -0
  19. data/lib/stripe/errors.rb +47 -19
  20. data/lib/stripe/instrumentation.rb +84 -0
  21. data/lib/stripe/list_object.rb +54 -22
  22. data/lib/stripe/multipart_encoder.rb +131 -0
  23. data/lib/stripe/oauth.rb +29 -20
  24. data/lib/stripe/object_types.rb +107 -0
  25. data/lib/stripe/{account.rb → resources/account.rb} +70 -36
  26. data/lib/stripe/resources/account_link.rb +10 -0
  27. data/lib/stripe/resources/alipay_account.rb +34 -0
  28. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +5 -2
  29. data/lib/stripe/resources/application_fee.rb +14 -0
  30. data/lib/stripe/resources/application_fee_refund.rb +31 -0
  31. data/lib/stripe/resources/balance.rb +8 -0
  32. data/lib/stripe/resources/balance_transaction.rb +10 -0
  33. data/lib/stripe/resources/bank_account.rb +43 -0
  34. data/lib/stripe/resources/billing_portal/configuration.rb +14 -0
  35. data/lib/stripe/resources/billing_portal/session.rb +12 -0
  36. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +7 -5
  37. data/lib/stripe/resources/bitcoin_transaction.rb +16 -0
  38. data/lib/stripe/resources/capability.rb +34 -0
  39. data/lib/stripe/resources/card.rb +38 -0
  40. data/lib/stripe/resources/charge.rb +23 -0
  41. data/lib/stripe/resources/checkout/session.rb +16 -0
  42. data/lib/stripe/resources/country_spec.rb +10 -0
  43. data/lib/stripe/{coupon.rb → resources/coupon.rb} +5 -2
  44. data/lib/stripe/resources/credit_note.rb +33 -0
  45. data/lib/stripe/resources/credit_note_line_item.rb +8 -0
  46. data/lib/stripe/resources/customer.rb +41 -0
  47. data/lib/stripe/resources/customer_balance_transaction.rb +31 -0
  48. data/lib/stripe/resources/discount.rb +7 -0
  49. data/lib/stripe/resources/dispute.rb +22 -0
  50. data/lib/stripe/resources/ephemeral_key.rb +20 -0
  51. data/lib/stripe/resources/event.rb +10 -0
  52. data/lib/stripe/resources/exchange_rate.rb +10 -0
  53. data/lib/stripe/resources/file.rb +36 -0
  54. data/lib/stripe/resources/file_link.rb +12 -0
  55. data/lib/stripe/resources/identity/verification_report.rb +12 -0
  56. data/lib/stripe/resources/identity/verification_session.rb +35 -0
  57. data/lib/stripe/resources/invoice.rb +74 -0
  58. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +5 -2
  59. data/lib/stripe/resources/invoice_line_item.rb +8 -0
  60. data/lib/stripe/resources/issuing/authorization.rb +34 -0
  61. data/lib/stripe/resources/issuing/card.rb +25 -0
  62. data/lib/stripe/resources/issuing/card_details.rb +9 -0
  63. data/lib/stripe/resources/issuing/cardholder.rb +14 -0
  64. data/lib/stripe/resources/issuing/dispute.rb +25 -0
  65. data/lib/stripe/resources/issuing/transaction.rb +13 -0
  66. data/lib/stripe/resources/line_item.rb +8 -0
  67. data/lib/stripe/resources/login_link.rb +15 -0
  68. data/lib/stripe/resources/mandate.rb +8 -0
  69. data/lib/stripe/resources/order.rb +33 -0
  70. data/lib/stripe/resources/order_return.rb +10 -0
  71. data/lib/stripe/resources/payment_intent.rb +43 -0
  72. data/lib/stripe/resources/payment_method.rb +33 -0
  73. data/lib/stripe/resources/payout.rb +33 -0
  74. data/lib/stripe/resources/person.rb +32 -0
  75. data/lib/stripe/{plan.rb → resources/plan.rb} +4 -1
  76. data/lib/stripe/resources/price.rb +12 -0
  77. data/lib/stripe/{product.rb → resources/product.rb} +6 -3
  78. data/lib/stripe/resources/promotion_code.rb +12 -0
  79. data/lib/stripe/resources/quote.rb +105 -0
  80. data/lib/stripe/resources/radar/early_fraud_warning.rb +12 -0
  81. data/lib/stripe/resources/radar/value_list.rb +15 -0
  82. data/lib/stripe/resources/radar/value_list_item.rb +14 -0
  83. data/lib/stripe/resources/recipient.rb +14 -0
  84. data/lib/stripe/resources/recipient_transfer.rb +7 -0
  85. data/lib/stripe/{refund.rb → resources/refund.rb} +4 -1
  86. data/lib/stripe/resources/reporting/report_run.rb +13 -0
  87. data/lib/stripe/resources/reporting/report_type.rb +13 -0
  88. data/lib/stripe/resources/reversal.rb +30 -0
  89. data/lib/stripe/resources/review.rb +21 -0
  90. data/lib/stripe/resources/setup_attempt.rb +10 -0
  91. data/lib/stripe/resources/setup_intent.rb +33 -0
  92. data/lib/stripe/resources/sigma/scheduled_query_run.rb +16 -0
  93. data/lib/stripe/{sku.rb → resources/sku.rb} +6 -3
  94. data/lib/stripe/resources/source.rb +47 -0
  95. data/lib/stripe/resources/source_transaction.rb +7 -0
  96. data/lib/stripe/resources/subscription.rb +26 -0
  97. data/lib/stripe/resources/subscription_item.rb +26 -0
  98. data/lib/stripe/resources/subscription_schedule.rb +33 -0
  99. data/lib/stripe/resources/tax_code.rb +10 -0
  100. data/lib/stripe/resources/tax_id.rb +27 -0
  101. data/lib/stripe/resources/tax_rate.rb +12 -0
  102. data/lib/stripe/resources/terminal/connection_token.rb +12 -0
  103. data/lib/stripe/resources/terminal/location.rb +15 -0
  104. data/lib/stripe/resources/terminal/reader.rb +15 -0
  105. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +4 -1
  106. data/lib/stripe/resources/token.rb +10 -0
  107. data/lib/stripe/resources/topup.rb +23 -0
  108. data/lib/stripe/resources/transfer.rb +27 -0
  109. data/lib/stripe/resources/usage_record.rb +8 -0
  110. data/lib/stripe/resources/usage_record_summary.rb +8 -0
  111. data/lib/stripe/{recipient.rb → resources/webhook_endpoint.rb} +6 -7
  112. data/lib/stripe/resources.rb +90 -0
  113. data/lib/stripe/singleton_api_resource.rb +10 -4
  114. data/lib/stripe/stripe_client.rb +798 -346
  115. data/lib/stripe/stripe_configuration.rb +194 -0
  116. data/lib/stripe/stripe_object.rb +271 -126
  117. data/lib/stripe/stripe_response.rb +89 -27
  118. data/lib/stripe/util.rb +134 -194
  119. data/lib/stripe/version.rb +3 -1
  120. data/lib/stripe/webhook.rb +57 -18
  121. data/lib/stripe.rb +74 -186
  122. data/stripe.gemspec +35 -16
  123. metadata +110 -165
  124. data/.gitattributes +0 -4
  125. data/.github/ISSUE_TEMPLATE.md +0 -5
  126. data/.gitignore +0 -5
  127. data/.travis.yml +0 -38
  128. data/lib/stripe/alipay_account.rb +0 -22
  129. data/lib/stripe/application_fee.rb +0 -22
  130. data/lib/stripe/application_fee_refund.rb +0 -20
  131. data/lib/stripe/balance.rb +0 -5
  132. data/lib/stripe/balance_transaction.rb +0 -11
  133. data/lib/stripe/bank_account.rb +0 -30
  134. data/lib/stripe/bitcoin_transaction.rb +0 -11
  135. data/lib/stripe/card.rb +0 -27
  136. data/lib/stripe/charge.rb +0 -82
  137. data/lib/stripe/country_spec.rb +0 -11
  138. data/lib/stripe/customer.rb +0 -79
  139. data/lib/stripe/dispute.rb +0 -17
  140. data/lib/stripe/ephemeral_key.rb +0 -18
  141. data/lib/stripe/event.rb +0 -7
  142. data/lib/stripe/file_upload.rb +0 -33
  143. data/lib/stripe/invoice.rb +0 -29
  144. data/lib/stripe/invoice_line_item.rb +0 -5
  145. data/lib/stripe/login_link.rb +0 -9
  146. data/lib/stripe/order.rb +0 -29
  147. data/lib/stripe/order_return.rb +0 -11
  148. data/lib/stripe/payout.rb +0 -18
  149. data/lib/stripe/recipient_transfer.rb +0 -6
  150. data/lib/stripe/reversal.rb +0 -20
  151. data/lib/stripe/source.rb +0 -23
  152. data/lib/stripe/subscription.rb +0 -33
  153. data/lib/stripe/subscription_item.rb +0 -14
  154. data/lib/stripe/token.rb +0 -7
  155. data/lib/stripe/transfer.rb +0 -18
  156. data/test/api_stub_helpers.rb +0 -0
  157. data/test/stripe/account_test.rb +0 -202
  158. data/test/stripe/alipay_account_test.rb +0 -17
  159. data/test/stripe/api_operations_test.rb +0 -31
  160. data/test/stripe/api_resource_test.rb +0 -558
  161. data/test/stripe/apple_pay_domain_test.rb +0 -31
  162. data/test/stripe/application_fee_refund_test.rb +0 -35
  163. data/test/stripe/application_fee_test.rb +0 -12
  164. data/test/stripe/balance_test.rb +0 -11
  165. data/test/stripe/bank_account_test.rb +0 -36
  166. data/test/stripe/bitcoin_receiver_test.rb +0 -67
  167. data/test/stripe/bitcoin_transaction_test.rb +0 -19
  168. data/test/stripe/charge_test.rb +0 -57
  169. data/test/stripe/country_spec_test.rb +0 -18
  170. data/test/stripe/coupon_test.rb +0 -42
  171. data/test/stripe/customer_card_test.rb +0 -46
  172. data/test/stripe/customer_test.rb +0 -114
  173. data/test/stripe/dispute_test.rb +0 -40
  174. data/test/stripe/ephemeral_key_test.rb +0 -84
  175. data/test/stripe/errors_test.rb +0 -18
  176. data/test/stripe/file_upload_test.rb +0 -66
  177. data/test/stripe/invoice_item_test.rb +0 -53
  178. data/test/stripe/invoice_line_item_test.rb +0 -6
  179. data/test/stripe/invoice_test.rb +0 -110
  180. data/test/stripe/list_object_test.rb +0 -170
  181. data/test/stripe/login_link_test.rb +0 -35
  182. data/test/stripe/oauth_test.rb +0 -85
  183. data/test/stripe/order_return_test.rb +0 -19
  184. data/test/stripe/order_test.rb +0 -57
  185. data/test/stripe/payout_test.rb +0 -48
  186. data/test/stripe/plan_test.rb +0 -50
  187. data/test/stripe/product_test.rb +0 -45
  188. data/test/stripe/recipient_card_test.rb +0 -44
  189. data/test/stripe/recipient_test.rb +0 -48
  190. data/test/stripe/refund_test.rb +0 -37
  191. data/test/stripe/reversal_test.rb +0 -41
  192. data/test/stripe/sku_test.rb +0 -48
  193. data/test/stripe/source_test.rb +0 -68
  194. data/test/stripe/stripe_client_test.rb +0 -750
  195. data/test/stripe/stripe_object_test.rb +0 -398
  196. data/test/stripe/stripe_response_test.rb +0 -46
  197. data/test/stripe/subscription_item_test.rb +0 -52
  198. data/test/stripe/subscription_test.rb +0 -58
  199. data/test/stripe/three_d_secure_test.rb +0 -21
  200. data/test/stripe/transfer_test.rb +0 -41
  201. data/test/stripe/util_test.rb +0 -414
  202. data/test/stripe/webhook_test.rb +0 -92
  203. data/test/stripe_test.rb +0 -59
  204. data/test/test_data.rb +0 -59
  205. data/test/test_helper.rb +0 -56
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # Stripe Ruby Library [![Build Status](https://travis-ci.org/stripe/stripe-ruby.svg?branch=master)](https://travis-ci.org/stripe/stripe-ruby)
1
+ # Stripe Ruby Library
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/stripe.svg)](https://badge.fury.io/rb/stripe)
4
+ [![Build Status](https://travis-ci.org/stripe/stripe-ruby.svg?branch=master)](https://travis-ci.org/stripe/stripe-ruby)
2
5
 
3
6
  The Stripe Ruby library provides convenient access to the Stripe API from
4
7
  applications written in the Ruby language. It includes a pre-defined set of
@@ -8,31 +11,36 @@ API.
8
11
 
9
12
  The library also provides other features. For example:
10
13
 
11
- * Easy configuration path for fast setup and use.
12
- * Helpers for pagination.
13
- * Tracking of "fresh" values in API resources so that partial updates can be
14
- executed.
15
- * Built-in mechanisms for the serialization of parameters according to the
14
+ - Easy configuration path for fast setup and use.
15
+ - Helpers for pagination.
16
+ - Built-in mechanisms for the serialization of parameters according to the
16
17
  expectations of Stripe's API.
17
18
 
18
19
  ## Documentation
19
20
 
20
21
  See the [Ruby API docs](https://stripe.com/docs/api/ruby#intro).
21
22
 
23
+ See [video demonstrations][youtube-playlist] covering how to use the library.
24
+
25
+
22
26
  ## Installation
23
27
 
24
28
  You don't need this source code unless you want to modify the gem. If you just
25
29
  want to use the package, just run:
26
30
 
27
- gem install stripe
31
+ ```sh
32
+ gem install stripe
33
+ ```
28
34
 
29
35
  If you want to build the gem from source:
30
36
 
31
- gem build stripe.gemspec
37
+ ```sh
38
+ gem build stripe.gemspec
39
+ ```
32
40
 
33
41
  ### Requirements
34
42
 
35
- * Ruby 2.0+.
43
+ - Ruby 2.3+.
36
44
 
37
45
  ### Bundler
38
46
 
@@ -40,7 +48,7 @@ If you are installing via bundler, you should be sure to use the https rubygems
40
48
  source in your Gemfile, as any gems fetched over http could potentially be
41
49
  compromised in transit and alter the code of gems fetched securely over https:
42
50
 
43
- ``` ruby
51
+ ```ruby
44
52
  source 'https://rubygems.org'
45
53
 
46
54
  gem 'rails'
@@ -53,17 +61,15 @@ The library needs to be configured with your account's secret key which is
53
61
  available in your [Stripe Dashboard][api-keys]. Set `Stripe.api_key` to its
54
62
  value:
55
63
 
56
- ``` ruby
57
- require "stripe"
58
- Stripe.api_key = "sk_test_..."
64
+ ```ruby
65
+ require 'stripe'
66
+ Stripe.api_key = 'sk_test_...'
59
67
 
60
- # list charges
61
- Stripe::Charge.list()
68
+ # list customers
69
+ Stripe::Customer.list()
62
70
 
63
- # retrieve single charge
64
- Stripe::Charge.retrieve(
65
- "ch_18atAXCdGbJFKhCuBAa4532Z",
66
- )
71
+ # retrieve single customer
72
+ Stripe::Customer.retrieve('cus_123456789')
67
73
  ```
68
74
 
69
75
  ### Per-request Configuration
@@ -72,63 +78,122 @@ For apps that need to use multiple keys during the lifetime of a process, like
72
78
  one that uses [Stripe Connect][connect], it's also possible to set a
73
79
  per-request key and/or account:
74
80
 
75
- ``` ruby
81
+ ```ruby
76
82
  require "stripe"
77
83
 
78
- Stripe::Charge.list(
84
+ Stripe::Customer.list(
79
85
  {},
80
- :api_key => "sk_test_...",
81
- :stripe_account => "acct_..."
86
+ {
87
+ api_key: 'sk_test_...',
88
+ stripe_account: 'acct_...',
89
+ stripe_version: '2018-02-28',
90
+ }
91
+ )
92
+
93
+ Stripe::Customer.retrieve(
94
+ 'cus_123456789',
95
+ {
96
+ api_key: 'sk_test_...',
97
+ stripe_account: 'acct_...',
98
+ stripe_version: '2018-02-28',
99
+ }
82
100
  )
83
101
 
84
- Stripe::Charge.retrieve(
85
- "ch_18atAXCdGbJFKhCuBAa4532Z",
86
- :api_key => "sk_test_...",
87
- :stripe_account => "acct_..."
102
+ Stripe::Customer.retrieve(
103
+ {
104
+ id: 'cus_123456789',
105
+ expand: %w(balance_transaction)
106
+ },
107
+ {
108
+ stripe_version: '2018-02-28',
109
+ api_key: 'sk_test_...',
110
+ }
111
+ )
112
+
113
+ Stripe::Customer.capture(
114
+ 'cus_123456789',
115
+ {},
116
+ {
117
+ stripe_version: '2018-02-28',
118
+ api_key: 'sk_test_...',
119
+ }
88
120
  )
89
121
  ```
90
122
 
91
- ### Configuring a Client
123
+ Keep in mind that there are different method signatures depending on the action:
92
124
 
93
- While a default HTTP client is used by default, it's also possible to have the
94
- library use any client supported by [Faraday][faraday] by initializing a
95
- `Stripe::StripeClient` object and giving it a connection:
125
+ - When operating on a collection (e.g. `.list`, `.create`) the method signature is
126
+ `method(params, opts)`.
127
+ - When operating on resource (e.g. `.capture`, `.update`) the method signature is
128
+ `method(id, params, opts)`.
129
+ - One exception is that `retrieve`, despite being an operation on a resource, has the signature
130
+ `retrieve(id, opts)`. In addition, it will accept a Hash for the `id` param but will extract the
131
+ `id` key out and use the others as options.
96
132
 
97
- ``` ruby
98
- conn = Faraday.new
99
- client = Stripe::StripeClient.new(conn)
100
- charge, resp = client.request do
101
- Stripe::Charge.retrieve(
102
- "ch_18atAXCdGbJFKhCuBAa4532Z",
103
- )
133
+ ### Accessing a response object
134
+
135
+ Get access to response objects by initializing a client and using its `request`
136
+ method:
137
+
138
+ ```ruby
139
+ client = Stripe::StripeClient.new
140
+ customer, resp = client.request do
141
+ Stripe::Customer.retrieve('cus_123456789',)
104
142
  end
105
143
  puts resp.request_id
106
144
  ```
107
145
 
146
+ ### Configuring a proxy
147
+
148
+ A proxy can be configured with `Stripe.proxy`:
149
+
150
+ ```ruby
151
+ Stripe.proxy = 'https://user:pass@example.com:1234'
152
+ ```
153
+
154
+ ### Configuring an API Version
155
+
156
+ By default, the library will use the API version pinned to the account making
157
+ a request. This can be overridden with this global option:
158
+
159
+ ```ruby
160
+ Stripe.api_version = '2018-02-28'
161
+ ```
162
+
163
+ See [versioning in the API reference][versioning] for more information.
164
+
108
165
  ### Configuring CA Bundles
109
166
 
110
167
  By default, the library will use its own internal bundle of known CA
111
168
  certificates, but it's possible to configure your own:
112
169
 
113
- Stripe.ca_bundle_path = "path/to/ca/bundle"
170
+ ```ruby
171
+ Stripe.ca_bundle_path = 'path/to/ca/bundle'
172
+ ```
114
173
 
115
174
  ### Configuring Automatic Retries
116
175
 
117
- The library can be configured to automatically retry requests that fail due to
118
- an intermittent network problem:
176
+ You can enable automatic retries on requests that fail due to a transient
177
+ problem by configuring the maximum number of retries:
178
+
179
+ ```ruby
180
+ Stripe.max_network_retries = 2
181
+ ```
119
182
 
120
- Stripe.max_network_retries = 2
183
+ Various errors can trigger a retry, like a connection error or a timeout, and
184
+ also certain API responses like HTTP status `409 Conflict`.
121
185
 
122
186
  [Idempotency keys][idempotency-keys] are added to requests to guarantee that
123
187
  retries are safe.
124
188
 
125
189
  ### Configuring Timeouts
126
190
 
127
- Open and read timeouts are configurable:
191
+ Open, read and write timeouts are configurable:
128
192
 
129
- ```java
130
- Stripe.open_timeout = 30 // in seconds
193
+ ```ruby
194
+ Stripe.open_timeout = 30 # in seconds
131
195
  Stripe.read_timeout = 80
196
+ Stripe.write_timeout = 30 # only supported on Ruby 2.6+
132
197
  ```
133
198
 
134
199
  Please take care to set conservative read timeouts. Some API requests can take
@@ -144,49 +209,130 @@ production use, but `debug` is also available for more verbosity.
144
209
  There are a few options for enabling it:
145
210
 
146
211
  1. Set the environment variable `STRIPE_LOG` to the value `debug` or `info`:
147
- ```
212
+
213
+ ```sh
148
214
  $ export STRIPE_LOG=info
149
215
  ```
150
216
 
151
217
  2. Set `Stripe.log_level`:
152
- ``` ruby
218
+
219
+ ```ruby
153
220
  Stripe.log_level = Stripe::LEVEL_INFO
154
221
  ```
155
222
 
223
+ ### Instrumentation
224
+
225
+ The library has various hooks that user code can tie into by passing a block to
226
+ `Stripe::Instrumentation.subscribe` to be notified about specific events.
227
+
228
+ #### `request_begin`
229
+
230
+ Invoked when an HTTP request starts. Receives `RequestBeginEvent` with the
231
+ following properties:
232
+
233
+ - `method`: HTTP method. (`Symbol`)
234
+ - `path`: Request path. (`String`)
235
+ - `user_data`: A hash on which users can set arbitrary data, and which will be
236
+ passed through to `request_end` invocations. This could be used, for example,
237
+ to assign unique IDs to each request, and it'd work even if many requests are
238
+ running in parallel. All subscribers share the same object for any particular
239
+ request, so they must be careful to use unique keys that will not conflict
240
+ with other subscribers. (`Hash`)
241
+
242
+ #### `request_end`
243
+
244
+ Invoked when an HTTP request finishes, regardless of whether it terminated with
245
+ a success or error. Receives `RequestEndEvent` with the following properties:
246
+
247
+ - `duration`: Request duration in seconds. (`Float`)
248
+ - `http_status`: HTTP response code (`Integer`) if available, or `nil` in case
249
+ of a lower level network error.
250
+ - `method`: HTTP method. (`Symbol`)
251
+ - `num_retries`: The number of retries. (`Integer`)
252
+ - `path`: Request path. (`String`)
253
+ - `user_data`: A hash on which users may have set arbitrary data in
254
+ `request_begin`. See above for more information. (`Hash`)
255
+ - `request_id`. HTTP request identifier.
256
+
257
+ #### Example
258
+
259
+ For example:
260
+
261
+ ```ruby
262
+ Stripe::Instrumentation.subscribe(:request_end) do |request_event|
263
+ tags = {
264
+ method: request_event.method,
265
+ resource: request_event.path.split('/')[2],
266
+ code: request_event.http_status,
267
+ retries: request_event.num_retries
268
+ }
269
+ StatsD.distribution('stripe_request', request_event.duration, tags: tags)
270
+ end
271
+ ```
272
+
156
273
  ### Writing a Plugin
157
274
 
158
275
  If you're writing a plugin that uses the library, we'd appreciate it if you
159
276
  identified using `#set_app_info`:
160
277
 
161
- Stripe.set_app_info("MyAwesomePlugin", version: "1.2.34", url: "https://myawesomeplugin.info");
278
+ ```ruby
279
+ Stripe.set_app_info('MyAwesomePlugin', version: '1.2.34', url: 'https://myawesomeplugin.info')
280
+ ```
162
281
 
163
282
  This information is passed along when the library makes calls to the Stripe
164
283
  API.
165
284
 
285
+ ### Request latency telemetry
286
+
287
+ By default, the library sends request latency telemetry to Stripe. These
288
+ numbers help Stripe improve the overall latency of its API for all users.
289
+
290
+ You can disable this behavior if you prefer:
291
+
292
+ ```ruby
293
+ Stripe.enable_telemetry = false
294
+ ```
295
+
166
296
  ## Development
167
297
 
168
298
  The test suite depends on [stripe-mock], so make sure to fetch and run it from a
169
299
  background terminal ([stripe-mock's README][stripe-mock] also contains
170
300
  instructions for installing via Homebrew and other methods):
171
301
 
172
- go get -u github.com/stripe/stripe-mock
173
- stripe-mock
302
+ ```sh
303
+ go get -u github.com/stripe/stripe-mock
304
+ stripe-mock
305
+ ```
174
306
 
175
307
  Run all tests:
176
308
 
177
- bundle exec rake
309
+ ```sh
310
+ bundle exec rake test
311
+ ```
178
312
 
179
313
  Run a single test suite:
180
314
 
181
- bundle exec ruby -Ilib/ test/stripe/util_test.rb
315
+ ```sh
316
+ bundle exec ruby -Ilib/ test/stripe/util_test.rb
317
+ ```
182
318
 
183
319
  Run a single test:
184
320
 
185
- bundle exec ruby -Ilib/ test/stripe/util_test.rb -n /should.convert.names.to.symbols/
321
+ ```sh
322
+ bundle exec ruby -Ilib/ test/stripe/util_test.rb -n /should.convert.names.to.symbols/
323
+ ```
324
+
325
+ Run the linter:
326
+
327
+ ```sh
328
+ bundle exec rake rubocop
329
+ ```
186
330
 
187
331
  Update bundled CA certificates from the [Mozilla cURL release][curl]:
188
332
 
189
- bundle exec rake update_certs
333
+ ```sh
334
+ bundle exec rake update_certs
335
+ ```
190
336
 
191
337
  Update the bundled [stripe-mock] by editing the version number found in
192
338
  `.travis.yml`.
@@ -194,9 +340,10 @@ Update the bundled [stripe-mock] by editing the version number found in
194
340
  [api-keys]: https://dashboard.stripe.com/account/apikeys
195
341
  [connect]: https://stripe.com/connect
196
342
  [curl]: http://curl.haxx.se/docs/caextract.html
197
- [faraday]: https://github.com/lostisland/faraday
198
343
  [idempotency-keys]: https://stripe.com/docs/api/ruby#idempotent_requests
199
344
  [stripe-mock]: https://github.com/stripe/stripe-mock
345
+ [versioning]: https://stripe.com/docs/api/ruby#versioning
346
+ [youtube-playlist]: https://www.youtube.com/playlist?list=PLy1nL-pvL2M50RmP6ie-gdcSnfOuQCRYk
200
347
 
201
348
  <!--
202
349
  # vim: set tw=79:
data/Rakefile CHANGED
@@ -1,31 +1,37 @@
1
- require 'rake/testtask'
1
+ # frozen_string_literal: true
2
2
 
3
- task :default => [:test]
3
+ require "rake/testtask"
4
+ require "rubocop/rake_task"
5
+
6
+ task default: %i[test rubocop]
4
7
 
5
8
  Rake::TestTask.new do |t|
6
- t.pattern = './test/**/*_test.rb'
9
+ t.pattern = "./test/**/*_test.rb"
7
10
  end
8
11
 
12
+ RuboCop::RakeTask.new
13
+
9
14
  desc "Update bundled certs"
10
15
  task :update_certs do
11
- require "faraday"
16
+ require "net/http"
17
+ require "uri"
12
18
 
13
19
  fetch_file "https://curl.haxx.se/ca/cacert.pem",
14
- File.expand_path("../lib/data/ca-certificates.crt", __FILE__)
20
+ ::File.expand_path("../lib/data/ca-certificates.crt", __FILE__)
15
21
  end
16
22
 
17
23
  #
18
24
  # helpers
19
25
  #
20
26
 
21
- def fetch_file(url, dest)
22
- File.open(dest, 'w') do |file|
23
- resp = Faraday.get(url)
24
- unless resp.status == 200
25
- abort("bad response when fetching: #{url}\n" \
26
- "Status #{resp.status}: #{resp.body}")
27
+ def fetch_file(uri, dest)
28
+ ::File.open(dest, "w") do |file|
29
+ resp = Net::HTTP.get_response(URI.parse(uri))
30
+ unless resp.code.to_i == 200
31
+ abort("bad response when fetching: #{uri}\n" \
32
+ "Status #{resp.code}: #{resp.body}")
27
33
  end
28
34
  file.write(resp.body)
29
- puts "Successfully fetched: #{url}"
35
+ puts "Successfully fetched: #{uri}"
30
36
  end
31
37
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.3.1
1
+ 5.38.0
data/bin/stripe-console CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'irb'
4
- require 'irb/completion'
3
+ # frozen_string_literal: true
5
4
 
6
- require "#{File.dirname(__FILE__)}/../lib/stripe"
5
+ require "irb"
6
+ require "irb/completion"
7
+
8
+ require "#{::File.dirname(__FILE__)}/../lib/stripe"
7
9
 
8
10
  # Config IRB to enable --simple-prompt and auto indent
9
11
  IRB.conf[:PROMPT_MODE] = :SIMPLE
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stripe
2
4
  module APIOperations
3
5
  module Create
4
- def create(params={}, opts={})
5
- resp, opts = request(:post, resource_url, params, opts)
6
+ def create(params = {}, opts = {})
7
+ resp, opts = execute_resource_request(:post, resource_url, params, opts)
6
8
  Util.convert_to_stripe_object(resp.data, opts)
7
9
  end
8
10
  end
@@ -1,11 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stripe
2
4
  module APIOperations
3
5
  module Delete
4
- def delete(params={}, opts={})
5
- opts = Util.normalize_opts(opts)
6
- resp, opts = request(:delete, resource_url, params, opts)
6
+ module ClassMethods
7
+ # Deletes an API resource
8
+ #
9
+ # Deletes the identified resource with the passed in parameters.
10
+ #
11
+ # ==== Attributes
12
+ #
13
+ # * +id+ - ID of the resource to delete.
14
+ # * +params+ - A hash of parameters to pass to the API
15
+ # * +opts+ - A Hash of additional options (separate from the params /
16
+ # object values) to be added to the request. E.g. to allow for an
17
+ # idempotency_key to be passed in the request headers, or for the
18
+ # api_key to be overwritten. See
19
+ # {APIOperations::Request.execute_resource_request}.
20
+ def delete(id, params = {}, opts = {})
21
+ resp, opts = execute_resource_request(:delete,
22
+ "#{resource_url}/#{id}",
23
+ params, opts)
24
+ Util.convert_to_stripe_object(resp.data, opts)
25
+ end
26
+ end
27
+
28
+ def delete(params = {}, opts = {})
29
+ resp, opts = execute_resource_request(:delete, resource_url,
30
+ params, opts)
7
31
  initialize_from(resp.data, opts)
8
32
  end
33
+
34
+ def self.included(base)
35
+ base.extend(ClassMethods)
36
+ end
9
37
  end
10
38
  end
11
39
  end
@@ -1,28 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Stripe
2
4
  module APIOperations
3
5
  module List
4
- def list(filters={}, opts={})
6
+ def list(filters = {}, opts = {})
5
7
  opts = Util.normalize_opts(opts)
6
8
 
7
- resp, opts = request(:get, resource_url, filters, opts)
9
+ resp, opts = execute_resource_request(:get, resource_url, filters, opts)
8
10
  obj = ListObject.construct_from(resp.data, opts)
9
11
 
10
12
  # set filters so that we can fetch the same limit, expansions, and
11
13
  # predicates when accessing the next and previous pages
12
- #
13
- # just for general cleanliness, remove any paging options
14
14
  obj.filters = filters.dup
15
- obj.filters.delete(:ending_before)
16
- obj.filters.delete(:starting_after)
17
-
18
15
  obj
19
16
  end
20
-
21
- # The original version of #list was given the somewhat unfortunate name of
22
- # #all, and this alias allows us to maintain backward compatibility (the
23
- # choice was somewhat misleading in the way that it only returned a single
24
- # page rather than all objects).
25
- alias :all :list
26
17
  end
27
18
  end
28
19
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ module APIOperations
5
+ # Adds methods to help manipulate a subresource from its parent resource so
6
+ # that it's possible to do so from a static context (i.e. without a
7
+ # pre-existing collection of subresources on the parent).
8
+ #
9
+ # For example, a transfer gains the static methods for reversals so that the
10
+ # methods `.create_reversal`, `.retrieve_reversal`, `.update_reversal`,
11
+ # etc. all become available.
12
+ module NestedResource
13
+ def nested_resource_class_methods(resource, path: nil, operations: nil,
14
+ resource_plural: nil)
15
+ resource_plural ||= "#{resource}s"
16
+ path ||= resource_plural
17
+
18
+ raise ArgumentError, "operations array required" if operations.nil?
19
+
20
+ resource_url_method = :"#{resource}s_url"
21
+
22
+ define_singleton_method(resource_url_method) do |id, nested_id = nil|
23
+ url = "#{resource_url}/#{CGI.escape(id)}/#{CGI.escape(path)}"
24
+ url += "/#{CGI.escape(nested_id)}" unless nested_id.nil?
25
+ url
26
+ end
27
+
28
+ operations.each do |operation|
29
+ case operation
30
+ when :create
31
+ define_singleton_method(:"create_#{resource}") \
32
+ do |id, params = {}, opts = {}|
33
+ url = send(resource_url_method, id)
34
+ resp, opts = execute_resource_request(:post, url, params, opts)
35
+ Util.convert_to_stripe_object(resp.data, opts)
36
+ end
37
+ when :retrieve
38
+ define_singleton_method(:"retrieve_#{resource}") \
39
+ do |id, nested_id, opts = {}|
40
+ url = send(resource_url_method, id, nested_id)
41
+ resp, opts = execute_resource_request(:get, url, {}, opts)
42
+ Util.convert_to_stripe_object(resp.data, opts)
43
+ end
44
+ when :update
45
+ define_singleton_method(:"update_#{resource}") \
46
+ do |id, nested_id, params = {}, opts = {}|
47
+ url = send(resource_url_method, id, nested_id)
48
+ resp, opts = execute_resource_request(:post, url, params, opts)
49
+ Util.convert_to_stripe_object(resp.data, opts)
50
+ end
51
+ when :delete
52
+ define_singleton_method(:"delete_#{resource}") \
53
+ do |id, nested_id, params = {}, opts = {}|
54
+ url = send(resource_url_method, id, nested_id)
55
+ resp, opts = execute_resource_request(:delete, url, params,
56
+ opts)
57
+ Util.convert_to_stripe_object(resp.data, opts)
58
+ end
59
+ when :list
60
+ define_singleton_method(:"list_#{resource_plural}") \
61
+ do |id, params = {}, opts = {}|
62
+ url = send(resource_url_method, id)
63
+ resp, opts = execute_resource_request(:get, url, params, opts)
64
+ Util.convert_to_stripe_object(resp.data, opts)
65
+ end
66
+ else
67
+ raise ArgumentError, "Unknown operation: #{operation.inspect}"
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end