diff --git a/.ruby-gemset b/.ruby-gemset index 6081c5e..87d0b75 100644 --- a/.ruby-gemset +++ b/.ruby-gemset @@ -1 +1 @@ -hermes +status-page diff --git a/lib/hermes/deliverer.rb b/lib/hermes/deliverer.rb index 64dfefa..683bd0b 100644 --- a/lib/hermes/deliverer.rb +++ b/lib/hermes/deliverer.rb @@ -82,7 +82,7 @@ def aggregate_weight_for_type(type, filter: []) } # then sum up all of the weights across our providers - providers.map(&:weight).inject(0, :+) + providers.count == 1 ? 1 : providers.map(&:weight).inject(0, :+) end def weighted_provider_for_type(type, filter: []) @@ -99,6 +99,8 @@ def weighted_provider_for_type(type, filter: []) filter.empty? || filter.include?(provider_instance.class) } + return providers.first if providers.count == 1 + # if we end up with an empty list we're in trouble raise ProviderNotFoundError, "Empty provider list found for type:#{type} filter:#{filter}" unless providers.any? diff --git a/lib/providers/provider.rb b/lib/providers/provider.rb index b6b4795..643f691 100644 --- a/lib/providers/provider.rb +++ b/lib/providers/provider.rb @@ -10,7 +10,7 @@ def required_credentials(*args) end end - attr_reader :deliverer, :defaults, :credentials, :weight + attr_reader :deliverer, :defaults, :credentials def initialize(deliverer, options = {}) @@ -20,7 +20,7 @@ def initialize(deliverer, options = {}) @deliverer = deliverer @defaults = (options[:defaults] || {}).symbolize_keys @credentials = (options[:credentials] || {}).symbolize_keys - @weight = options[:weight].to_i + @weight = options[:weight] || 0 # required credentials should hard stop if they aren't being met if self.class._required_credentials.try(:any?) @@ -32,8 +32,8 @@ def initialize(deliverer, options = {}) end # provider weights need to be 0 (disabled), or greater than 0 to show as active - unless @weight >= 0 - raise(InvalidWeightError, "Provider name:#{common_name} has invalid weight:#{@weight}") + unless self.weight >= 0 + raise(InvalidWeightError, "Provider name:#{common_name} has invalid weight:#{self.weight}") end end @@ -52,6 +52,15 @@ def default(key) end end + def weight + if @weight.is_a?(Fixnum) + @weight.to_i + elsif @weight.is_a?(Class) + @weight_determiner ||= @weight.new(common_name) + @weight_determiner.weight + end + end + def send_message(rails_message) raise ProviderInterfaceError.new("this is an abstract method and must be defined in the subclass") end diff --git a/test/dummy/lib/hermes/non_compliant_provider.rb b/test/dummy/lib/hermes/non_compliant_provider.rb index 04eb7db..d7c11a7 100644 --- a/test/dummy/lib/hermes/non_compliant_provider.rb +++ b/test/dummy/lib/hermes/non_compliant_provider.rb @@ -1,5 +1,5 @@ module Hermes - class NonCompliantProvider < Provider + class NonCompliantProvider < Provider # don't define this so we can test the enforcement of it being defined :) # def send_message(rails_message) # end