Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import global configuration for options not available on StripeClient options #1512

Merged
merged 6 commits into from
Jan 13, 2025
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix client options not importing global config
helenye-stripe committed Jan 13, 2025
commit 37bf8b8d882816234af44687736ef4635a41a938
22 changes: 22 additions & 0 deletions lib/stripe.rb
Original file line number Diff line number Diff line change
@@ -74,6 +74,28 @@ module Stripe
DEFAULT_UPLOAD_BASE = "https://files.stripe.com"
DEFAULT_METER_EVENTS_BASE = "https://meter-events.stripe.com"

# Options that can be configured globally by users
USER_CONFIGURABLE_GLOBAL_OPTIONS = Set.new([
:api_key,
:api_version,
:stripe_account,
:api_base,
:uploads_base,
:connect_base,
:meter_events_base,
:open_timeout,
:read_timeout,
:write_timeout,
:proxy,
:verify_ssl_certs,
:ca_bundle_path,
:log_level,
:logger,
:max_network_retries,
:enable_telemetry,
:client_id
])

@app_info = nil

@config = Stripe::StripeConfiguration.setup
7 changes: 6 additions & 1 deletion lib/stripe/stripe_client.rb
Original file line number Diff line number Diff line change
@@ -10,6 +10,10 @@ class StripeClient

# attr_readers: The end of the section generated from our OpenAPI spec

# For internal use only. Does not provide a stable API and may be broken
# with future non-major changes.
CLIENT_OPTIONS = Set.new([:api_key, :stripe_account, :stripe_context, :api_version, :api_base, :uploads_base, :connect_base, :meter_events_base, :client_id])

# Initializes a new StripeClient
def initialize(api_key, # rubocop:todo Metrics/ParameterLists
stripe_account: nil,
@@ -40,7 +44,8 @@ def initialize(api_key, # rubocop:todo Metrics/ParameterLists
client_id: client_id,
}.reject { |_k, v| v.nil? }

@requestor = APIRequestor.new(config_opts)
config = StripeConfiguration.client_init(config_opts)
@requestor = APIRequestor.new(config)

# top-level services: The beginning of the section generated from our OpenAPI spec
@v1 = Stripe::V1Services.new(@requestor)
20 changes: 20 additions & 0 deletions lib/stripe/stripe_configuration.rb
Original file line number Diff line number Diff line change
@@ -37,6 +37,26 @@ def self.setup
end
end

# Set options to the StripeClient configured options, if valid as a client option and provided
# Otherwise, for user configurable global options, set them to the global configuration
# For all other options, set them to the StripeConfiguration default value
def self.client_init(config_opts)
global = Stripe.config
imported_options = Stripe::USER_CONFIGURABLE_GLOBAL_OPTIONS - StripeClient::CLIENT_OPTIONS
StripeConfiguration.setup do |instance|
imported_options.each do |key|
if global.respond_to?(key)
instance.public_send("#{key}=", global.public_send(key))
end
end
StripeClient::CLIENT_OPTIONS.each do |key|
if config_opts.include?(key)
instance.public_send("#{key}=", config_opts[key])
end
end
end
end

# Create a new config based off an existing one. This is useful when the
# caller wants to override the global configuration
def reverse_duplicate_merge(hash)
26 changes: 26 additions & 0 deletions test/stripe/stripe_client_test.rb
Original file line number Diff line number Diff line change
@@ -20,6 +20,7 @@ class StripeClientTest < Test::Unit::TestCase
@orig_api_key = Stripe.api_key
@orig_stripe_account = Stripe.stripe_account
@orig_open_timeout = Stripe.open_timeout
@orig_api_version = Stripe.api_version

Stripe.api_key = "DONT_USE_THIS_KEY"
Stripe.stripe_account = "DONT_USE_THIS_ACCOUNT"
@@ -30,6 +31,7 @@ class StripeClientTest < Test::Unit::TestCase
Stripe.api_key = @orig_api_key
Stripe.stripe_account = @orig_stripe_account
Stripe.open_timeout = @orig_open_timeout
Stripe.api_version = @orig_api_version
end

should "use default config options" do
@@ -67,6 +69,30 @@ class StripeClientTest < Test::Unit::TestCase
assert_equal "2022-11-15", req.headers["Stripe-Version"]
end

should "use global config options for options unavailable in client" do
Stripe.api_key = "NOT_THIS_KEY"
Stripe.stripe_account = "NOT_THIS_ACCOUNT"
Stripe.api_version = "2022-11-15"
client = StripeClient.new("test_123", stripe_account: "acct_123")
# Imported from global options
assert_equal 30_000, client.instance_variable_get(:@requestor).config.open_timeout
# Not set in client options, not imported from global
assert_equal client.instance_variable_get(:@requestor).config.api_base, Stripe::DEFAULT_API_BASE
assert_equal client.instance_variable_get(:@requestor).config.api_version, Stripe::ApiVersion::CURRENT

req = nil
stub_request(:get, "#{Stripe::DEFAULT_API_BASE}/v1/customers/cus_123")
.with { |request| req = request }
.to_return(body: JSON.generate(object: "customer"))

client.v1.customers.retrieve("cus_123")

# Set in client options
assert_equal "Bearer test_123", req.headers["Authorization"]
assert_equal "acct_123", req.headers["Stripe-Account"]
assert_requested(:get, "#{Stripe::DEFAULT_API_BASE}/v1/customers/cus_123")
end

should "request options overrides client config options" do
client = StripeClient.new("test_123", stripe_version: "2022-11-15", stripe_account: "acct_123")