Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
29 changes: 25 additions & 4 deletions lib/stripe.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@
require "stripe/singleton_api_resource"
require "stripe/webhook"
require "stripe/stripe_configuration"
require "stripe/resources/v2/amount"
require "stripe/resources/v2/deleted_object"
require "stripe/resources/v2/core/event_notification"

# Named API resources
# Named API resources — autoloaded on first use to reduce boot time.
# Call Stripe.eager_load! to load everything upfront (recommended
# before forking in production). In Rails, this happens automatically
# when config.eager_load is true.
require "stripe/resources"
require "stripe/services"
require "stripe/params"
Expand All @@ -65,6 +65,10 @@
require "stripe/oauth"
require "stripe/services/oauth_service"

# Rails integration — registers Stripe in config.eager_load_namespaces
# so Stripe.eager_load! is called automatically when config.eager_load is true.
require "stripe/railtie" if defined?(Rails::Railtie)

module Stripe
DEFAULT_CA_BUNDLE_PATH = __dir__ + "/data/ca-certificates.crt"

Expand Down Expand Up @@ -136,6 +140,23 @@ class << self
def_delegators :@config, :ca_store
end

# Eagerly loads all autoloaded Stripe constants (resources, services,
# params) using the same file list and load order as previous versions
# of this gem that used eager require.
#
# Call this before forking in production (Puma, Unicorn, etc.) to
# avoid autoload in multi-threaded request handling. In Rails apps
# this is called automatically when config.eager_load is true.
#
# # Non-Rails production / pre-fork hook:
# Stripe.eager_load!
#
def self.eager_load!
(RESOURCE_FILES + SERVICE_FILES + PARAM_FILES).each do |path|
require path
end
end

# Gets the application for a plugin that's identified some. See
# #set_app_info.
def self.app_info
Expand Down
1,945 changes: 1,331 additions & 614 deletions lib/stripe/params.rb

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions lib/stripe/railtie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# typed: ignore
# frozen_string_literal: true

module Stripe
class Railtie < ::Rails::Railtie
config.eager_load_namespaces << Stripe
end
end
653 changes: 475 additions & 178 deletions lib/stripe/resources.rb

Large diffs are not rendered by default.

646 changes: 457 additions & 189 deletions lib/stripe/services.rb

Large diffs are not rendered by default.

57 changes: 57 additions & 0 deletions test/stripe/autoload_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# frozen_string_literal: true

require File.expand_path("../test_helper", __dir__)

module Stripe
class AutoloadTest < Test::Unit::TestCase
context "autoloaded constants" do
should "resolve all v1 object type classes" do
Stripe::ObjectTypes.object_names_to_classes.each do |name, klass|
assert_kind_of Class, klass, "#{name} did not resolve to a class"
end
end

should "resolve all v2 object type classes" do
Stripe::ObjectTypes.v2_object_names_to_classes.each do |name, klass|
assert_kind_of Class, klass, "#{name} did not resolve to a class"
end
end

should "resolve all v2 event type classes" do
Stripe::EventTypes.v2_event_types_to_classes.each do |type, klass|
assert_kind_of Class, klass, "#{type} did not resolve to a class"
end
end

should "resolve all event notification type classes" do
Stripe::EventTypes.event_notification_types_to_classes.each do |type, klass|
assert_kind_of Class, klass, "#{type} did not resolve to a class"
end
end

should "define EventNotification constants from event files" do
# Each event file defines both *Event and *EventNotification.
# Verify the *EventNotification constants are accessible.
assert_kind_of Class, Stripe::Events::V2CoreAccountClosedEventNotification
assert_kind_of Class, Stripe::Events::V1BillingMeterErrorReportTriggeredEventNotification
end
end

context ".eager_load!" do
should "load all registered files without error" do
assert_nothing_raised { Stripe.eager_load! }
end

should "make all resource constants available" do
Stripe.eager_load!

# Spot-check a sample of resources across namespaces
assert_equal "customer", Stripe::Customer::OBJECT_NAME
assert_equal "billing.alert", Stripe::Billing::Alert::OBJECT_NAME
assert_equal "checkout.session", Stripe::Checkout::Session::OBJECT_NAME
assert_equal "issuing.card", Stripe::Issuing::Card::OBJECT_NAME
assert_equal "treasury.financial_account", Stripe::Treasury::FinancialAccount::OBJECT_NAME
end
end
end
end
28 changes: 28 additions & 0 deletions test/stripe/railtie_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# typed: ignore
# frozen_string_literal: true

require "test/unit"

begin
require "rails"
rescue LoadError
# Rails is not a dependency of stripe-ruby; skip these tests when unavailable.
end

if defined?(Rails::Railtie)
require "stripe"

class RailtieTest < Test::Unit::TestCase
test "Railtie is defined and is a Rails::Railtie" do
assert_operator Stripe::Railtie, :<, ::Rails::Railtie
end

test "Stripe is registered in eager_load_namespaces" do
app = Class.new(Rails::Application) do
config.eager_load = false
config.active_support.to_time_preserves_timezone = :zone
end
assert_includes app.config.eager_load_namespaces, Stripe
end
end
end
Loading