stripe 5.19.0 → 5.23.1

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -4
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +16 -1
  5. data/VERSION +1 -1
  6. data/lib/stripe/api_operations/create.rb +1 -1
  7. data/lib/stripe/api_operations/delete.rb +7 -3
  8. data/lib/stripe/api_operations/list.rb +1 -1
  9. data/lib/stripe/api_operations/nested_resource.rb +6 -5
  10. data/lib/stripe/api_operations/request.rb +19 -3
  11. data/lib/stripe/api_operations/save.rb +7 -4
  12. data/lib/stripe/api_resource.rb +4 -3
  13. data/lib/stripe/list_object.rb +2 -2
  14. data/lib/stripe/oauth.rb +3 -3
  15. data/lib/stripe/object_types.rb +3 -0
  16. data/lib/stripe/resources.rb +3 -0
  17. data/lib/stripe/resources/account.rb +2 -1
  18. data/lib/stripe/resources/account_link.rb +1 -0
  19. data/lib/stripe/resources/apple_pay_domain.rb +1 -0
  20. data/lib/stripe/resources/application_fee.rb +1 -0
  21. data/lib/stripe/resources/balance.rb +1 -0
  22. data/lib/stripe/resources/balance_transaction.rb +1 -0
  23. data/lib/stripe/resources/bank_account.rb +2 -1
  24. data/lib/stripe/resources/billing_portal/session.rb +1 -0
  25. data/lib/stripe/resources/bitcoin_receiver.rb +1 -0
  26. data/lib/stripe/resources/card.rb +1 -0
  27. data/lib/stripe/resources/charge.rb +1 -0
  28. data/lib/stripe/resources/checkout/session.rb +4 -0
  29. data/lib/stripe/resources/country_spec.rb +1 -0
  30. data/lib/stripe/resources/coupon.rb +1 -0
  31. data/lib/stripe/resources/credit_note.rb +3 -2
  32. data/lib/stripe/resources/customer.rb +2 -1
  33. data/lib/stripe/resources/dispute.rb +1 -0
  34. data/lib/stripe/resources/ephemeral_key.rb +1 -0
  35. data/lib/stripe/resources/event.rb +1 -0
  36. data/lib/stripe/resources/exchange_rate.rb +1 -0
  37. data/lib/stripe/resources/file.rb +1 -0
  38. data/lib/stripe/resources/file_link.rb +1 -0
  39. data/lib/stripe/resources/invoice.rb +3 -2
  40. data/lib/stripe/resources/invoice_item.rb +1 -0
  41. data/lib/stripe/resources/issuing/authorization.rb +1 -0
  42. data/lib/stripe/resources/issuing/card.rb +1 -0
  43. data/lib/stripe/resources/issuing/cardholder.rb +1 -0
  44. data/lib/stripe/resources/issuing/dispute.rb +1 -0
  45. data/lib/stripe/resources/issuing/transaction.rb +1 -0
  46. data/lib/stripe/resources/line_item.rb +7 -0
  47. data/lib/stripe/resources/mandate.rb +1 -0
  48. data/lib/stripe/resources/order.rb +1 -0
  49. data/lib/stripe/resources/order_return.rb +1 -0
  50. data/lib/stripe/resources/payment_intent.rb +1 -0
  51. data/lib/stripe/resources/payment_method.rb +1 -0
  52. data/lib/stripe/resources/payout.rb +1 -0
  53. data/lib/stripe/resources/plan.rb +1 -0
  54. data/lib/stripe/resources/price.rb +12 -0
  55. data/lib/stripe/resources/product.rb +1 -0
  56. data/lib/stripe/resources/promotion_code.rb +12 -0
  57. data/lib/stripe/resources/radar/early_fraud_warning.rb +1 -0
  58. data/lib/stripe/resources/radar/value_list.rb +1 -0
  59. data/lib/stripe/resources/radar/value_list_item.rb +1 -0
  60. data/lib/stripe/resources/recipient.rb +1 -0
  61. data/lib/stripe/resources/refund.rb +1 -0
  62. data/lib/stripe/resources/reporting/report_run.rb +1 -0
  63. data/lib/stripe/resources/reporting/report_type.rb +1 -0
  64. data/lib/stripe/resources/review.rb +1 -0
  65. data/lib/stripe/resources/setup_intent.rb +1 -0
  66. data/lib/stripe/resources/sigma/scheduled_query_run.rb +1 -0
  67. data/lib/stripe/resources/sku.rb +1 -0
  68. data/lib/stripe/resources/source.rb +4 -3
  69. data/lib/stripe/resources/subscription.rb +1 -0
  70. data/lib/stripe/resources/subscription_item.rb +2 -1
  71. data/lib/stripe/resources/subscription_schedule.rb +1 -0
  72. data/lib/stripe/resources/tax_rate.rb +1 -0
  73. data/lib/stripe/resources/terminal/connection_token.rb +1 -0
  74. data/lib/stripe/resources/terminal/location.rb +1 -0
  75. data/lib/stripe/resources/terminal/reader.rb +1 -0
  76. data/lib/stripe/resources/three_d_secure.rb +1 -0
  77. data/lib/stripe/resources/token.rb +1 -0
  78. data/lib/stripe/resources/topup.rb +1 -0
  79. data/lib/stripe/resources/transfer.rb +1 -0
  80. data/lib/stripe/resources/webhook_endpoint.rb +1 -0
  81. data/lib/stripe/version.rb +1 -1
  82. data/lib/stripe/webhook.rb +17 -0
  83. data/test/stripe/account_link_test.rb +3 -3
  84. data/test/stripe/checkout/session_test.rb +12 -0
  85. data/test/stripe/price_test.rb +48 -0
  86. data/test/stripe/promotion_code_test.rb +42 -0
  87. data/test/stripe/subscription_item_test.rb +1 -1
  88. data/test/stripe/webhook_test.rb +23 -1
  89. data/test/test_helper.rb +1 -1
  90. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 609a42b37282281ebdaea0fa8e0fd74540cdf49b44df5c3d03fc2c9d05a71638
4
- data.tar.gz: 88f0c70adfa171e72d448126300692dfb027165fbb8d5be69e2dbf1eb7c2a9a1
3
+ metadata.gz: 33f1cdd1289229d711bcba485944474bfc3b645aaf0402bf2d4236eff4a87a4e
4
+ data.tar.gz: d2e05e209525b15095fcdbbfacb9f3e05ce4d7eb902c06c19f468bbd5a192184
5
5
  SHA512:
6
- metadata.gz: a800f54e6335291b9ce91a14d715b9432ebaa04a1145b8616470037972b1c8fb83622ad8226fb03e79ce9350c4b132bb776451da25ed3ca10c8624dfebdef778
7
- data.tar.gz: ff25a1a52d03cdf59c16012cacced71952462ef3daff1f7caea9403045a20c8c1343e5252f326ff5182a92075fdfbd92432c4059504b529f5cca41289a110430
6
+ metadata.gz: 2dcb34a7af495d2a704d3b48c35b08b1680bb24ea541e46e90c247ca57689fbaf213f798ef018a9fa9ed17644e42e76b7666f8fac2dd104f495f460492c5fb99
7
+ data.tar.gz: 232b4bef2acfc1b452ee1314c67d6e688a01a5860e4be93ad49491b65506cc3e10763c3a1090e2aeaa5137a1438f42a8f7e4f7741f4e1909f894ddb5dcef3639
@@ -44,10 +44,10 @@ Metrics/ClassLength:
44
44
  - "test/**/*.rb"
45
45
 
46
46
  Metrics/MethodLength:
47
- # There's ~2 long methods in `StripeClient`. If we want to truncate those a
48
- # little, we could move this to be closer to ~30 (but the default of 10 is
49
- # probably too short).
50
- Max: 50
47
+ # There's ~2 long methods in `StripeClient` and one in `NestedResource`. If
48
+ # we want to truncate those a little, we could move this to be closer to ~30
49
+ # (but the default of 10 is probably too short).
50
+ Max: 55
51
51
 
52
52
  Metrics/ModuleLength:
53
53
  Enabled: false
@@ -17,7 +17,7 @@ sudo: false
17
17
  env:
18
18
  global:
19
19
  # If changing this number, please also change it in `test/test_helper.rb`.
20
- - STRIPE_MOCK_VERSION=0.88.0
20
+ - STRIPE_MOCK_VERSION=0.95.0
21
21
 
22
22
  cache:
23
23
  directories:
@@ -1,6 +1,21 @@
1
1
  # Changelog
2
2
 
3
- ## - 2020-04-24
3
+ ## 5.23.1 - 2020-08-05
4
+ * [#936](https://github.com/stripe/stripe-ruby/pull/936) Rename API resource's `request` method
5
+
6
+ ## 5.23.0 - 2020-08-05
7
+ * [#937](https://github.com/stripe/stripe-ruby/pull/937) Add support for the `PromotionCode` resource and APIs
8
+
9
+ ## 5.22.0 - 2020-05-11
10
+ * [#918](https://github.com/stripe/stripe-ruby/pull/918) Add support for the `LineItem` resource and APIs
11
+
12
+ ## 5.21.0 - 2020-04-29
13
+ * [#917](https://github.com/stripe/stripe-ruby/pull/917) Add support for the `Price` resource and APIs
14
+
15
+ ## 5.20.0 - 2020-04-27
16
+ * [#916](https://github.com/stripe/stripe-ruby/pull/916) Add new `.generate_header` method for webhooks
17
+
18
+ ## 5.19.0 - 2020-04-24
4
19
  * [#915](https://github.com/stripe/stripe-ruby/pull/915) Expose `Stripe::Webhook.compute_signature` publicly
5
20
 
6
21
  ## 5.18.0 - 2020-04-22
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.19.0
1
+ 5.23.1
@@ -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
@@ -15,15 +15,19 @@ module Stripe
15
15
  # * +opts+ - A Hash of additional options (separate from the params /
16
16
  # object values) to be added to the request. E.g. to allow for an
17
17
  # idempotency_key to be passed in the request headers, or for the
18
- # api_key to be overwritten. See {APIOperations::Request.request}.
18
+ # api_key to be overwritten. See
19
+ # {APIOperations::Request.execute_resource_request}.
19
20
  def delete(id, params = {}, opts = {})
20
- resp, opts = request(:delete, "#{resource_url}/#{id}", params, opts)
21
+ resp, opts = execute_resource_request(:delete,
22
+ "#{resource_url}/#{id}",
23
+ params, opts)
21
24
  Util.convert_to_stripe_object(resp.data, opts)
22
25
  end
23
26
  end
24
27
 
25
28
  def delete(params = {}, opts = {})
26
- resp, opts = request(:delete, resource_url, params, opts)
29
+ resp, opts = execute_resource_request(:delete, resource_url,
30
+ params, opts)
27
31
  initialize_from(resp.data, opts)
28
32
  end
29
33
 
@@ -6,7 +6,7 @@ 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
@@ -31,35 +31,36 @@ module Stripe
31
31
  define_singleton_method(:"create_#{resource}") \
32
32
  do |id, params = {}, opts = {}|
33
33
  url = send(resource_url_method, id)
34
- resp, opts = request(:post, url, params, opts)
34
+ resp, opts = execute_resource_request(:post, url, params, opts)
35
35
  Util.convert_to_stripe_object(resp.data, opts)
36
36
  end
37
37
  when :retrieve
38
38
  define_singleton_method(:"retrieve_#{resource}") \
39
39
  do |id, nested_id, opts = {}|
40
40
  url = send(resource_url_method, id, nested_id)
41
- resp, opts = request(:get, url, {}, opts)
41
+ resp, opts = execute_resource_request(:get, url, {}, opts)
42
42
  Util.convert_to_stripe_object(resp.data, opts)
43
43
  end
44
44
  when :update
45
45
  define_singleton_method(:"update_#{resource}") \
46
46
  do |id, nested_id, params = {}, opts = {}|
47
47
  url = send(resource_url_method, id, nested_id)
48
- resp, opts = request(:post, url, params, opts)
48
+ resp, opts = execute_resource_request(:post, url, params, opts)
49
49
  Util.convert_to_stripe_object(resp.data, opts)
50
50
  end
51
51
  when :delete
52
52
  define_singleton_method(:"delete_#{resource}") \
53
53
  do |id, nested_id, params = {}, opts = {}|
54
54
  url = send(resource_url_method, id, nested_id)
55
- resp, opts = request(:delete, url, params, opts)
55
+ resp, opts = execute_resource_request(:delete, url, params,
56
+ opts)
56
57
  Util.convert_to_stripe_object(resp.data, opts)
57
58
  end
58
59
  when :list
59
60
  define_singleton_method(:"list_#{resource_plural}") \
60
61
  do |id, params = {}, opts = {}|
61
62
  url = send(resource_url_method, id)
62
- resp, opts = request(:get, url, params, opts)
63
+ resp, opts = execute_resource_request(:get, url, params, opts)
63
64
  Util.convert_to_stripe_object(resp.data, opts)
64
65
  end
65
66
  else
@@ -4,7 +4,8 @@ module Stripe
4
4
  module APIOperations
5
5
  module Request
6
6
  module ClassMethods
7
- def request(method, url, params = {}, opts = {})
7
+ def execute_resource_request(method, url,
8
+ params = {}, opts = {})
8
9
  params ||= {}
9
10
 
10
11
  error_on_invalid_params(params)
@@ -36,6 +37,17 @@ module Stripe
36
37
  [resp, opts_to_persist]
37
38
  end
38
39
 
40
+ # This method used to be called `request`, but it's such a short name
41
+ # that it eventually conflicted with the name of a field on an API
42
+ # resource (specifically, `Event#request`), so it was renamed to
43
+ # something more unique.
44
+ #
45
+ # The former name had been around for just about forever though, and
46
+ # although all internal uses have been renamed, I've left this alias in
47
+ # place for backwards compatibility. Consider removing it on the next
48
+ # major.
49
+ alias request execute_resource_request
50
+
39
51
  private def error_on_non_string_user_opts(opts)
40
52
  Util::OPTS_USER_SPECIFIED.each do |opt|
41
53
  next unless opts.key?(opt)
@@ -71,10 +83,14 @@ module Stripe
71
83
  base.extend(ClassMethods)
72
84
  end
73
85
 
74
- protected def request(method, url, params = {}, opts = {})
86
+ protected def execute_resource_request(method, url,
87
+ params = {}, opts = {})
75
88
  opts = @opts.merge(Util.normalize_opts(opts))
76
- self.class.request(method, url, params, opts)
89
+ self.class.execute_resource_request(method, url, params, opts)
77
90
  end
91
+
92
+ # See notes on `alias` above.
93
+ alias request execute_resource_request
78
94
  end
79
95
  end
80
96
  end
@@ -15,7 +15,8 @@ module Stripe
15
15
  # * +opts+ - A Hash of additional options (separate from the params /
16
16
  # object values) to be added to the request. E.g. to allow for an
17
17
  # idempotency_key to be passed in the request headers, or for the
18
- # api_key to be overwritten. See {APIOperations::Request.request}.
18
+ # api_key to be overwritten. See
19
+ # {APIOperations::Request.execute_resource_request}.
19
20
  def update(id, params = {}, opts = {})
20
21
  params.each_key do |k|
21
22
  if protected_fields.include?(k)
@@ -23,7 +24,8 @@ module Stripe
23
24
  end
24
25
  end
25
26
 
26
- resp, opts = request(:post, "#{resource_url}/#{id}", params, opts)
27
+ resp, opts = execute_resource_request(:post, "#{resource_url}/#{id}",
28
+ params, opts)
27
29
  Util.convert_to_stripe_object(resp.data, opts)
28
30
  end
29
31
  end
@@ -43,7 +45,8 @@ module Stripe
43
45
  # * +opts+ - A Hash of additional options (separate from the params /
44
46
  # object values) to be added to the request. E.g. to allow for an
45
47
  # idempotency_key to be passed in the request headers, or for the
46
- # api_key to be overwritten. See {APIOperations::Request.request}.
48
+ # api_key to be overwritten. See
49
+ # {APIOperations::Request.execute_resource_request}.
47
50
  def save(params = {}, opts = {})
48
51
  # We started unintentionally (sort of) allowing attributes sent to
49
52
  # +save+ to override values used during the update. So as not to break
@@ -59,7 +62,7 @@ module Stripe
59
62
  # generated a uri for this object with an identifier baked in
60
63
  values.delete(:id)
61
64
 
62
- resp, opts = request(:post, save_url, values, opts)
65
+ resp, opts = execute_resource_request(:post, save_url, values, opts)
63
66
  initialize_from(resp.data, opts)
64
67
  end
65
68
 
@@ -76,7 +76,7 @@ module Stripe
76
76
  end
77
77
 
78
78
  url = "#{resource_url}/#{CGI.escape(id)}/#{CGI.escape(http_path)}"
79
- resp, opts = request(http_verb, url, params, opts)
79
+ resp, opts = execute_resource_request(http_verb, url, params, opts)
80
80
  Util.convert_to_stripe_object(resp.data, opts)
81
81
  end
82
82
  end
@@ -93,7 +93,8 @@ module Stripe
93
93
  end
94
94
 
95
95
  def refresh
96
- resp, opts = request(:get, resource_url, @retrieve_params)
96
+ resp, opts = execute_resource_request(:get, resource_url,
97
+ @retrieve_params)
97
98
  initialize_from(resp.data, opts)
98
99
  end
99
100
 
@@ -105,7 +106,7 @@ module Stripe
105
106
  end
106
107
 
107
108
  protected def request_stripe_object(method:, path:, params:, opts: {})
108
- resp, opts = request(method, path, params, opts)
109
+ resp, opts = execute_resource_request(method, path, params, opts)
109
110
 
110
111
  # If we're getting back this thing, update; otherwise, instantiate.
111
112
  if Util.object_name_matches_class?(resp.data[:object], self.class)
@@ -92,8 +92,8 @@ module Stripe
92
92
 
93
93
  def retrieve(id, opts = {})
94
94
  id, retrieve_params = Util.normalize_id(id)
95
- resp, opts = request(:get, "#{resource_url}/#{CGI.escape(id)}",
96
- retrieve_params, opts)
95
+ url = "#{resource_url}/#{CGI.escape(id)}"
96
+ resp, opts = execute_resource_request(:get, url, retrieve_params, opts)
97
97
  Util.convert_to_stripe_object(resp.data, opts)
98
98
  end
99
99
 
@@ -5,7 +5,7 @@ module Stripe
5
5
  module OAuthOperations
6
6
  extend APIOperations::Request::ClassMethods
7
7
 
8
- def self.request(method, url, params, opts)
8
+ def self.execute_resource_request(method, url, params, opts)
9
9
  opts = Util.normalize_opts(opts)
10
10
  opts[:client] ||= StripeClient.active_client
11
11
  opts[:api_base] ||= Stripe.connect_base
@@ -44,7 +44,7 @@ module Stripe
44
44
  def self.token(params = {}, opts = {})
45
45
  opts = Util.normalize_opts(opts)
46
46
  opts[:api_key] = params[:client_secret] if params[:client_secret]
47
- resp, opts = OAuthOperations.request(
47
+ resp, opts = OAuthOperations.execute_resource_request(
48
48
  :post, "/oauth/token", params, opts
49
49
  )
50
50
  # This is just going to return a generic StripeObject, but that's okay
@@ -54,7 +54,7 @@ module Stripe
54
54
  def self.deauthorize(params = {}, opts = {})
55
55
  opts = Util.normalize_opts(opts)
56
56
  params[:client_id] = get_client_id(params)
57
- resp, opts = OAuthOperations.request(
57
+ resp, opts = OAuthOperations.execute_resource_request(
58
58
  :post, "/oauth/deauthorize", params, opts
59
59
  )
60
60
  # This is just going to return a generic StripeObject, but that's okay
@@ -49,6 +49,7 @@ module Stripe
49
49
  Issuing::Cardholder::OBJECT_NAME => Issuing::Cardholder,
50
50
  Issuing::Dispute::OBJECT_NAME => Issuing::Dispute,
51
51
  Issuing::Transaction::OBJECT_NAME => Issuing::Transaction,
52
+ LineItem::OBJECT_NAME => LineItem,
52
53
  LoginLink::OBJECT_NAME => LoginLink,
53
54
  Mandate::OBJECT_NAME => Mandate,
54
55
  Order::OBJECT_NAME => Order,
@@ -58,7 +59,9 @@ module Stripe
58
59
  Payout::OBJECT_NAME => Payout,
59
60
  Person::OBJECT_NAME => Person,
60
61
  Plan::OBJECT_NAME => Plan,
62
+ Price::OBJECT_NAME => Price,
61
63
  Product::OBJECT_NAME => Product,
64
+ PromotionCode::OBJECT_NAME => PromotionCode,
62
65
  Radar::EarlyFraudWarning::OBJECT_NAME => Radar::EarlyFraudWarning,
63
66
  Radar::ValueList::OBJECT_NAME => Radar::ValueList,
64
67
  Radar::ValueListItem::OBJECT_NAME => Radar::ValueListItem,
@@ -38,6 +38,7 @@ require "stripe/resources/issuing/card_details"
38
38
  require "stripe/resources/issuing/cardholder"
39
39
  require "stripe/resources/issuing/dispute"
40
40
  require "stripe/resources/issuing/transaction"
41
+ require "stripe/resources/line_item"
41
42
  require "stripe/resources/login_link"
42
43
  require "stripe/resources/mandate"
43
44
  require "stripe/resources/order"
@@ -47,7 +48,9 @@ require "stripe/resources/payment_method"
47
48
  require "stripe/resources/payout"
48
49
  require "stripe/resources/person"
49
50
  require "stripe/resources/plan"
51
+ require "stripe/resources/price"
50
52
  require "stripe/resources/product"
53
+ require "stripe/resources/promotion_code"
51
54
  require "stripe/resources/radar/early_fraud_warning"
52
55
  require "stripe/resources/radar/value_list"
53
56
  require "stripe/resources/radar/value_list_item"
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -64,7 +65,7 @@ module Stripe
64
65
  end
65
66
 
66
67
  def persons(params = {}, opts = {})
67
- resp, opts = request(:get, resource_url + "/persons", params, opts)
68
+ resp, opts = execute_resource_request(:get, resource_url + "/persons", params, opts)
68
69
  Util.convert_to_stripe_object(resp.data, opts)
69
70
  end
70
71
 
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -9,7 +10,7 @@ module Stripe
9
10
  OBJECT_NAME = "bank_account"
10
11
 
11
12
  def verify(params = {}, opts = {})
12
- resp, opts = request(:post, resource_url + "/verify", params, opts)
13
+ resp, opts = execute_resource_request(:post, resource_url + "/verify", params, opts)
13
14
  initialize_from(resp.data, opts)
14
15
  end
15
16
 
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -5,8 +6,11 @@ module Stripe
5
6
  class Session < APIResource
6
7
  extend Stripe::APIOperations::Create
7
8
  extend Stripe::APIOperations::List
9
+ extend Stripe::APIOperations::NestedResource
8
10
 
9
11
  OBJECT_NAME = "checkout.session"
12
+
13
+ nested_resource_class_methods :line_item, operations: %i[list]
10
14
  end
11
15
  end
12
16
  end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -20,12 +21,12 @@ module Stripe
20
21
  end
21
22
 
22
23
  def self.preview(params, opts = {})
23
- resp, opts = request(:get, resource_url + "/preview", params, opts)
24
+ resp, opts = execute_resource_request(:get, resource_url + "/preview", params, opts)
24
25
  Util.convert_to_stripe_object(resp.data, opts)
25
26
  end
26
27
 
27
28
  def self.list_preview_line_items(params, opts = {})
28
- resp, opts = request(:get, resource_url + "/preview/lines", params, opts)
29
+ resp, opts = execute_resource_request(:get, resource_url + "/preview/lines", params, opts)
29
30
  Util.convert_to_stripe_object(resp.data, opts)
30
31
  end
31
32
  end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -28,7 +29,7 @@ module Stripe
28
29
  end
29
30
 
30
31
  def delete_discount
31
- resp, opts = request(:delete, resource_url + "/discount")
32
+ resp, opts = execute_resource_request(:delete, resource_url + "/discount")
32
33
  initialize_from(resp.data, opts, true)
33
34
  end
34
35
  end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -61,12 +62,12 @@ module Stripe
61
62
  end
62
63
 
63
64
  def self.upcoming(params, opts = {})
64
- resp, opts = request(:get, resource_url + "/upcoming", params, opts)
65
+ resp, opts = execute_resource_request(:get, resource_url + "/upcoming", params, opts)
65
66
  Util.convert_to_stripe_object(resp.data, opts)
66
67
  end
67
68
 
68
69
  def self.list_upcoming_line_items(params, opts = {})
69
- resp, opts = request(:get, resource_url + "/upcoming/lines", params, opts)
70
+ resp, opts = execute_resource_request(:get, resource_url + "/upcoming/lines", params, opts)
70
71
  Util.convert_to_stripe_object(resp.data, opts)
71
72
  end
72
73
  end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class LineItem < APIResource
5
+ OBJECT_NAME = "item"
6
+ end
7
+ end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class Price < APIResource
6
+ extend Stripe::APIOperations::Create
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+
10
+ OBJECT_NAME = "price"
11
+ end
12
+ end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class PromotionCode < APIResource
6
+ extend Stripe::APIOperations::Create
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+
10
+ OBJECT_NAME = "promotion_code"
11
+ end
12
+ end
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -31,13 +32,13 @@ module Stripe
31
32
 
32
33
  url = "#{Customer.resource_url}/#{CGI.escape(customer)}/sources" \
33
34
  "/#{CGI.escape(id)}"
34
- resp, opts = request(:delete, url, params, opts)
35
+ resp, opts = execute_resource_request(:delete, url, params, opts)
35
36
  initialize_from(resp.data, opts)
36
37
  end
37
38
 
38
39
  def source_transactions(params = {}, opts = {})
39
- resp, opts = request(:get, resource_url + "/source_transactions", params,
40
- opts)
40
+ resp, opts = execute_resource_request(:get, resource_url + "/source_transactions", params,
41
+ opts)
41
42
  Util.convert_to_stripe_object(resp.data, opts)
42
43
  end
43
44
  extend Gem::Deprecate
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -16,7 +17,7 @@ module Stripe
16
17
  resource_plural: "usage_record_summaries"
17
18
 
18
19
  def usage_record_summaries(params = {}, opts = {})
19
- resp, opts = request(:get, resource_url + "/usage_record_summaries", params, opts)
20
+ resp, opts = execute_resource_request(:get, resource_url + "/usage_record_summaries", params, opts)
20
21
  Util.convert_to_stripe_object(resp.data, opts)
21
22
  end
22
23
  extend Gem::Deprecate
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,3 +1,4 @@
1
+ # File generated from our OpenAPI spec
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Stripe
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "5.19.0"
4
+ VERSION = "5.23.1"
5
5
  end
@@ -39,6 +39,23 @@ module Stripe
39
39
  timestamped_payload)
40
40
  end
41
41
 
42
+ # Generates a value that would be added to a `Stripe-Signature` for a
43
+ # given webhook payload.
44
+ #
45
+ # Note that this isn't needed to verify webhooks in any way, and is
46
+ # mainly here for use in test cases (those that are both within this
47
+ # project and without).
48
+ def self.generate_header(timestamp, signature, scheme: EXPECTED_SCHEME)
49
+ raise ArgumentError, "timestamp should be an instance of Time" \
50
+ unless timestamp.is_a?(Time)
51
+ raise ArgumentError, "signature should be a string" \
52
+ unless signature.is_a?(String)
53
+ raise ArgumentError, "scheme should be a string" \
54
+ unless scheme.is_a?(String)
55
+
56
+ "t=#{timestamp.to_i},#{scheme}=#{signature}"
57
+ end
58
+
42
59
  # Extracts the timestamp and the signature(s) with the desired scheme
43
60
  # from the header
44
61
  def self.get_timestamp_and_signatures(header, scheme)
@@ -7,9 +7,9 @@ module Stripe
7
7
  should "be creatable" do
8
8
  link = Stripe::AccountLink.create(
9
9
  account: "acct_123",
10
- failure_url: "https://stripe.com/failure",
11
- success_url: "https://stripe.com/success",
12
- type: "custom_account_verification"
10
+ refresh_url: "https://stripe.com/refresh",
11
+ return_url: "https://stripe.com/return",
12
+ type: "account_onboarding"
13
13
  )
14
14
  assert_requested :post, "#{Stripe.api_base}/v1/account_links"
15
15
  assert link.is_a?(Stripe::AccountLink)
@@ -36,6 +36,18 @@ module Stripe
36
36
  assert_requested :get, "#{Stripe.api_base}/v1/checkout/sessions/cs_123"
37
37
  assert charge.is_a?(Stripe::Checkout::Session)
38
38
  end
39
+
40
+ context "#list_line_items" do
41
+ should "list the session's line items" do
42
+ sources = Stripe::Checkout::Session.list_line_items(
43
+ "cs_123"
44
+ )
45
+ assert_requested :get, "#{Stripe.api_base}/v1/checkout/sessions/cs_123/line_items"
46
+ assert sources.is_a?(Stripe::ListObject)
47
+ assert sources.data.is_a?(Array)
48
+ assert sources.data[0].is_a?(Stripe::LineItem)
49
+ end
50
+ end
39
51
  end
40
52
  end
41
53
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class PriceTest < Test::Unit::TestCase
7
+ should "be listable" do
8
+ prices = Stripe::Price.list
9
+ assert_requested :get, "#{Stripe.api_base}/v1/prices"
10
+ assert prices.data.is_a?(Array)
11
+ assert prices.data[0].is_a?(Stripe::Price)
12
+ end
13
+
14
+ should "be retrievable" do
15
+ price = Stripe::Price.retrieve("price_123")
16
+ assert_requested :get, "#{Stripe.api_base}/v1/prices/price_123"
17
+ assert price.is_a?(Stripe::Price)
18
+ end
19
+
20
+ should "be creatable" do
21
+ price = Stripe::Price.create(
22
+ unit_amount: 5000,
23
+ currency: "usd",
24
+ recurring: {
25
+ interval: "month",
26
+ },
27
+ product_data: {
28
+ name: "Product name",
29
+ }
30
+ )
31
+ assert_requested :post, "#{Stripe.api_base}/v1/prices"
32
+ assert price.is_a?(Stripe::Price)
33
+ end
34
+
35
+ should "be saveable" do
36
+ price = Stripe::Price.retrieve("price_123")
37
+ price.metadata["key"] = "value"
38
+ price.save
39
+ assert_requested :post, "#{Stripe.api_base}/v1/prices/#{price.id}"
40
+ end
41
+
42
+ should "be updateable" do
43
+ price = Stripe::Price.update("price_123", metadata: { foo: "bar" })
44
+ assert_requested :post, "#{Stripe.api_base}/v1/prices/price_123"
45
+ assert price.is_a?(Stripe::Price)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require ::File.expand_path("../test_helper", __dir__)
4
+
5
+ module Stripe
6
+ class PromotionCodeTest < Test::Unit::TestCase
7
+ should "be listable" do
8
+ promotion_codes = Stripe::PromotionCode.list
9
+ assert_requested :get, "#{Stripe.api_base}/v1/promotion_codes"
10
+ assert promotion_codes.data.is_a?(Array)
11
+ assert promotion_codes.first.is_a?(Stripe::PromotionCode)
12
+ end
13
+
14
+ should "be retrievable" do
15
+ coupon = Stripe::PromotionCode.retrieve("PROMO_123")
16
+ assert_requested :get, "#{Stripe.api_base}/v1/promotion_codes/PROMO_123"
17
+ assert coupon.is_a?(Stripe::PromotionCode)
18
+ end
19
+
20
+ should "be creatable" do
21
+ coupon = Stripe::PromotionCode.create(
22
+ coupon: "co_123",
23
+ code: "MYCODE"
24
+ )
25
+ assert_requested :post, "#{Stripe.api_base}/v1/promotion_codes"
26
+ assert coupon.is_a?(Stripe::PromotionCode)
27
+ end
28
+
29
+ should "be saveable" do
30
+ coupon = Stripe::PromotionCode.retrieve("PROMO_123")
31
+ coupon.metadata["key"] = "value"
32
+ coupon.save
33
+ assert_requested :post, "#{Stripe.api_base}/v1/promotion_codes/#{coupon.id}"
34
+ end
35
+
36
+ should "be updateable" do
37
+ coupon = Stripe::PromotionCode.update("PROMO_123", metadata: { key: "value" })
38
+ assert_requested :post, "#{Stripe.api_base}/v1/promotion_codes/PROMO_123"
39
+ assert coupon.is_a?(Stripe::PromotionCode)
40
+ end
41
+ end
42
+ end
@@ -22,7 +22,7 @@ module Stripe
22
22
 
23
23
  should "be creatable" do
24
24
  item = Stripe::SubscriptionItem.create(
25
- plan: "sapphire-elite",
25
+ price: "sapphire-elite",
26
26
  quantity: 3,
27
27
  subscription: "sub_123"
28
28
  )
@@ -22,7 +22,11 @@ module Stripe
22
22
  opts[:payload],
23
23
  opts[:secret]
24
24
  )
25
- "t=#{opts[:timestamp].to_i},#{opts[:scheme]}=#{opts[:signature]}"
25
+ Stripe::Webhook::Signature.generate_header(
26
+ opts[:timestamp],
27
+ opts[:signature],
28
+ scheme: opts[:scheme]
29
+ )
26
30
  end
27
31
 
28
32
  context ".compute_signature" do
@@ -38,6 +42,24 @@ module Stripe
38
42
  end
39
43
  end
40
44
 
45
+ context ".generate_header" do
46
+ should "generate a header in valid format" do
47
+ timestamp = Time.now
48
+ signature = Stripe::Webhook::Signature.compute_signature(
49
+ timestamp,
50
+ EVENT_PAYLOAD,
51
+ SECRET
52
+ )
53
+ scheme = "v1"
54
+ header = Stripe::Webhook::Signature.generate_header(
55
+ timestamp,
56
+ signature,
57
+ scheme: scheme
58
+ )
59
+ assert_equal("t=#{timestamp.to_i},#{scheme}=#{signature}", header)
60
+ end
61
+ end
62
+
41
63
  context ".construct_event" do
42
64
  should "return an Event instance from a valid JSON payload and valid signature header" do
43
65
  header = generate_header
@@ -16,7 +16,7 @@ require ::File.expand_path("test_data", __dir__)
16
16
  require ::File.expand_path("stripe_mock", __dir__)
17
17
 
18
18
  # If changing this number, please also change it in `.travis.yml`.
19
- MOCK_MINIMUM_VERSION = "0.88.0"
19
+ MOCK_MINIMUM_VERSION = "0.95.0"
20
20
  MOCK_PORT = Stripe::StripeMock.start
21
21
 
22
22
  # Disable all real network connections except those that are outgoing to
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.19.0
4
+ version: 5.23.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-24 00:00:00.000000000 Z
11
+ date: 2020-08-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Stripe is the easiest way to accept payments online. See https://stripe.com
14
14
  for details.
@@ -93,6 +93,7 @@ files:
93
93
  - lib/stripe/resources/issuing/cardholder.rb
94
94
  - lib/stripe/resources/issuing/dispute.rb
95
95
  - lib/stripe/resources/issuing/transaction.rb
96
+ - lib/stripe/resources/line_item.rb
96
97
  - lib/stripe/resources/login_link.rb
97
98
  - lib/stripe/resources/mandate.rb
98
99
  - lib/stripe/resources/order.rb
@@ -102,7 +103,9 @@ files:
102
103
  - lib/stripe/resources/payout.rb
103
104
  - lib/stripe/resources/person.rb
104
105
  - lib/stripe/resources/plan.rb
106
+ - lib/stripe/resources/price.rb
105
107
  - lib/stripe/resources/product.rb
108
+ - lib/stripe/resources/promotion_code.rb
106
109
  - lib/stripe/resources/radar/early_fraud_warning.rb
107
110
  - lib/stripe/resources/radar/value_list.rb
108
111
  - lib/stripe/resources/radar/value_list_item.rb
@@ -191,7 +194,9 @@ files:
191
194
  - test/stripe/payout_test.rb
192
195
  - test/stripe/person_test.rb
193
196
  - test/stripe/plan_test.rb
197
+ - test/stripe/price_test.rb
194
198
  - test/stripe/product_test.rb
199
+ - test/stripe/promotion_code_test.rb
195
200
  - test/stripe/radar/early_fraud_warning_test.rb
196
201
  - test/stripe/radar/value_list_item_test.rb
197
202
  - test/stripe/radar/value_list_test.rb
@@ -307,7 +312,9 @@ test_files:
307
312
  - test/stripe/payout_test.rb
308
313
  - test/stripe/person_test.rb
309
314
  - test/stripe/plan_test.rb
315
+ - test/stripe/price_test.rb
310
316
  - test/stripe/product_test.rb
317
+ - test/stripe/promotion_code_test.rb
311
318
  - test/stripe/radar/early_fraud_warning_test.rb
312
319
  - test/stripe/radar/value_list_item_test.rb
313
320
  - test/stripe/radar/value_list_test.rb