stripe 4.10.0 → 5.55.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +316 -1
  3. data/CODE_OF_CONDUCT.md +77 -0
  4. data/Gemfile +10 -14
  5. data/Makefile +7 -0
  6. data/README.md +186 -62
  7. data/Rakefile +8 -7
  8. data/VERSION +1 -1
  9. data/lib/stripe/api_operations/create.rb +1 -1
  10. data/lib/stripe/api_operations/delete.rb +28 -2
  11. data/lib/stripe/api_operations/list.rb +1 -12
  12. data/lib/stripe/api_operations/nested_resource.rb +38 -28
  13. data/lib/stripe/api_operations/request.rb +81 -9
  14. data/lib/stripe/api_operations/save.rb +8 -7
  15. data/lib/stripe/api_operations/search.rb +19 -0
  16. data/lib/stripe/api_resource.rb +45 -3
  17. data/lib/stripe/api_resource_test_helpers.rb +47 -0
  18. data/lib/stripe/connection_manager.rb +200 -0
  19. data/lib/stripe/error_object.rb +93 -0
  20. data/lib/stripe/errors.rb +31 -10
  21. data/lib/stripe/instrumentation.rb +84 -0
  22. data/lib/stripe/list_object.rb +41 -7
  23. data/lib/stripe/multipart_encoder.rb +131 -0
  24. data/lib/stripe/oauth.rb +8 -6
  25. data/lib/stripe/object_types.rb +119 -0
  26. data/lib/stripe/{account.rb → resources/account.rb} +48 -30
  27. data/lib/stripe/{account_link.rb → resources/account_link.rb} +2 -1
  28. data/lib/stripe/resources/alipay_account.rb +34 -0
  29. data/lib/stripe/{apple_pay_domain.rb → resources/apple_pay_domain.rb} +2 -1
  30. data/lib/stripe/resources/application_fee.rb +14 -0
  31. data/lib/stripe/resources/application_fee_refund.rb +31 -0
  32. data/lib/stripe/{balance.rb → resources/balance.rb} +2 -1
  33. data/lib/stripe/{balance_transaction.rb → resources/balance_transaction.rb} +2 -5
  34. data/lib/stripe/resources/bank_account.rb +43 -0
  35. data/lib/stripe/{issuing/dispute.rb → resources/billing_portal/configuration.rb} +4 -3
  36. data/lib/stripe/resources/billing_portal/session.rb +12 -0
  37. data/lib/stripe/{bitcoin_receiver.rb → resources/bitcoin_receiver.rb} +4 -3
  38. data/lib/stripe/resources/bitcoin_transaction.rb +16 -0
  39. data/lib/stripe/resources/capability.rb +34 -0
  40. data/lib/stripe/{card.rb → resources/card.rb} +13 -4
  41. data/lib/stripe/resources/cash_balance.rb +22 -0
  42. data/lib/stripe/resources/charge.rb +32 -0
  43. data/lib/stripe/resources/checkout/session.rb +27 -0
  44. data/lib/stripe/{country_spec.rb → resources/country_spec.rb} +2 -1
  45. data/lib/stripe/{coupon.rb → resources/coupon.rb} +3 -2
  46. data/lib/stripe/resources/credit_note.rb +33 -0
  47. data/lib/stripe/resources/credit_note_line_item.rb +8 -0
  48. data/lib/stripe/resources/customer.rb +74 -0
  49. data/lib/stripe/resources/customer_balance_transaction.rb +31 -0
  50. data/lib/stripe/resources/discount.rb +8 -0
  51. data/lib/stripe/resources/dispute.rb +22 -0
  52. data/lib/stripe/{ephemeral_key.rb → resources/ephemeral_key.rb} +6 -2
  53. data/lib/stripe/{event.rb → resources/event.rb} +2 -1
  54. data/lib/stripe/{exchange_rate.rb → resources/exchange_rate.rb} +2 -1
  55. data/lib/stripe/resources/file.rb +36 -0
  56. data/lib/stripe/{file_link.rb → resources/file_link.rb} +3 -2
  57. data/lib/stripe/resources/financial_connections/account.rb +31 -0
  58. data/lib/stripe/resources/financial_connections/account_owner.rb +10 -0
  59. data/lib/stripe/resources/financial_connections/account_ownership.rb +10 -0
  60. data/lib/stripe/resources/financial_connections/session.rb +12 -0
  61. data/lib/stripe/resources/funding_instructions.rb +16 -0
  62. data/lib/stripe/resources/identity/verification_report.rb +12 -0
  63. data/lib/stripe/resources/identity/verification_session.rb +35 -0
  64. data/lib/stripe/resources/invoice.rb +83 -0
  65. data/lib/stripe/{invoice_item.rb → resources/invoice_item.rb} +3 -2
  66. data/lib/stripe/{invoice_line_item.rb → resources/invoice_line_item.rb} +2 -1
  67. data/lib/stripe/resources/issuing/authorization.rb +34 -0
  68. data/lib/stripe/resources/issuing/card.rb +25 -0
  69. data/lib/stripe/resources/issuing/card_details.rb +10 -0
  70. data/lib/stripe/{issuing → resources/issuing}/cardholder.rb +3 -2
  71. data/lib/stripe/resources/issuing/dispute.rb +25 -0
  72. data/lib/stripe/{issuing → resources/issuing}/transaction.rb +3 -2
  73. data/lib/stripe/resources/line_item.rb +8 -0
  74. data/lib/stripe/resources/login_link.rb +15 -0
  75. data/lib/stripe/resources/mandate.rb +8 -0
  76. data/lib/stripe/resources/order.rb +33 -0
  77. data/lib/stripe/{order_return.rb → resources/order_return.rb} +2 -1
  78. data/lib/stripe/resources/payment_intent.rb +82 -0
  79. data/lib/stripe/resources/payment_link.rb +23 -0
  80. data/lib/stripe/resources/payment_method.rb +33 -0
  81. data/lib/stripe/resources/payout.rb +33 -0
  82. data/lib/stripe/{person.rb → resources/person.rb} +9 -3
  83. data/lib/stripe/{plan.rb → resources/plan.rb} +2 -1
  84. data/lib/stripe/resources/price.rb +21 -0
  85. data/lib/stripe/resources/product.rb +22 -0
  86. data/lib/stripe/resources/promotion_code.rb +12 -0
  87. data/lib/stripe/resources/quote.rb +105 -0
  88. data/lib/stripe/resources/radar/early_fraud_warning.rb +12 -0
  89. data/lib/stripe/{radar → resources/radar}/value_list.rb +3 -2
  90. data/lib/stripe/{radar → resources/radar}/value_list_item.rb +3 -2
  91. data/lib/stripe/{recipient.rb → resources/recipient.rb} +3 -6
  92. data/lib/stripe/{recipient_transfer.rb → resources/recipient_transfer.rb} +1 -1
  93. data/lib/stripe/resources/refund.rb +42 -0
  94. data/lib/stripe/{reporting → resources/reporting}/report_run.rb +3 -2
  95. data/lib/stripe/{reporting → resources/reporting}/report_type.rb +3 -2
  96. data/lib/stripe/resources/reversal.rb +30 -0
  97. data/lib/stripe/resources/review.rb +21 -0
  98. data/lib/stripe/resources/setup_attempt.rb +10 -0
  99. data/lib/stripe/resources/setup_intent.rb +43 -0
  100. data/lib/stripe/{product.rb → resources/shipping_rate.rb} +4 -4
  101. data/lib/stripe/{sigma → resources/sigma}/scheduled_query_run.rb +3 -2
  102. data/lib/stripe/{sku.rb → resources/sku.rb} +4 -3
  103. data/lib/stripe/resources/source.rb +47 -0
  104. data/lib/stripe/{source_transaction.rb → resources/source_transaction.rb} +2 -1
  105. data/lib/stripe/resources/subscription.rb +35 -0
  106. data/lib/stripe/resources/subscription_item.rb +26 -0
  107. data/lib/stripe/resources/subscription_schedule.rb +33 -0
  108. data/lib/stripe/resources/tax_code.rb +10 -0
  109. data/lib/stripe/resources/tax_id.rb +27 -0
  110. data/lib/stripe/{refund.rb → resources/tax_rate.rb} +3 -2
  111. data/lib/stripe/{terminal/reader.rb → resources/terminal/configuration.rb} +3 -2
  112. data/lib/stripe/resources/terminal/connection_token.rb +12 -0
  113. data/lib/stripe/{terminal → resources/terminal}/location.rb +3 -2
  114. data/lib/stripe/resources/terminal/reader.rb +75 -0
  115. data/lib/stripe/resources/test_helpers/test_clock.rb +25 -0
  116. data/lib/stripe/{three_d_secure.rb → resources/three_d_secure.rb} +2 -1
  117. data/lib/stripe/{token.rb → resources/token.rb} +2 -1
  118. data/lib/stripe/resources/topup.rb +23 -0
  119. data/lib/stripe/resources/transfer.rb +27 -0
  120. data/lib/stripe/resources/usage_record.rb +8 -0
  121. data/lib/stripe/{usage_record_summary.rb → resources/usage_record_summary.rb} +2 -1
  122. data/lib/stripe/{webhook_endpoint.rb → resources/webhook_endpoint.rb} +3 -2
  123. data/lib/stripe/resources.rb +100 -0
  124. data/lib/stripe/search_result_object.rb +86 -0
  125. data/lib/stripe/singleton_api_resource.rb +3 -1
  126. data/lib/stripe/stripe_client.rb +661 -266
  127. data/lib/stripe/stripe_configuration.rb +194 -0
  128. data/lib/stripe/stripe_object.rb +80 -61
  129. data/lib/stripe/stripe_response.rb +87 -27
  130. data/lib/stripe/util.rb +128 -117
  131. data/lib/stripe/version.rb +1 -1
  132. data/lib/stripe/webhook.rb +43 -10
  133. data/lib/stripe.rb +46 -197
  134. data/stripe.gemspec +24 -8
  135. metadata +123 -283
  136. data/.gitattributes +0 -4
  137. data/.github/ISSUE_TEMPLATE.md +0 -5
  138. data/.gitignore +0 -8
  139. data/.rubocop.yml +0 -32
  140. data/.rubocop_todo.yml +0 -50
  141. data/.travis.yml +0 -42
  142. data/lib/stripe/alipay_account.rb +0 -27
  143. data/lib/stripe/application_fee.rb +0 -23
  144. data/lib/stripe/application_fee_refund.rb +0 -22
  145. data/lib/stripe/bank_account.rb +0 -32
  146. data/lib/stripe/bitcoin_transaction.rb +0 -15
  147. data/lib/stripe/charge.rb +0 -84
  148. data/lib/stripe/checkout/session.rb +0 -11
  149. data/lib/stripe/customer.rb +0 -90
  150. data/lib/stripe/dispute.rb +0 -19
  151. data/lib/stripe/file.rb +0 -37
  152. data/lib/stripe/invoice.rb +0 -48
  153. data/lib/stripe/issuer_fraud_record.rb +0 -9
  154. data/lib/stripe/issuing/authorization.rb +0 -22
  155. data/lib/stripe/issuing/card.rb +0 -18
  156. data/lib/stripe/issuing/card_details.rb +0 -9
  157. data/lib/stripe/login_link.rb +0 -11
  158. data/lib/stripe/order.rb +0 -31
  159. data/lib/stripe/payment_intent.rb +0 -26
  160. data/lib/stripe/payment_method.rb +0 -23
  161. data/lib/stripe/payout.rb +0 -20
  162. data/lib/stripe/reversal.rb +0 -22
  163. data/lib/stripe/review.rb +0 -14
  164. data/lib/stripe/source.rb +0 -38
  165. data/lib/stripe/subscription.rb +0 -25
  166. data/lib/stripe/subscription_item.rb +0 -17
  167. data/lib/stripe/subscription_schedule.rb +0 -32
  168. data/lib/stripe/subscription_schedule_revision.rb +0 -25
  169. data/lib/stripe/terminal/connection_token.rb +0 -11
  170. data/lib/stripe/topup.rb +0 -16
  171. data/lib/stripe/transfer.rb +0 -23
  172. data/lib/stripe/usage_record.rb +0 -14
  173. data/test/api_stub_helpers.rb +0 -1
  174. data/test/openapi/README.md +0 -9
  175. data/test/stripe/account_external_accounts_operations_test.rb +0 -69
  176. data/test/stripe/account_link_test.rb +0 -18
  177. data/test/stripe/account_login_links_operations_test.rb +0 -21
  178. data/test/stripe/account_persons_operations_test.rb +0 -70
  179. data/test/stripe/account_test.rb +0 -256
  180. data/test/stripe/alipay_account_test.rb +0 -37
  181. data/test/stripe/api_operations_test.rb +0 -81
  182. data/test/stripe/api_resource_test.rb +0 -526
  183. data/test/stripe/apple_pay_domain_test.rb +0 -33
  184. data/test/stripe/application_fee_refund_test.rb +0 -37
  185. data/test/stripe/application_fee_refunds_operations_test.rb +0 -56
  186. data/test/stripe/application_fee_test.rb +0 -14
  187. data/test/stripe/balance_test.rb +0 -13
  188. data/test/stripe/bank_account_test.rb +0 -36
  189. data/test/stripe/charge_test.rb +0 -59
  190. data/test/stripe/checkout/session_test.rb +0 -41
  191. data/test/stripe/country_spec_test.rb +0 -20
  192. data/test/stripe/coupon_test.rb +0 -51
  193. data/test/stripe/customer_card_test.rb +0 -42
  194. data/test/stripe/customer_sources_operations_test.rb +0 -64
  195. data/test/stripe/customer_test.rb +0 -115
  196. data/test/stripe/dispute_test.rb +0 -42
  197. data/test/stripe/ephemeral_key_test.rb +0 -86
  198. data/test/stripe/errors_test.rb +0 -20
  199. data/test/stripe/exchange_rate_test.rb +0 -20
  200. data/test/stripe/file_link_test.rb +0 -41
  201. data/test/stripe/file_test.rb +0 -73
  202. data/test/stripe/file_upload_test.rb +0 -76
  203. data/test/stripe/invoice_item_test.rb +0 -55
  204. data/test/stripe/invoice_line_item_test.rb +0 -8
  205. data/test/stripe/invoice_test.rb +0 -161
  206. data/test/stripe/issuer_fraud_record_test.rb +0 -20
  207. data/test/stripe/issuing/authorization_test.rb +0 -50
  208. data/test/stripe/issuing/card_test.rb +0 -53
  209. data/test/stripe/issuing/cardholder_test.rb +0 -53
  210. data/test/stripe/issuing/dispute_test.rb +0 -45
  211. data/test/stripe/issuing/transaction_test.rb +0 -48
  212. data/test/stripe/list_object_test.rb +0 -156
  213. data/test/stripe/login_link_test.rb +0 -37
  214. data/test/stripe/oauth_test.rb +0 -88
  215. data/test/stripe/order_return_test.rb +0 -21
  216. data/test/stripe/order_test.rb +0 -57
  217. data/test/stripe/payment_intent_test.rb +0 -80
  218. data/test/stripe/payment_method_test.rb +0 -66
  219. data/test/stripe/payout_test.rb +0 -50
  220. data/test/stripe/person_test.rb +0 -46
  221. data/test/stripe/plan_test.rb +0 -92
  222. data/test/stripe/product_test.rb +0 -49
  223. data/test/stripe/radar/value_list_item_test.rb +0 -38
  224. data/test/stripe/radar/value_list_test.rb +0 -51
  225. data/test/stripe/recipient_test.rb +0 -49
  226. data/test/stripe/refund_test.rb +0 -39
  227. data/test/stripe/reporting/report_run_test.rb +0 -33
  228. data/test/stripe/reporting/report_type_test.rb +0 -22
  229. data/test/stripe/reversal_test.rb +0 -43
  230. data/test/stripe/review_test.rb +0 -27
  231. data/test/stripe/sigma/scheduled_query_run_test.rb +0 -22
  232. data/test/stripe/sku_test.rb +0 -50
  233. data/test/stripe/source_test.rb +0 -86
  234. data/test/stripe/source_transaction_test.rb +0 -19
  235. data/test/stripe/stripe_client_test.rb +0 -823
  236. data/test/stripe/stripe_object_test.rb +0 -525
  237. data/test/stripe/stripe_response_test.rb +0 -49
  238. data/test/stripe/subscription_item_test.rb +0 -53
  239. data/test/stripe/subscription_schedule_revision_test.rb +0 -37
  240. data/test/stripe/subscription_schedule_revisions_operations_test.rb +0 -35
  241. data/test/stripe/subscription_schedule_test.rb +0 -64
  242. data/test/stripe/subscription_test.rb +0 -60
  243. data/test/stripe/terminal/connection_token_test.rb +0 -16
  244. data/test/stripe/terminal/location_test.rb +0 -58
  245. data/test/stripe/terminal/reader_test.rb +0 -52
  246. data/test/stripe/three_d_secure_test.rb +0 -23
  247. data/test/stripe/topup_test.rb +0 -54
  248. data/test/stripe/transfer_reversals_operations_test.rb +0 -57
  249. data/test/stripe/transfer_test.rb +0 -43
  250. data/test/stripe/usage_record_summary_test.rb +0 -19
  251. data/test/stripe/usage_record_test.rb +0 -28
  252. data/test/stripe/util_test.rb +0 -402
  253. data/test/stripe/webhook_endpoint_test.rb +0 -42
  254. data/test/stripe/webhook_test.rb +0 -96
  255. data/test/stripe_mock.rb +0 -77
  256. data/test/stripe_test.rb +0 -63
  257. data/test/test_data.rb +0 -61
  258. data/test/test_helper.rb +0 -73
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Stripe Ruby Library
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/stripe.svg)](https://badge.fury.io/rb/stripe)
3
4
  [![Build Status](https://travis-ci.org/stripe/stripe-ruby.svg?branch=master)](https://travis-ci.org/stripe/stripe-ruby)
4
- [![Coverage Status](https://coveralls.io/repos/github/stripe/stripe-ruby/badge.svg?branch=master)](https://coveralls.io/github/stripe/stripe-ruby?branch=master)
5
5
 
6
6
  The Stripe Ruby library provides convenient access to the Stripe API from
7
7
  applications written in the Ruby language. It includes a pre-defined set of
@@ -11,31 +11,36 @@ API.
11
11
 
12
12
  The library also provides other features. For example:
13
13
 
14
- * Easy configuration path for fast setup and use.
15
- * Helpers for pagination.
16
- * Tracking of "fresh" values in API resources so that partial updates can be
17
- executed.
18
- * 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
19
17
  expectations of Stripe's API.
20
18
 
21
19
  ## Documentation
22
20
 
23
- See the [Ruby API docs](https://stripe.com/docs/api/ruby#intro).
21
+ See the [Ruby API docs](https://stripe.com/docs/api?lang=ruby).
22
+
23
+ See [video demonstrations][youtube-playlist] covering how to use the library.
24
+
24
25
 
25
26
  ## Installation
26
27
 
27
28
  You don't need this source code unless you want to modify the gem. If you just
28
29
  want to use the package, just run:
29
30
 
30
- gem install stripe
31
+ ```sh
32
+ gem install stripe
33
+ ```
31
34
 
32
35
  If you want to build the gem from source:
33
36
 
34
- gem build stripe.gemspec
37
+ ```sh
38
+ gem build stripe.gemspec
39
+ ```
35
40
 
36
41
  ### Requirements
37
42
 
38
- * Ruby 2.0+.
43
+ - Ruby 2.3+.
39
44
 
40
45
  ### Bundler
41
46
 
@@ -43,7 +48,7 @@ If you are installing via bundler, you should be sure to use the https rubygems
43
48
  source in your Gemfile, as any gems fetched over http could potentially be
44
49
  compromised in transit and alter the code of gems fetched securely over https:
45
50
 
46
- ``` ruby
51
+ ```ruby
47
52
  source 'https://rubygems.org'
48
53
 
49
54
  gem 'rails'
@@ -56,17 +61,15 @@ The library needs to be configured with your account's secret key which is
56
61
  available in your [Stripe Dashboard][api-keys]. Set `Stripe.api_key` to its
57
62
  value:
58
63
 
59
- ``` ruby
60
- require "stripe"
61
- Stripe.api_key = "sk_test_..."
64
+ ```ruby
65
+ require 'stripe'
66
+ Stripe.api_key = 'sk_test_...'
62
67
 
63
- # list charges
64
- Stripe::Charge.list()
68
+ # list customers
69
+ Stripe::Customer.list()
65
70
 
66
- # retrieve single charge
67
- Stripe::Charge.retrieve(
68
- "ch_18atAXCdGbJFKhCuBAa4532Z",
69
- )
71
+ # retrieve single customer
72
+ Stripe::Customer.retrieve('cus_123456789')
70
73
  ```
71
74
 
72
75
  ### Per-request Configuration
@@ -75,51 +78,87 @@ For apps that need to use multiple keys during the lifetime of a process, like
75
78
  one that uses [Stripe Connect][connect], it's also possible to set a
76
79
  per-request key and/or account:
77
80
 
78
- ``` ruby
81
+ ```ruby
79
82
  require "stripe"
80
83
 
81
- Stripe::Charge.list(
84
+ Stripe::Customer.list(
82
85
  {},
83
86
  {
84
- :api_key => "sk_test_...",
85
- :stripe_account => "acct_...",
86
- :stripe_version => "2018-02-28"
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
+ }
100
+ )
101
+
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_...',
87
110
  }
88
111
  )
89
112
 
90
- Stripe::Charge.retrieve(
91
- "ch_18atAXCdGbJFKhCuBAa4532Z",
113
+ Stripe::Customer.capture(
114
+ 'cus_123456789',
115
+ {},
92
116
  {
93
- :api_key => "sk_test_...",
94
- :stripe_account => "acct_...",
95
- :stripe_version => "2018-02-28"
117
+ stripe_version: '2018-02-28',
118
+ api_key: 'sk_test_...',
96
119
  }
97
120
  )
98
121
  ```
99
122
 
100
- ### Configuring a Client
123
+ Keep in mind that there are different method signatures depending on the action:
124
+
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.
132
+
133
+ ### Accessing a response object
101
134
 
102
- While a default HTTP client is used by default, it's also possible to have the
103
- library use any client supported by [Faraday][faraday] by initializing a
104
- `Stripe::StripeClient` object and giving it a connection:
135
+ Get access to response objects by initializing a client and using its `request`
136
+ method:
105
137
 
106
- ``` ruby
107
- conn = Faraday.new
108
- client = Stripe::StripeClient.new(conn)
109
- charge, resp = client.request do
110
- Stripe::Charge.retrieve(
111
- "ch_18atAXCdGbJFKhCuBAa4532Z",
112
- )
138
+ ```ruby
139
+ client = Stripe::StripeClient.new
140
+ customer, resp = client.request do
141
+ Stripe::Customer.retrieve('cus_123456789',)
113
142
  end
114
143
  puts resp.request_id
115
144
  ```
116
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
+
117
154
  ### Configuring an API Version
118
155
 
119
156
  By default, the library will use the API version pinned to the account making
120
157
  a request. This can be overridden with this global option:
121
158
 
122
- Stripe.api_version = "2018-02-28"
159
+ ```ruby
160
+ Stripe.api_version = '2018-02-28'
161
+ ```
123
162
 
124
163
  See [versioning in the API reference][versioning] for more information.
125
164
 
@@ -128,25 +167,33 @@ See [versioning in the API reference][versioning] for more information.
128
167
  By default, the library will use its own internal bundle of known CA
129
168
  certificates, but it's possible to configure your own:
130
169
 
131
- Stripe.ca_bundle_path = "path/to/ca/bundle"
170
+ ```ruby
171
+ Stripe.ca_bundle_path = 'path/to/ca/bundle'
172
+ ```
132
173
 
133
174
  ### Configuring Automatic Retries
134
175
 
135
- The library can be configured to automatically retry requests that fail due to
136
- 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:
137
178
 
138
- Stripe.max_network_retries = 2
179
+ ```ruby
180
+ Stripe.max_network_retries = 2
181
+ ```
182
+
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`.
139
185
 
140
186
  [Idempotency keys][idempotency-keys] are added to requests to guarantee that
141
187
  retries are safe.
142
188
 
143
189
  ### Configuring Timeouts
144
190
 
145
- Open and read timeouts are configurable:
191
+ Open, read and write timeouts are configurable:
146
192
 
147
- ```java
148
- Stripe.open_timeout = 30 // in seconds
193
+ ```ruby
194
+ Stripe.open_timeout = 30 # in seconds
149
195
  Stripe.read_timeout = 80
196
+ Stripe.write_timeout = 30 # only supported on Ruby 2.6+
150
197
  ```
151
198
 
152
199
  Please take care to set conservative read timeouts. Some API requests can take
@@ -162,53 +209,130 @@ production use, but `debug` is also available for more verbosity.
162
209
  There are a few options for enabling it:
163
210
 
164
211
  1. Set the environment variable `STRIPE_LOG` to the value `debug` or `info`:
165
- ```
212
+
213
+ ```sh
166
214
  $ export STRIPE_LOG=info
167
215
  ```
168
216
 
169
217
  2. Set `Stripe.log_level`:
170
- ``` ruby
218
+
219
+ ```ruby
171
220
  Stripe.log_level = Stripe::LEVEL_INFO
172
221
  ```
173
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
+
174
273
  ### Writing a Plugin
175
274
 
176
275
  If you're writing a plugin that uses the library, we'd appreciate it if you
177
276
  identified using `#set_app_info`:
178
277
 
179
- 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
+ ```
180
281
 
181
282
  This information is passed along when the library makes calls to the Stripe
182
283
  API.
183
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
+
184
296
  ## Development
185
297
 
186
298
  The test suite depends on [stripe-mock], so make sure to fetch and run it from a
187
299
  background terminal ([stripe-mock's README][stripe-mock] also contains
188
300
  instructions for installing via Homebrew and other methods):
189
301
 
190
- go get -u github.com/stripe/stripe-mock
191
- stripe-mock
302
+ ```sh
303
+ go get -u github.com/stripe/stripe-mock
304
+ stripe-mock
305
+ ```
192
306
 
193
307
  Run all tests:
194
308
 
195
- bundle exec rake test
309
+ ```sh
310
+ bundle exec rake test
311
+ ```
196
312
 
197
313
  Run a single test suite:
198
314
 
199
- bundle exec ruby -Ilib/ test/stripe/util_test.rb
315
+ ```sh
316
+ bundle exec ruby -Ilib/ test/stripe/util_test.rb
317
+ ```
200
318
 
201
319
  Run a single test:
202
320
 
203
- 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
+ ```
204
324
 
205
325
  Run the linter:
206
326
 
207
- bundle exec rake rubocop
327
+ ```sh
328
+ bundle exec rake rubocop
329
+ ```
208
330
 
209
331
  Update bundled CA certificates from the [Mozilla cURL release][curl]:
210
332
 
211
- bundle exec rake update_certs
333
+ ```sh
334
+ bundle exec rake update_certs
335
+ ```
212
336
 
213
337
  Update the bundled [stripe-mock] by editing the version number found in
214
338
  `.travis.yml`.
@@ -216,10 +340,10 @@ Update the bundled [stripe-mock] by editing the version number found in
216
340
  [api-keys]: https://dashboard.stripe.com/account/apikeys
217
341
  [connect]: https://stripe.com/connect
218
342
  [curl]: http://curl.haxx.se/docs/caextract.html
219
- [faraday]: https://github.com/lostisland/faraday
220
- [idempotency-keys]: https://stripe.com/docs/api/ruby#idempotent_requests
343
+ [idempotency-keys]: https://stripe.com/docs/api/idempotent_requests?lang=ruby
221
344
  [stripe-mock]: https://github.com/stripe/stripe-mock
222
- [versioning]: https://stripe.com/docs/api/ruby#versioning
345
+ [versioning]: https://stripe.com/docs/api/versioning?lang=ruby
346
+ [youtube-playlist]: https://www.youtube.com/playlist?list=PLy1nL-pvL2M50RmP6ie-gdcSnfOuQCRYk
223
347
 
224
348
  <!--
225
349
  # vim: set tw=79:
data/Rakefile CHANGED
@@ -13,7 +13,8 @@ RuboCop::RakeTask.new
13
13
 
14
14
  desc "Update bundled certs"
15
15
  task :update_certs do
16
- require "faraday"
16
+ require "net/http"
17
+ require "uri"
17
18
 
18
19
  fetch_file "https://curl.haxx.se/ca/cacert.pem",
19
20
  ::File.expand_path("../lib/data/ca-certificates.crt", __FILE__)
@@ -23,14 +24,14 @@ end
23
24
  # helpers
24
25
  #
25
26
 
26
- def fetch_file(url, dest)
27
+ def fetch_file(uri, dest)
27
28
  ::File.open(dest, "w") do |file|
28
- resp = Faraday.get(url)
29
- unless resp.status == 200
30
- abort("bad response when fetching: #{url}\n" \
31
- "Status #{resp.status}: #{resp.body}")
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}")
32
33
  end
33
34
  file.write(resp.body)
34
- puts "Successfully fetched: #{url}"
35
+ puts "Successfully fetched: #{uri}"
35
36
  end
36
37
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.10.0
1
+ 5.55.0
@@ -4,7 +4,7 @@ module Stripe
4
4
  module APIOperations
5
5
  module Create
6
6
  def create(params = {}, opts = {})
7
- resp, opts = request(:post, resource_url, params, opts)
7
+ resp, opts = execute_resource_request(:post, resource_url, params, opts)
8
8
  Util.convert_to_stripe_object(resp.data, opts)
9
9
  end
10
10
  end
@@ -3,11 +3,37 @@
3
3
  module Stripe
4
4
  module APIOperations
5
5
  module Delete
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
+
6
28
  def delete(params = {}, opts = {})
7
- opts = Util.normalize_opts(opts)
8
- resp, opts = request(:delete, resource_url, params, opts)
29
+ resp, opts = execute_resource_request(:delete, resource_url,
30
+ params, opts)
9
31
  initialize_from(resp.data, opts)
10
32
  end
33
+
34
+ def self.included(base)
35
+ base.extend(ClassMethods)
36
+ end
11
37
  end
12
38
  end
13
39
  end
@@ -6,25 +6,14 @@ module Stripe
6
6
  def list(filters = {}, opts = {})
7
7
  opts = Util.normalize_opts(opts)
8
8
 
9
- resp, opts = request(:get, resource_url, filters, opts)
9
+ resp, opts = execute_resource_request(:get, resource_url, filters, opts)
10
10
  obj = ListObject.construct_from(resp.data, opts)
11
11
 
12
12
  # set filters so that we can fetch the same limit, expansions, and
13
13
  # predicates when accessing the next and previous pages
14
- #
15
- # just for general cleanliness, remove any paging options
16
14
  obj.filters = filters.dup
17
- obj.filters.delete(:ending_before)
18
- obj.filters.delete(:starting_after)
19
-
20
15
  obj
21
16
  end
22
-
23
- # The original version of #list was given the somewhat unfortunate name of
24
- # #all, and this alias allows us to maintain backward compatibility (the
25
- # choice was somewhat misleading in the way that it only returned a single
26
- # page rather than all objects).
27
- alias all list
28
17
  end
29
18
  end
30
19
  end
@@ -6,15 +6,19 @@ module Stripe
6
6
  # that it's possible to do so from a static context (i.e. without a
7
7
  # pre-existing collection of subresources on the parent).
8
8
  #
9
- # For examle, a transfer gains the static methods for reversals so that the
9
+ # For example, a transfer gains the static methods for reversals so that the
10
10
  # methods `.create_reversal`, `.retrieve_reversal`, `.update_reversal`,
11
11
  # etc. all become available.
12
12
  module NestedResource
13
- def nested_resource_class_methods(resource, path: nil, operations: nil)
14
- path ||= "#{resource}s"
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
+
15
18
  raise ArgumentError, "operations array required" if operations.nil?
16
19
 
17
20
  resource_url_method = :"#{resource}s_url"
21
+
18
22
  define_singleton_method(resource_url_method) do |id, nested_id = nil|
19
23
  url = "#{resource_url}/#{CGI.escape(id)}/#{CGI.escape(path)}"
20
24
  url += "/#{CGI.escape(nested_id)}" unless nested_id.nil?
@@ -24,35 +28,41 @@ module Stripe
24
28
  operations.each do |operation|
25
29
  case operation
26
30
  when :create
27
- define_singleton_method(:"create_#{resource}") do |id, params = {}, opts = {}|
28
- url = send(resource_url_method, id)
29
- resp, opts = request(:post, url, params, opts)
30
- Util.convert_to_stripe_object(resp.data, opts)
31
- end
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
32
37
  when :retrieve
33
- define_singleton_method(:"retrieve_#{resource}") do |id, nested_id, opts = {}|
34
- url = send(resource_url_method, id, nested_id)
35
- resp, opts = request(:get, url, {}, opts)
36
- Util.convert_to_stripe_object(resp.data, opts)
37
- end
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
38
44
  when :update
39
- define_singleton_method(:"update_#{resource}") do |id, nested_id, params = {}, opts = {}|
40
- url = send(resource_url_method, id, nested_id)
41
- resp, opts = request(:post, url, params, opts)
42
- Util.convert_to_stripe_object(resp.data, opts)
43
- end
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
44
51
  when :delete
45
- define_singleton_method(:"delete_#{resource}") do |id, nested_id, params = {}, opts = {}|
46
- url = send(resource_url_method, id, nested_id)
47
- resp, opts = request(:delete, url, params, opts)
48
- Util.convert_to_stripe_object(resp.data, opts)
49
- end
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
50
59
  when :list
51
- define_singleton_method(:"list_#{resource}s") do |id, params = {}, opts = {}|
52
- url = send(resource_url_method, id)
53
- resp, opts = request(:get, url, params, opts)
54
- Util.convert_to_stripe_object(resp.data, opts)
55
- end
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
56
66
  else
57
67
  raise ArgumentError, "Unknown operation: #{operation.inspect}"
58
68
  end