diff options
15 files changed, 118 insertions, 93 deletions
diff --git a/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb b/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb index 8db616d..8c37c25 100644 --- a/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb +++ b/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb @@ -45,6 +45,6 @@ class SolidusSubscriptions::Api::V1::SubscriptionsController < Spree::Api::BaseC end def line_item_attributes - SolidusSubscriptions::Config.subscription_line_item_attributes - [:subscribable_id] + [:id] + SolidusSubscriptions.configuration.subscription_line_item_attributes - [:subscribable_id] + [:id] end end diff --git a/app/jobs/solidus_subscriptions/process_installments_job.rb b/app/jobs/solidus_subscriptions/process_installments_job.rb index ba54fa8..6048ee6 100644 --- a/app/jobs/solidus_subscriptions/process_installments_job.rb +++ b/app/jobs/solidus_subscriptions/process_installments_job.rb @@ -3,7 +3,7 @@ module SolidusSubscriptions class ProcessInstallmentsJob < ActiveJob::Base - queue_as Config.processing_queue + queue_as SolidusSubscriptions.configuration.processing_queue # Process a collection of installments # diff --git a/app/models/solidus_subscriptions/installment.rb b/app/models/solidus_subscriptions/installment.rb index 1cad63e..c5b4f6c 100644 --- a/app/models/solidus_subscriptions/installment.rb +++ b/app/models/solidus_subscriptions/installment.rb @@ -126,8 +126,8 @@ module SolidusSubscriptions end def next_actionable_date - return if Config.reprocessing_interval.nil? - (DateTime.current + Config.reprocessing_interval).beginning_of_minute + return if SolidusSubscriptions.configuration.reprocessing_interval.nil? + (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute end end end diff --git a/app/models/solidus_subscriptions/subscription.rb b/app/models/solidus_subscriptions/subscription.rb index 9839773..3eb449a 100644 --- a/app/models/solidus_subscriptions/subscription.rb +++ b/app/models/solidus_subscriptions/subscription.rb @@ -133,7 +133,7 @@ module SolidusSubscriptions # pending cancellation will still be processed. def can_be_canceled? return true if actionable_date.nil? - (actionable_date - Config.minimum_cancellation_notice).future? + (actionable_date - SolidusSubscriptions.configuration.minimum_cancellation_notice).future? end def skip(check_skip_limits: true) @@ -226,17 +226,17 @@ module SolidusSubscriptions private def check_successive_skips_exceeded - return unless Config.maximum_successive_skips + return unless SolidusSubscriptions.configuration.maximum_successive_skips - if successive_skip_count >= Config.maximum_successive_skips + if successive_skip_count >= SolidusSubscriptions.configuration.maximum_successive_skips errors.add(:successive_skip_count, :exceeded) end end def check_total_skips_exceeded - return unless Config.maximum_total_skips + return unless SolidusSubscriptions.configuration.maximum_total_skips - if skip_count >= Config.maximum_total_skips + if skip_count >= SolidusSubscriptions.configuration.maximum_total_skips errors.add(:skip_count, :exceeded) end end diff --git a/app/services/solidus_subscriptions/checkout.rb b/app/services/solidus_subscriptions/checkout.rb index 3457435..244cb0b 100644 --- a/app/services/solidus_subscriptions/checkout.rb +++ b/app/services/solidus_subscriptions/checkout.rb @@ -31,13 +31,13 @@ module SolidusSubscriptions return if installments.empty? if checkout - Config.success_dispatcher_class.new(installments, order).dispatch + SolidusSubscriptions.configuration.success_dispatcher_class.new(installments, order).dispatch return order end # A new order will only have 1 payment that we created if order.payments.any?(&:failed?) - Config.payment_failed_dispatcher_class.new(installments, order).dispatch + SolidusSubscriptions.configuration.payment_failed_dispatcher_class.new(installments, order).dispatch installments.clear nil end @@ -45,7 +45,7 @@ module SolidusSubscriptions # Any installments that failed to be processed will be reprocessed unfulfilled_installments = installments.select(&:unfulfilled?) if unfulfilled_installments.any? - Config.failure_dispatcher_class. + SolidusSubscriptions.configuration.failure_dispatcher_class. new(unfulfilled_installments, order).dispatch end end @@ -100,7 +100,7 @@ module SolidusSubscriptions # They will be reprocessed later @installments -= unfulfilled_installments if unfulfilled_installments.any? - Config.out_of_stock_dispatcher_class.new(unfulfilled_installments).dispatch + SolidusSubscriptions.configuration.out_of_stock_dispatcher_class.new(unfulfilled_installments).dispatch end return if installments.empty? diff --git a/app/services/solidus_subscriptions/subscription_line_item_builder.rb b/app/services/solidus_subscriptions/subscription_line_item_builder.rb index 9dc0960..19660c4 100644 --- a/app/services/solidus_subscriptions/subscription_line_item_builder.rb +++ b/app/services/solidus_subscriptions/subscription_line_item_builder.rb @@ -14,7 +14,7 @@ module SolidusSubscriptions def subscription_params params.require(:subscription_line_item).permit( - SolidusSubscriptions::Config.subscription_line_item_attributes + SolidusSubscriptions.configuration.subscription_line_item_attributes ) end end diff --git a/lib/generators/solidus_subscriptions/install/templates/initializer.rb b/lib/generators/solidus_subscriptions/install/templates/initializer.rb index 3de5182..987b922 100644 --- a/lib/generators/solidus_subscriptions/install/templates/initializer.rb +++ b/lib/generators/solidus_subscriptions/install/templates/initializer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -SolidusSubscriptions::Config.tap do |config| +SolidusSubscriptions.configure do |config| # These handlers are pluggable, however it is highly encouraged that # you subclass from the the dispatcher you are replacing, and call # `super` from within the #dispatch method (if you override it). @@ -47,7 +47,7 @@ SolidusSubscriptions::Config.tap do |config| # date of a subscription, set this: # # ``` - # SolidusSubscriptions::Config.subscription_line_item_attributes = [ + # SolidusSubscriptions.configuration.subscription_line_item_attributes = [ # :quantity, # :subscribable_id, # :interval_length, diff --git a/lib/solidus_subscriptions.rb b/lib/solidus_subscriptions.rb index 69c7b7a..a6b2edf 100644 --- a/lib/solidus_subscriptions.rb +++ b/lib/solidus_subscriptions.rb @@ -6,6 +6,19 @@ require 'solidus_support' require 'deface' require 'state_machines' +require 'solidus_subscriptions/configuration' require 'solidus_subscriptions/ability' require 'solidus_subscriptions/version' require 'solidus_subscriptions/engine' + +module SolidusSubscriptions + class << self + def configure + yield configuration + end + + def configuration + @configuration ||= Configuration.new + end + end +end diff --git a/lib/solidus_subscriptions/config.rb b/lib/solidus_subscriptions/config.rb deleted file mode 100644 index 20ebd20..0000000 --- a/lib/solidus_subscriptions/config.rb +++ /dev/null @@ -1,56 +0,0 @@ -module SolidusSubscriptions - module Config - class << self - attr_writer :success_dispatcher_class - def success_dispatcher_class - @success_dispatcher_class ||= ::SolidusSubscriptions::SuccessDispatcher - end - - attr_writer :failure_dispatcher_class - def failure_dispatcher_class - @failure_dispatcher_class ||= ::SolidusSubscriptions::FailureDispatcher - end - - attr_writer :payment_failed_dispatcher_class - def payment_failed_dispatcher_class - @payment_failed_dispatcher_class ||= ::SolidusSubscriptions::PaymentFailedDispatcher - end - - attr_writer :out_of_stock_dispatcher - def out_of_stock_dispatcher_class - @out_of_stock_dispatcher_class ||= ::SolidusSubscriptions::OutOfStockDispatcher - end - end - - mattr_accessor(:maximum_successive_skips) { 1 } - - mattr_accessor(:maximum_total_skips) { nil } - - mattr_accessor(:reprocessing_interval) { 1.day } - - mattr_accessor(:minimum_cancellation_notice) { 1.day } - - mattr_accessor(:processing_queue) { :default } - - mattr_accessor(:subscription_line_item_attributes) do - [ - :quantity, - :subscribable_id, - :interval_length, - :interval_units, - :end_date, - ] - end - - mattr_accessor(:subscription_attributes) do - [ - :interval_length, - :interval_units, - :end_date, - :actionable_date, - shipping_address_attributes: Spree::PermittedAttributes.address_attributes, - billing_address_attributes: Spree::PermittedAttributes.address_attributes, - ] - end - end -end diff --git a/lib/solidus_subscriptions/configuration.rb b/lib/solidus_subscriptions/configuration.rb new file mode 100644 index 0000000..d128198 --- /dev/null +++ b/lib/solidus_subscriptions/configuration.rb @@ -0,0 +1,72 @@ +module SolidusSubscriptions + class Configuration + attr_writer :success_dispatcher_class + def success_dispatcher_class + @success_dispatcher_class ||= 'SolidusSubscriptions::SuccessDispatcher' + @success_dispatcher_class.constantize + end + + attr_writer :failure_dispatcher_class + def failure_dispatcher_class + @failure_dispatcher_class ||= 'SolidusSubscriptions::FailureDispatcher' + @failure_dispatcher_class.constantize + end + + attr_writer :payment_failed_dispatcher_class + def payment_failed_dispatcher_class + @payment_failed_dispatcher_class ||= 'SolidusSubscriptions::PaymentFailedDispatcher' + @payment_failed_dispatcher_class.constantize + end + + attr_writer :out_of_stock_dispatcher + def out_of_stock_dispatcher_class + @out_of_stock_dispatcher_class ||= 'SolidusSubscriptions::OutOfStockDispatcher' + @out_of_stock_dispatcher_class.constantize + end + + attr_writer :maximum_successive_skips + def maximum_successive_skips + @maximum_successive_skips ||= 1 + end + + attr_accessor :maximum_total_skips + + attr_writer :reprocessing_interval + def reprocessing_interval + @reprocessing_interval ||= 1.day + end + + attr_writer :minimum_cancellation_notice + def minimum_cancellation_notice + @minimum_cancellation_notice ||= 1.day + end + + attr_writer :processing_queue + def processing_queue + @processing_queue ||= :default + end + + attr_writer :subscription_line_item_attributes + def subscription_line_item_attributes + @subscription_line_item_attributes ||= [ + :quantity, + :subscribable_id, + :interval_length, + :interval_units, + :end_date, + ] + end + + attr_writer :subscription_attributes + def subscription_attributes + @subscription_attributes ||= [ + :interval_length, + :interval_units, + :end_date, + :actionable_date, + shipping_address_attributes: Spree::PermittedAttributes.address_attributes, + billing_address_attributes: Spree::PermittedAttributes.address_attributes, + ] + end + end +end diff --git a/lib/solidus_subscriptions/engine.rb b/lib/solidus_subscriptions/engine.rb index 8b5b083..0f18d95 100644 --- a/lib/solidus_subscriptions/engine.rb +++ b/lib/solidus_subscriptions/engine.rb @@ -4,7 +4,7 @@ require 'spree/core' require 'solidus_subscriptions' require 'solidus_subscriptions/permitted_attributes' -require 'solidus_subscriptions/config' +require 'solidus_subscriptions/configuration' require 'solidus_subscriptions/processor' module SolidusSubscriptions diff --git a/lib/solidus_subscriptions/permitted_attributes.rb b/lib/solidus_subscriptions/permitted_attributes.rb index d1ae5a1..f689e90 100644 --- a/lib/solidus_subscriptions/permitted_attributes.rb +++ b/lib/solidus_subscriptions/permitted_attributes.rb @@ -5,11 +5,11 @@ module SolidusSubscriptions module PermittedAttributes class << self def subscription_line_item_attributes - [Config.subscription_line_item_attributes] + [SolidusSubscriptions.configuration.subscription_line_item_attributes] end def subscription_attributes - Config.subscription_attributes | [ + SolidusSubscriptions.configuration.subscription_attributes | [ line_items_attributes: (subscription_line_item_attributes | [:id] - [:subscribable_id]), ] end diff --git a/spec/models/solidus_subscriptions/installment_spec.rb b/spec/models/solidus_subscriptions/installment_spec.rb index f21909c..c09d949 100644 --- a/spec/models/solidus_subscriptions/installment_spec.rb +++ b/spec/models/solidus_subscriptions/installment_spec.rb @@ -18,7 +18,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do subject { installment.out_of_stock } let(:expected_date) do - (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute + (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } @@ -70,7 +70,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do let(:order) { create :order } let(:expected_date) do - (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute + (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } @@ -89,12 +89,8 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do end context 'the reprocessing interval is set to nil' do - around do |e| - interval, SolidusSubscriptions::Config.reprocessing_interval = [SolidusSubscriptions::Config.reprocessing_interval, nil] - - e.run - - SolidusSubscriptions::Config.reprocessing_interval = interval + before do + allow(SolidusSubscriptions.configuration).to receive_messages(reprocessing_interval: nil) end it 'does not advance the installment actionable_date' do @@ -141,7 +137,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do let(:order) { create :order } let(:expected_date) do - (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute + (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute end it { is_expected.to be_a SolidusSubscriptions::InstallmentDetail } diff --git a/spec/models/solidus_subscriptions/subscription_spec.rb b/spec/models/solidus_subscriptions/subscription_spec.rb index e2e73d7..38b430c 100644 --- a/spec/models/solidus_subscriptions/subscription_spec.rb +++ b/spec/models/solidus_subscriptions/subscription_spec.rb @@ -91,16 +91,16 @@ RSpec.describe SolidusSubscriptions::Subscription, type: :model do end around do |e| - successive_skip_limit = SolidusSubscriptions::Config.maximum_successive_skips - total_skip_limit = SolidusSubscriptions::Config.maximum_total_skips + successive_skip_limit = SolidusSubscriptions.configuration.maximum_successive_skips + total_skip_limit = SolidusSubscriptions.configuration.maximum_total_skips - SolidusSubscriptions::Config.maximum_successive_skips = 1 - SolidusSubscriptions::Config.maximum_total_skips = 1 + SolidusSubscriptions.configuration.maximum_successive_skips = 1 + SolidusSubscriptions.configuration.maximum_total_skips = 1 Timecop.freeze { e.run } - SolidusSubscriptions::Config.maximum_successive_skips = successive_skip_limit - SolidusSubscriptions::Config.maximum_total_skips = total_skip_limit + SolidusSubscriptions.configuration.maximum_successive_skips = successive_skip_limit + SolidusSubscriptions.configuration.maximum_total_skips = total_skip_limit end context 'when the successive skips have been exceeded' do diff --git a/spec/services/solidus_subscriptions/checkout_spec.rb b/spec/services/solidus_subscriptions/checkout_spec.rb index bdae3d2..aee7129 100644 --- a/spec/services/solidus_subscriptions/checkout_spec.rb +++ b/spec/services/solidus_subscriptions/checkout_spec.rb @@ -148,7 +148,7 @@ RSpec.describe SolidusSubscriptions::Checkout do variant.stock_items.update_all(count_on_hand: 0, backorderable: false) end - let(:expected_date) { (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute } + let(:expected_date) { (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute } it 'creates a failed installment detail' do subject @@ -179,7 +179,7 @@ RSpec.describe SolidusSubscriptions::Checkout do checkout.user.wallet.default_wallet_payment_source = wallet_payment_source card } - let(:expected_date) { (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute } + let(:expected_date) { (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute } it { is_expected.to be_nil } @@ -235,7 +235,7 @@ RSpec.describe SolidusSubscriptions::Checkout do end context 'there is an aribitrary failure' do - let(:expected_date) { (DateTime.current + SolidusSubscriptions::Config.reprocessing_interval).beginning_of_minute } + let(:expected_date) { (DateTime.current + SolidusSubscriptions.configuration.reprocessing_interval).beginning_of_minute } before do allow(checkout).to receive(:populate).and_raise('arbitrary runtime error') |