stripe 5.38.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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