From 56b883e70c28fed8a7cd85b455371d00a03a3762 Mon Sep 17 00:00:00 2001 From: Gannon McGibbon Date: Thu, 2 Jan 2025 18:44:18 -0600 Subject: [PATCH] Autoload resource classes Implements autoloading on Active Resources classes so they don't load early unnecessarily. This improves load times for Rails applications, especially in instances where they are not used. --- lib/active_resource/json_errors.rb | 2 +- lib/shopify_api.rb | 44 ++++++------- lib/shopify_api/api_version.rb | 3 + lib/shopify_api/graphql/railtie.rb | 2 + lib/shopify_api/resources.rb | 100 ++++++++++++++++++++++++++++- lib/shopify_api/resources/base.rb | 7 ++ lib/shopify_api/resources/ping.rb | 3 - 7 files changed, 132 insertions(+), 29 deletions(-) delete mode 100644 lib/shopify_api/resources/ping.rb diff --git a/lib/active_resource/json_errors.rb b/lib/active_resource/json_errors.rb index cdfe98bef..5ed913d36 100644 --- a/lib/active_resource/json_errors.rb +++ b/lib/active_resource/json_errors.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -require 'active_resource/base' +require 'active_model/errors' module ActiveResource class Errors < ActiveModel::Errors diff --git a/lib/shopify_api.rb b/lib/shopify_api.rb index 3140d48ee..8d3021ac0 100644 --- a/lib/shopify_api.rb +++ b/lib/shopify_api.rb @@ -5,40 +5,40 @@ require 'digest/md5' require 'base64' require 'active_resource/detailed_log_subscriber' -require 'shopify_api/limits' -require 'shopify_api/api_version' -require 'shopify_api/meta' require 'active_resource/json_errors' -require 'shopify_api/paginated_collection' -require 'shopify_api/disable_prefix_check' if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.6") puts("\nshopify_api: NOTE: Support for Ruby #{RUBY_VERSION} will be dropped in the next major release. Please update to Ruby 2.6 or newer before updating this gem.\n\n") end module ShopifyAPI + extend ActiveSupport::Autoload + + require 'shopify_api/limits' + require 'shopify_api/api_version' + require 'shopify_api/paginated_collection' + require 'shopify_api/disable_prefix_check' + require 'shopify_api/events' + require 'shopify_api/metafields' + require 'shopify_api/countable' + require 'shopify_api/resources' + require 'shopify_api/session' + require 'shopify_api/hmac_params' + require 'shopify_api/api_access' + require 'shopify_api/message_enricher' + require 'shopify_api/connection' + require 'shopify_api/pagination_link_headers' + require 'shopify_api/graphql' + + eager_autoload do + autoload(:Meta) + end + include Limits end -require 'shopify_api/events' -require 'shopify_api/metafields' -require 'shopify_api/countable' -require 'shopify_api/resources' -require 'shopify_api/session' -require 'shopify_api/hmac_params' -require 'shopify_api/api_access' -require 'shopify_api/message_enricher' -require 'shopify_api/connection' -require 'shopify_api/pagination_link_headers' -require 'shopify_api/graphql' require 'shopify_api/graphql/railtie' if defined?(Rails) -if ShopifyAPI::Base.respond_to?(:connection_class) - ShopifyAPI::Base.connection_class = ShopifyAPI::Connection -else - require 'active_resource/connection_ext' -end - if ENV["SHOPIFY_LOG_PATH"] ActiveResource::Base.logger = Logger.new(ENV["SHOPIFY_LOG_PATH"]) ActiveResource::DetailedLogSubscriber.attach_to(:active_resource_detailed) diff --git a/lib/shopify_api/api_version.rb b/lib/shopify_api/api_version.rb index afdaa9beb..c583b4bc9 100644 --- a/lib/shopify_api/api_version.rb +++ b/lib/shopify_api/api_version.rb @@ -1,4 +1,7 @@ # frozen_string_literal: true + +require "active_support/core_ext/hash" + module ShopifyAPI class ApiVersion class UnknownVersion < StandardError; end diff --git a/lib/shopify_api/graphql/railtie.rb b/lib/shopify_api/graphql/railtie.rb index 962c7c5a0..f7c7cd6e6 100644 --- a/lib/shopify_api/graphql/railtie.rb +++ b/lib/shopify_api/graphql/railtie.rb @@ -4,6 +4,8 @@ module ShopifyAPI module GraphQL class Railtie < Rails::Railtie + config.eager_load_namespaces << ShopifyAPI + initializer 'shopify_api.initialize_graphql_clients' do |app| ShopifyAPI::GraphQL.schema_location = app.root.join('db', ShopifyAPI::GraphQL.schema_location) ShopifyAPI::GraphQL.initialize_clients diff --git a/lib/shopify_api/resources.rb b/lib/shopify_api/resources.rb index 6ffb16ca5..d9e8f1104 100644 --- a/lib/shopify_api/resources.rb +++ b/lib/shopify_api/resources.rb @@ -1,4 +1,98 @@ # frozen_string_literal: true -require 'shopify_api/resources/base' -require 'shopify_api/resources/array_base' -Dir.glob("#{File.dirname(__FILE__)}/resources/*").each { |file| require(file) } + +module ShopifyAPI + eager_autoload do + autoload_under('resources') do + autoload(:Base) + autoload(:ArrayBase) + autoload(:AbandonedCheckout) + autoload(:AccessScope) + autoload(:AccessToken) + autoload(:Address) + autoload(:Announcement) + autoload(:ApiPermission) + autoload(:ApplicationCharge) + autoload(:ApplicationCredit) + autoload(:ArrayBase) + autoload(:Article) + autoload(:Asset) + autoload(:AssignedFulfillmentOrder) + autoload(:Base) + autoload(:BillingAddress) + autoload(:Blog) + autoload(:CarrierService) + autoload(:Cart) + autoload(:Checkout) + autoload(:Collect) + autoload(:Collection) + autoload(:CollectionListing) + autoload(:CollectionPublication) + autoload(:Comment) + autoload(:Country) + autoload(:Currency) + autoload(:CustomCollection) + autoload(:Customer) + autoload(:CustomerGroup) + autoload(:CustomerInvite) + autoload(:CustomerSavedSearch) + autoload(:DiscountCode) + autoload(:DiscountCodeBatch) + autoload(:DraftOrder) + autoload(:DraftOrderInvoice) + autoload(:Event) + autoload(:Fulfillment) + autoload(:FulfillmentEvent) + autoload(:FulfillmentOrder) + autoload(:FulfillmentOrderLocationsForMove) + autoload(:FulfillmentRequest) + autoload(:FulfillmentService) + autoload(:FulfillmentV2) + autoload(:GiftCard) + autoload(:Image) + autoload(:InventoryItem) + autoload(:InventoryLevel) + autoload(:LineItem) + autoload(:Location) + autoload(:MarketingEvent) + autoload(:Metafield) + autoload(:NoteAttribute) + autoload(:Option) + autoload(:Order) + autoload(:OrderRisk) + autoload(:Page) + autoload(:Payment) + autoload(:PaymentDetails) + autoload(:Policy) + autoload(:PriceRule) + autoload(:Product) + autoload(:ProductListing) + autoload(:ProductPublication) + autoload(:Province) + autoload(:Publication) + autoload(:Receipt) + autoload(:RecurringApplicationCharge) + autoload(:Redirect) + autoload(:Refund) + autoload(:Report) + autoload(:ResourceFeedback) + autoload(:Rule) + autoload(:ScriptTag) + autoload(:ShippingAddress) + autoload(:ShippingLine) + autoload(:ShippingRate) + autoload(:ShippingZone) + autoload(:Shop) + autoload(:SmartCollection) + autoload(:StorefrontAccessToken) + autoload(:TaxLine) + autoload(:TaxService) + autoload(:TenderTransaction) + autoload(:Theme) + autoload(:Transaction) + autoload(:UsageCharge) + autoload(:User) + autoload(:Variant) + autoload(:Webhook) + end + end +end diff --git a/lib/shopify_api/resources/base.rb b/lib/shopify_api/resources/base.rb index 54af47304..f44d2ed53 100644 --- a/lib/shopify_api/resources/base.rb +++ b/lib/shopify_api/resources/base.rb @@ -164,3 +164,10 @@ def only_id end end end + + +if ShopifyAPI::Base.respond_to?(:connection_class) + ShopifyAPI::Base.connection_class = ShopifyAPI::Connection +else + require 'active_resource/connection_ext' +end diff --git a/lib/shopify_api/resources/ping.rb b/lib/shopify_api/resources/ping.rb deleted file mode 100644 index dddad1e82..000000000 --- a/lib/shopify_api/resources/ping.rb +++ /dev/null @@ -1,3 +0,0 @@ -# frozen_string_literal: true - -Dir.glob("#{File.dirname(__FILE__)}/ping/*").each { |file| require file }