stripe 5.38.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +85 -0
  3. data/Makefile +7 -0
  4. data/README.md +3 -3
  5. data/VERSION +1 -1
  6. data/lib/stripe/api_operations/search.rb +19 -0
  7. data/lib/stripe/api_resource.rb +2 -17
  8. data/lib/stripe/api_resource_test_helpers.rb +47 -0
  9. data/lib/stripe/connection_manager.rb +22 -1
  10. data/lib/stripe/object_types.rb +12 -1
  11. data/lib/stripe/resources/cash_balance.rb +22 -0
  12. data/lib/stripe/resources/charge.rb +9 -0
  13. data/lib/stripe/resources/checkout/session.rb +11 -0
  14. data/lib/stripe/resources/customer.rb +33 -0
  15. data/lib/stripe/resources/discount.rb +1 -0
  16. data/lib/stripe/resources/financial_connections/account.rb +31 -0
  17. data/lib/stripe/resources/financial_connections/account_owner.rb +10 -0
  18. data/lib/stripe/resources/financial_connections/account_ownership.rb +10 -0
  19. data/lib/stripe/resources/financial_connections/session.rb +12 -0
  20. data/lib/stripe/resources/funding_instructions.rb +16 -0
  21. data/lib/stripe/resources/invoice.rb +9 -0
  22. data/lib/stripe/resources/issuing/card_details.rb +2 -1
  23. data/lib/stripe/resources/order.rb +26 -6
  24. data/lib/stripe/resources/payment_intent.rb +39 -0
  25. data/lib/stripe/resources/payment_link.rb +23 -0
  26. data/lib/stripe/resources/price.rb +9 -0
  27. data/lib/stripe/resources/product.rb +9 -0
  28. data/lib/stripe/resources/refund.rb +30 -0
  29. data/lib/stripe/resources/setup_intent.rb +10 -0
  30. data/lib/stripe/resources/shipping_rate.rb +12 -0
  31. data/lib/stripe/resources/source_transaction.rb +1 -0
  32. data/lib/stripe/resources/subscription.rb +9 -0
  33. data/lib/stripe/resources/terminal/configuration.rb +15 -0
  34. data/lib/stripe/resources/terminal/reader.rb +60 -0
  35. data/lib/stripe/resources/test_helpers/test_clock.rb +25 -0
  36. data/lib/stripe/resources.rb +10 -1
  37. data/lib/stripe/search_result_object.rb +86 -0
  38. data/lib/stripe/stripe_client.rb +12 -5
  39. data/lib/stripe/util.rb +47 -0
  40. data/lib/stripe/version.rb +1 -1
  41. data/lib/stripe.rb +4 -1
  42. data/stripe.gemspec +3 -3
  43. metadata +19 -6
  44. data/lib/stripe/resources/order_return.rb +0 -10
@@ -5,13 +5,26 @@ module Stripe
5
5
  class PaymentIntent < APIResource
6
6
  extend Stripe::APIOperations::Create
7
7
  extend Stripe::APIOperations::List
8
+ extend Stripe::APIOperations::Search
8
9
  include Stripe::APIOperations::Save
9
10
 
10
11
  OBJECT_NAME = "payment_intent"
11
12
 
13
+ custom_method :apply_customer_balance, http_verb: :post
12
14
  custom_method :cancel, http_verb: :post
13
15
  custom_method :capture, http_verb: :post
14
16
  custom_method :confirm, http_verb: :post
17
+ custom_method :increment_authorization, http_verb: :post
18
+ custom_method :verify_microdeposits, http_verb: :post
19
+
20
+ def apply_customer_balance(params = {}, opts = {})
21
+ request_stripe_object(
22
+ method: :post,
23
+ path: resource_url + "/apply_customer_balance",
24
+ params: params,
25
+ opts: opts
26
+ )
27
+ end
15
28
 
16
29
  def cancel(params = {}, opts = {})
17
30
  request_stripe_object(
@@ -39,5 +52,31 @@ module Stripe
39
52
  opts: opts
40
53
  )
41
54
  end
55
+
56
+ def increment_authorization(params = {}, opts = {})
57
+ request_stripe_object(
58
+ method: :post,
59
+ path: resource_url + "/increment_authorization",
60
+ params: params,
61
+ opts: opts
62
+ )
63
+ end
64
+
65
+ def verify_microdeposits(params = {}, opts = {})
66
+ request_stripe_object(
67
+ method: :post,
68
+ path: resource_url + "/verify_microdeposits",
69
+ params: params,
70
+ opts: opts
71
+ )
72
+ end
73
+
74
+ def self.search(params = {}, opts = {})
75
+ _search("/v1/payment_intents/search", params, opts)
76
+ end
77
+
78
+ def self.search_auto_paging_each(params = {}, opts = {}, &blk)
79
+ search(params, opts).auto_paging_each(&blk)
80
+ end
42
81
  end
43
82
  end
@@ -0,0 +1,23 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class PaymentLink < APIResource
6
+ extend Stripe::APIOperations::Create
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+
10
+ OBJECT_NAME = "payment_link"
11
+
12
+ custom_method :list_line_items, http_verb: :get, http_path: "line_items"
13
+
14
+ def list_line_items(params = {}, opts = {})
15
+ request_stripe_object(
16
+ method: :get,
17
+ path: resource_url + "/line_items",
18
+ params: params,
19
+ opts: opts
20
+ )
21
+ end
22
+ end
23
+ end
@@ -5,8 +5,17 @@ module Stripe
5
5
  class Price < APIResource
6
6
  extend Stripe::APIOperations::Create
7
7
  extend Stripe::APIOperations::List
8
+ extend Stripe::APIOperations::Search
8
9
  include Stripe::APIOperations::Save
9
10
 
10
11
  OBJECT_NAME = "price"
12
+
13
+ def self.search(params = {}, opts = {})
14
+ _search("/v1/prices/search", params, opts)
15
+ end
16
+
17
+ def self.search_auto_paging_each(params = {}, opts = {}, &blk)
18
+ search(params, opts).auto_paging_each(&blk)
19
+ end
11
20
  end
12
21
  end
@@ -6,8 +6,17 @@ module Stripe
6
6
  extend Stripe::APIOperations::Create
7
7
  include Stripe::APIOperations::Delete
8
8
  extend Stripe::APIOperations::List
9
+ extend Stripe::APIOperations::Search
9
10
  include Stripe::APIOperations::Save
10
11
 
11
12
  OBJECT_NAME = "product"
13
+
14
+ def self.search(params = {}, opts = {})
15
+ _search("/v1/products/search", params, opts)
16
+ end
17
+
18
+ def self.search_auto_paging_each(params = {}, opts = {}, &blk)
19
+ search(params, opts).auto_paging_each(&blk)
20
+ end
12
21
  end
13
22
  end
@@ -8,5 +8,35 @@ module Stripe
8
8
  include Stripe::APIOperations::Save
9
9
 
10
10
  OBJECT_NAME = "refund"
11
+
12
+ custom_method :cancel, http_verb: :post
13
+
14
+ def cancel(params = {}, opts = {})
15
+ request_stripe_object(
16
+ method: :post,
17
+ path: resource_url + "/cancel",
18
+ params: params,
19
+ opts: opts
20
+ )
21
+ end
22
+
23
+ def test_helpers
24
+ TestHelpers.new(self)
25
+ end
26
+
27
+ class TestHelpers < APIResourceTestHelpers
28
+ RESOURCE_CLASS = Refund
29
+
30
+ custom_method :expire, http_verb: :post
31
+
32
+ def expire(params = {}, opts = {})
33
+ @resource.request_stripe_object(
34
+ method: :post,
35
+ path: resource_url + "/expire",
36
+ params: params,
37
+ opts: opts
38
+ )
39
+ end
40
+ end
11
41
  end
12
42
  end
@@ -11,6 +11,7 @@ module Stripe
11
11
 
12
12
  custom_method :cancel, http_verb: :post
13
13
  custom_method :confirm, http_verb: :post
14
+ custom_method :verify_microdeposits, http_verb: :post
14
15
 
15
16
  def cancel(params = {}, opts = {})
16
17
  request_stripe_object(
@@ -29,5 +30,14 @@ module Stripe
29
30
  opts: opts
30
31
  )
31
32
  end
33
+
34
+ def verify_microdeposits(params = {}, opts = {})
35
+ request_stripe_object(
36
+ method: :post,
37
+ path: resource_url + "/verify_microdeposits",
38
+ params: params,
39
+ opts: opts
40
+ )
41
+ end
32
42
  end
33
43
  end
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class ShippingRate < APIResource
6
+ extend Stripe::APIOperations::Create
7
+ extend Stripe::APIOperations::List
8
+ include Stripe::APIOperations::Save
9
+
10
+ OBJECT_NAME = "shipping_rate"
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
@@ -6,6 +6,7 @@ module Stripe
6
6
  extend Stripe::APIOperations::Create
7
7
  include Stripe::APIOperations::Delete
8
8
  extend Stripe::APIOperations::List
9
+ extend Stripe::APIOperations::Search
9
10
  include Stripe::APIOperations::Save
10
11
 
11
12
  OBJECT_NAME = "subscription"
@@ -22,5 +23,13 @@ module Stripe
22
23
  end
23
24
 
24
25
  save_nested_resource :source
26
+
27
+ def self.search(params = {}, opts = {})
28
+ _search("/v1/subscriptions/search", params, opts)
29
+ end
30
+
31
+ def self.search_auto_paging_each(params = {}, opts = {}, &blk)
32
+ search(params, opts).auto_paging_each(&blk)
33
+ end
25
34
  end
26
35
  end
@@ -0,0 +1,15 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Terminal
6
+ class Configuration < APIResource
7
+ extend Stripe::APIOperations::Create
8
+ include Stripe::APIOperations::Delete
9
+ extend Stripe::APIOperations::List
10
+ include Stripe::APIOperations::Save
11
+
12
+ OBJECT_NAME = "terminal.configuration"
13
+ end
14
+ end
15
+ end
@@ -10,6 +10,66 @@ module Stripe
10
10
  include Stripe::APIOperations::Save
11
11
 
12
12
  OBJECT_NAME = "terminal.reader"
13
+
14
+ custom_method :cancel_action, http_verb: :post
15
+ custom_method :process_payment_intent, http_verb: :post
16
+ custom_method :process_setup_intent, http_verb: :post
17
+ custom_method :set_reader_display, http_verb: :post
18
+
19
+ def cancel_action(params = {}, opts = {})
20
+ request_stripe_object(
21
+ method: :post,
22
+ path: resource_url + "/cancel_action",
23
+ params: params,
24
+ opts: opts
25
+ )
26
+ end
27
+
28
+ def process_payment_intent(params = {}, opts = {})
29
+ request_stripe_object(
30
+ method: :post,
31
+ path: resource_url + "/process_payment_intent",
32
+ params: params,
33
+ opts: opts
34
+ )
35
+ end
36
+
37
+ def process_setup_intent(params = {}, opts = {})
38
+ request_stripe_object(
39
+ method: :post,
40
+ path: resource_url + "/process_setup_intent",
41
+ params: params,
42
+ opts: opts
43
+ )
44
+ end
45
+
46
+ def set_reader_display(params = {}, opts = {})
47
+ request_stripe_object(
48
+ method: :post,
49
+ path: resource_url + "/set_reader_display",
50
+ params: params,
51
+ opts: opts
52
+ )
53
+ end
54
+
55
+ def test_helpers
56
+ TestHelpers.new(self)
57
+ end
58
+
59
+ class TestHelpers < APIResourceTestHelpers
60
+ RESOURCE_CLASS = Reader
61
+
62
+ custom_method :present_payment_method, http_verb: :post
63
+
64
+ def present_payment_method(params = {}, opts = {})
65
+ @resource.request_stripe_object(
66
+ method: :post,
67
+ path: resource_url + "/present_payment_method",
68
+ params: params,
69
+ opts: opts
70
+ )
71
+ end
72
+ end
13
73
  end
14
74
  end
15
75
  end
@@ -0,0 +1,25 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module TestHelpers
6
+ class TestClock < APIResource
7
+ extend Stripe::APIOperations::Create
8
+ include Stripe::APIOperations::Delete
9
+ extend Stripe::APIOperations::List
10
+
11
+ OBJECT_NAME = "test_helpers.test_clock"
12
+
13
+ custom_method :advance, http_verb: :post
14
+
15
+ def advance(params = {}, opts = {})
16
+ request_stripe_object(
17
+ method: :post,
18
+ path: resource_url + "/advance",
19
+ params: params,
20
+ opts: opts
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -16,6 +16,7 @@ require "stripe/resources/bitcoin_receiver"
16
16
  require "stripe/resources/bitcoin_transaction"
17
17
  require "stripe/resources/capability"
18
18
  require "stripe/resources/card"
19
+ require "stripe/resources/cash_balance"
19
20
  require "stripe/resources/charge"
20
21
  require "stripe/resources/checkout/session"
21
22
  require "stripe/resources/country_spec"
@@ -31,6 +32,11 @@ require "stripe/resources/event"
31
32
  require "stripe/resources/exchange_rate"
32
33
  require "stripe/resources/file"
33
34
  require "stripe/resources/file_link"
35
+ require "stripe/resources/financial_connections/account"
36
+ require "stripe/resources/financial_connections/account_owner"
37
+ require "stripe/resources/financial_connections/account_ownership"
38
+ require "stripe/resources/financial_connections/session"
39
+ require "stripe/resources/funding_instructions"
34
40
  require "stripe/resources/identity/verification_report"
35
41
  require "stripe/resources/identity/verification_session"
36
42
  require "stripe/resources/invoice"
@@ -46,8 +52,8 @@ require "stripe/resources/line_item"
46
52
  require "stripe/resources/login_link"
47
53
  require "stripe/resources/mandate"
48
54
  require "stripe/resources/order"
49
- require "stripe/resources/order_return"
50
55
  require "stripe/resources/payment_intent"
56
+ require "stripe/resources/payment_link"
51
57
  require "stripe/resources/payment_method"
52
58
  require "stripe/resources/payout"
53
59
  require "stripe/resources/person"
@@ -68,6 +74,7 @@ require "stripe/resources/reversal"
68
74
  require "stripe/resources/review"
69
75
  require "stripe/resources/setup_attempt"
70
76
  require "stripe/resources/setup_intent"
77
+ require "stripe/resources/shipping_rate"
71
78
  require "stripe/resources/sigma/scheduled_query_run"
72
79
  require "stripe/resources/sku"
73
80
  require "stripe/resources/source"
@@ -78,9 +85,11 @@ require "stripe/resources/subscription_schedule"
78
85
  require "stripe/resources/tax_code"
79
86
  require "stripe/resources/tax_id"
80
87
  require "stripe/resources/tax_rate"
88
+ require "stripe/resources/terminal/configuration"
81
89
  require "stripe/resources/terminal/connection_token"
82
90
  require "stripe/resources/terminal/location"
83
91
  require "stripe/resources/terminal/reader"
92
+ require "stripe/resources/test_helpers/test_clock"
84
93
  require "stripe/resources/three_d_secure"
85
94
  require "stripe/resources/token"
86
95
  require "stripe/resources/topup"
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stripe
4
+ class SearchResultObject < StripeObject
5
+ include Enumerable
6
+ include Stripe::APIOperations::Search
7
+ include Stripe::APIOperations::Request
8
+
9
+ OBJECT_NAME = "search_result"
10
+
11
+ # This accessor allows a `SearchResultObject` to inherit various filters
12
+ # that were given to a predecessor. This allows for things like consistent
13
+ # limits, expansions, and predicates as a user pages through resources.
14
+ attr_accessor :filters
15
+
16
+ # An empty search result object. This is returned from +next+ when we know
17
+ # that there isn't a next page in order to replicate the behavior of the API
18
+ # when it attempts to return a page beyond the last.
19
+ def self.empty_search_result(opts = {})
20
+ SearchResultObject.construct_from({ data: [] }, opts)
21
+ end
22
+
23
+ def initialize(*args)
24
+ super
25
+ self.filters = {}
26
+ end
27
+
28
+ def [](key)
29
+ case key
30
+ when String, Symbol
31
+ super
32
+ else
33
+ raise ArgumentError,
34
+ "You tried to access the #{key.inspect} index, but " \
35
+ "SearchResultObject types only support String keys. " \
36
+ "(HINT: Search calls return an object with a 'data' (which is " \
37
+ "the data array). You likely want to call #data[#{key.inspect}])"
38
+ end
39
+ end
40
+
41
+ # Iterates through each resource in the page represented by the current
42
+ # `SearchListObject`.
43
+ #
44
+ # Note that this method makes no effort to fetch a new page when it gets to
45
+ # the end of the current page's resources. See also +auto_paging_each+.
46
+ def each(&blk)
47
+ data.each(&blk)
48
+ end
49
+
50
+ # Returns true if the page object contains no elements.
51
+ def empty?
52
+ data.empty?
53
+ end
54
+
55
+ # Iterates through each resource in all pages, making additional fetches to
56
+ # the API as necessary.
57
+ #
58
+ # Note that this method will make as many API calls as necessary to fetch
59
+ # all resources. For more granular control, please see +each+ and
60
+ # +next_search_result_page+.
61
+ def auto_paging_each(&blk)
62
+ return enum_for(:auto_paging_each) unless block_given?
63
+
64
+ page = self
65
+
66
+ loop do
67
+ page.each(&blk)
68
+ page = page.next_search_result_page
69
+
70
+ break if page.empty?
71
+ end
72
+ end
73
+
74
+ # Fetches the next page in the resource list (if there is one).
75
+ #
76
+ # This method will try to respect the limit of the current page. If none
77
+ # was given, the default limit will be fetched again.
78
+ def next_search_result_page(params = {}, opts = {})
79
+ return self.class.empty_search_result(opts) unless has_more
80
+
81
+ params = filters.merge(page: next_page).merge(params)
82
+
83
+ _search(url, params, opts)
84
+ end
85
+ end
86
+ end
@@ -585,7 +585,7 @@ module Stripe
585
585
  handle_error_response(resp, context)
586
586
  end
587
587
 
588
- log_response(context, request_start, http_status, resp.body)
588
+ log_response(context, request_start, http_status, resp.body, resp)
589
589
  notify_request_end(context, request_duration, http_status,
590
590
  num_retries, user_data)
591
591
 
@@ -609,7 +609,7 @@ module Stripe
609
609
  error_context = context.dup_from_response_headers(e.http_headers)
610
610
  http_status = resp.code.to_i
611
611
  log_response(error_context, request_start,
612
- e.http_status, e.http_body)
612
+ e.http_status, e.http_body, resp)
613
613
  else
614
614
  log_response_error(error_context, request_start, e)
615
615
  end
@@ -903,10 +903,13 @@ module Stripe
903
903
  body: context.body,
904
904
  idempotency_key: context.idempotency_key,
905
905
  query: context.query,
906
- config: config)
906
+ config: config,
907
+ process_id: Process.pid,
908
+ thread_object_id: Thread.current.object_id,
909
+ log_timestamp: Util.monotonic_time)
907
910
  end
908
911
 
909
- private def log_response(context, request_start, status, body)
912
+ private def log_response(context, request_start, status, body, resp)
910
913
  Util.log_info("Response from Stripe API",
911
914
  account: context.account,
912
915
  api_version: context.api_version,
@@ -921,7 +924,11 @@ module Stripe
921
924
  body: body,
922
925
  idempotency_key: context.idempotency_key,
923
926
  request_id: context.request_id,
924
- config: config)
927
+ config: config,
928
+ process_id: Process.pid,
929
+ thread_object_id: Thread.current.object_id,
930
+ response_object_id: resp.object_id,
931
+ log_timestamp: Util.monotonic_time)
925
932
 
926
933
  return unless context.request_id
927
934
 
data/lib/stripe/util.rb CHANGED
@@ -47,6 +47,53 @@ module Stripe
47
47
  Util.object_classes[object_name] == klass
48
48
  end
49
49
 
50
+ # Adds a custom method to a resource class. This is used to add support for
51
+ # non-CRUDL API requests, e.g. capturing charges. custom_method takes the
52
+ # following parameters:
53
+ # - name: the name of the custom method to create (as a symbol)
54
+ # - http_verb: the HTTP verb for the API request (:get, :post, or :delete)
55
+ # - http_path: the path to append to the resource's URL. If not provided,
56
+ # the name is used as the path
57
+ # - resource: the resource implementation class
58
+ # - target: the class that custom static method will be added to
59
+ #
60
+ # For example, this call:
61
+ # custom_method :capture, http_verb: post
62
+ # adds a `capture` class method to the resource class that, when called,
63
+ # will send a POST request to `/v1/<object_name>/capture`.
64
+ def self.custom_method(resource, target, name, http_verb, http_path)
65
+ unless %i[get post delete].include?(http_verb)
66
+ raise ArgumentError,
67
+ "Invalid http_verb value: #{http_verb.inspect}. Should be one " \
68
+ "of :get, :post or :delete."
69
+ end
70
+ unless target.respond_to?(:resource_url)
71
+ raise ArgumentError,
72
+ "Invalid target value: #{target}. Target class should have a " \
73
+ "`resource_url` method."
74
+ end
75
+ http_path ||= name.to_s
76
+ target.define_singleton_method(name) do |id, params = {}, opts = {}|
77
+ unless id.is_a?(String)
78
+ raise ArgumentError,
79
+ "id should be a string representing the ID of an API resource"
80
+ end
81
+
82
+ url = "#{target.resource_url}/"\
83
+ "#{CGI.escape(id)}/"\
84
+ "#{CGI.escape(http_path)}"
85
+
86
+ resp, opts = resource.execute_resource_request(
87
+ http_verb,
88
+ url,
89
+ params,
90
+ opts
91
+ )
92
+
93
+ Util.convert_to_stripe_object(resp.data, opts)
94
+ end
95
+ end
96
+
50
97
  # Converts a hash of fields or an array of hashes into a +StripeObject+ or
51
98
  # array of +StripeObject+s. These new objects will be created as a concrete
52
99
  # type as dictated by their `object` field (e.g. an `object` value of
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "5.38.0"
4
+ VERSION = "6.0.0"
5
5
  end
data/lib/stripe.rb CHANGED
@@ -24,6 +24,7 @@ require "stripe/api_operations/list"
24
24
  require "stripe/api_operations/nested_resource"
25
25
  require "stripe/api_operations/request"
26
26
  require "stripe/api_operations/save"
27
+ require "stripe/api_operations/search"
27
28
 
28
29
  # API resource support classes
29
30
  require "stripe/errors"
@@ -35,8 +36,10 @@ require "stripe/stripe_client"
35
36
  require "stripe/stripe_object"
36
37
  require "stripe/stripe_response"
37
38
  require "stripe/list_object"
39
+ require "stripe/search_result_object"
38
40
  require "stripe/error_object"
39
41
  require "stripe/api_resource"
42
+ require "stripe/api_resource_test_helpers"
40
43
  require "stripe/singleton_api_resource"
41
44
  require "stripe/webhook"
42
45
  require "stripe/stripe_configuration"
@@ -103,7 +106,7 @@ module Stripe
103
106
  # with API requests. Useful for plugin authors to identify their plugin when
104
107
  # communicating with Stripe.
105
108
  #
106
- # Takes a name and optional partner program ID, plugin URL, and version.
109
+ # Takes a name and optional partner program ID, plugin URL, and version.
107
110
  def self.set_app_info(name, partner_id: nil, url: nil, version: nil)
108
111
  @app_info = {
109
112
  name: name,
data/stripe.gemspec CHANGED
@@ -13,16 +13,16 @@ Gem::Specification.new do |s|
13
13
  "See https://stripe.com for details."
14
14
  s.author = "Stripe"
15
15
  s.email = "support@stripe.com"
16
- s.homepage = "https://stripe.com/docs/api/ruby"
16
+ s.homepage = "https://stripe.com/docs/api?lang=ruby"
17
17
  s.license = "MIT"
18
18
 
19
19
  s.metadata = {
20
20
  "bug_tracker_uri" => "https://github.com/stripe/stripe-ruby/issues",
21
21
  "changelog_uri" =>
22
22
  "https://github.com/stripe/stripe-ruby/blob/master/CHANGELOG.md",
23
- "documentation_uri" => "https://stripe.com/docs/api/ruby",
23
+ "documentation_uri" => "https://stripe.com/docs/api?lang=ruby",
24
24
  "github_repo" => "ssh://github.com/stripe/stripe-ruby",
25
- "homepage_uri" => "https://stripe.com/docs/api/ruby",
25
+ "homepage_uri" => "https://stripe.com/docs/api?lang=ruby",
26
26
  "source_code_uri" => "https://github.com/stripe/stripe-ruby",
27
27
  }
28
28