From 1d2c4b678d6f2c8c7d21a031b48496aaa3a7aee7 Mon Sep 17 00:00:00 2001 From: Martin Meyerhoff Date: Mon, 6 Nov 2023 16:29:19 +0100 Subject: [PATCH] Use new NestedClassSet for configuring calculators We have several actions, and several calculators. Not all calculators work for all actions (e.g. the DistributedAmountCalculator really only works for the AdjustLineItem action, and the `Tiered` ones don't work for `AdjustLineItemQuantityGroups`. Rather than creating a new configuration option for each calculator, let's use something like a Hash here. --- .../actions/adjust_line_item.rb | 4 --- .../actions/adjust_shipment.rb | 4 --- .../promotion_action.rb | 2 +- .../install/templates/initializer.rb | 36 +++++++++++-------- lib/solidus_friendly_promotions.rb | 1 + .../configuration.rb | 2 ++ .../nested_class_set.rb | 24 +++++++++++++ .../configuration_spec.rb | 12 ++----- 8 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 lib/solidus_friendly_promotions/nested_class_set.rb diff --git a/app/models/solidus_friendly_promotions/actions/adjust_line_item.rb b/app/models/solidus_friendly_promotions/actions/adjust_line_item.rb index 5876567f..9940abdf 100644 --- a/app/models/solidus_friendly_promotions/actions/adjust_line_item.rb +++ b/app/models/solidus_friendly_promotions/actions/adjust_line_item.rb @@ -7,10 +7,6 @@ def can_discount?(object) object.is_a? Spree::LineItem end - def available_calculators - SolidusFriendlyPromotions.config.line_item_discount_calculators - end - def level :line_item end diff --git a/app/models/solidus_friendly_promotions/actions/adjust_shipment.rb b/app/models/solidus_friendly_promotions/actions/adjust_shipment.rb index e9870fc9..e3bb9177 100644 --- a/app/models/solidus_friendly_promotions/actions/adjust_shipment.rb +++ b/app/models/solidus_friendly_promotions/actions/adjust_shipment.rb @@ -7,10 +7,6 @@ def can_discount?(object) object.is_a?(Spree::Shipment) || object.is_a?(Spree::ShippingRate) end - def available_calculators - SolidusFriendlyPromotions.config.shipment_discount_calculators - end - def level :shipment end diff --git a/app/models/solidus_friendly_promotions/promotion_action.rb b/app/models/solidus_friendly_promotions/promotion_action.rb index 27e718ae..bfd10391 100644 --- a/app/models/solidus_friendly_promotions/promotion_action.rb +++ b/app/models/solidus_friendly_promotions/promotion_action.rb @@ -67,7 +67,7 @@ def relevant_rules end def available_calculators - raise NotImplementedError + SolidusFriendlyPromotions.config.promotion_calculators[self.class] || (raise NotImplementedError) end end end diff --git a/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb b/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb index 188498c5..84b60be6 100644 --- a/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb +++ b/lib/generators/solidus_friendly_promotions/install/templates/initializer.rb @@ -63,21 +63,27 @@ # How many promotions should be displayed on the index page in the admin. config.promotions_per_page = 25 - config.shipment_discount_calculators = [ - "SolidusFriendlyPromotions::Calculators::FlatRate", - "SolidusFriendlyPromotions::Calculators::FlexiRate", - "SolidusFriendlyPromotions::Calculators::Percent", - "SolidusFriendlyPromotions::Calculators::TieredFlatRate", - "SolidusFriendlyPromotions::Calculators::TieredPercent" - ] - config.line_item_discount_calculators = [ - "SolidusFriendlyPromotions::Calculators::DistributedAmount", - "SolidusFriendlyPromotions::Calculators::FlatRate", - "SolidusFriendlyPromotions::Calculators::FlexiRate", - "SolidusFriendlyPromotions::Calculators::Percent", - "SolidusFriendlyPromotions::Calculators::TieredFlatRate", - "SolidusFriendlyPromotions::Calculators::TieredPercent" - ] + config.promotion_calculators = SolidusFriendlyPromotions::NestedClassSet.new( + "SolidusFriendlyPromotions::Actions::AdjustShipment" => [ + "SolidusFriendlyPromotions::Calculators::FlatRate", + "SolidusFriendlyPromotions::Calculators::FlexiRate", + "SolidusFriendlyPromotions::Calculators::Percent", + "SolidusFriendlyPromotions::Calculators::TieredFlatRate", + "SolidusFriendlyPromotions::Calculators::TieredPercent" + ], + "SolidusFriendlyPromotions::Actions::AdjustLineItem" => [ + "SolidusFriendlyPromotions::Calculators::DistributedAmount", + "SolidusFriendlyPromotions::Calculators::FlatRate", + "SolidusFriendlyPromotions::Calculators::FlexiRate", + "SolidusFriendlyPromotions::Calculators::Percent", + "SolidusFriendlyPromotions::Calculators::TieredFlatRate", + "SolidusFriendlyPromotions::Calculators::TieredPercent" + ], + "SolidusFriendlyPromotions::Actions::AdjustLineItemQuantityGroups" => [ + "SolidusFriendlyPromotions::Calculators::FlatRate", + "SolidusFriendlyPromotions::Calculators::Percent" + ] + ) config.order_rules = [ "SolidusFriendlyPromotions::Rules::FirstOrder", diff --git a/lib/solidus_friendly_promotions.rb b/lib/solidus_friendly_promotions.rb index d55cdd3c..ce488bcb 100644 --- a/lib/solidus_friendly_promotions.rb +++ b/lib/solidus_friendly_promotions.rb @@ -6,6 +6,7 @@ require "turbo-rails" require "importmap-rails" require "stimulus-rails" +require "solidus_friendly_promotions/nested_class_set" require "solidus_friendly_promotions/configuration" require "solidus_friendly_promotions/version" require "solidus_friendly_promotions/engine" diff --git a/lib/solidus_friendly_promotions/configuration.rb b/lib/solidus_friendly_promotions/configuration.rb index 816ecdc7..65e1fb34 100644 --- a/lib/solidus_friendly_promotions/configuration.rb +++ b/lib/solidus_friendly_promotions/configuration.rb @@ -5,9 +5,11 @@ module SolidusFriendlyPromotions class Configuration < Spree::Preferences::Configuration attr_accessor :sync_order_promotions + attr_accessor :promotion_calculators def initialize @sync_order_promotions = true + @promotion_calculators = NestedClassSet.new end include Spree::Core::EnvironmentExtension diff --git a/lib/solidus_friendly_promotions/nested_class_set.rb b/lib/solidus_friendly_promotions/nested_class_set.rb new file mode 100644 index 00000000..21fa4c6e --- /dev/null +++ b/lib/solidus_friendly_promotions/nested_class_set.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require "spree/core/class_constantizer" + +module SolidusFriendlyPromotions + class NestedClassSet + attr_reader :klass_sets + + def initialize(hash = {}) + @klass_sets = hash.map do |key, value| + [ + key, + Spree::Core::ClassConstantizer::Set.new.tap do |set| + value.each { |klass_name| set << klass_name } + end + ] + end.to_h + end + + def [](klass) + klass_sets[klass.name] + end + end +end diff --git a/spec/lib/solidus_friendly_promotions/configuration_spec.rb b/spec/lib/solidus_friendly_promotions/configuration_spec.rb index 2e4b62ab..136f18f1 100644 --- a/spec/lib/solidus_friendly_promotions/configuration_spec.rb +++ b/spec/lib/solidus_friendly_promotions/configuration_spec.rb @@ -19,16 +19,10 @@ end end - describe ".shipment_discount_calculators" do - subject { config.shipment_discount_calculators } + describe ".promotion_calculators" do + subject { config.promotion_calculators } - it { is_expected.to be_a(Spree::Core::ClassConstantizer::Set) } - end - - describe ".line_item_discount_calculators" do - subject { config.line_item_discount_calculators } - - it { is_expected.to be_a(Spree::Core::ClassConstantizer::Set) } + it { is_expected.to be_a(SolidusFriendlyPromotions::NestedClassSet) } end describe ".order_rules" do