Skip to content

Commit 0dbb156

Browse files
scootkleinduane
authored andcommitted
STSPG-2256: Dynamic Hermes Weights
1 parent a936f0e commit 0dbb156

File tree

4 files changed

+18
-7
lines changed

4 files changed

+18
-7
lines changed

.ruby-gemset

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hermes
1+
status-page

lib/hermes/deliverer.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def aggregate_weight_for_type(type, filter: [])
8282
}
8383

8484
# then sum up all of the weights across our providers
85-
providers.map(&:weight).inject(0, :+)
85+
providers.count == 1 ? 1 : providers.map(&:weight).inject(0, :+)
8686
end
8787

8888
def weighted_provider_for_type(type, filter: [])
@@ -99,6 +99,8 @@ def weighted_provider_for_type(type, filter: [])
9999
filter.empty? || filter.include?(provider_instance.class)
100100
}
101101

102+
return providers.first if providers.count == 1
103+
102104
# if we end up with an empty list we're in trouble
103105
raise ProviderNotFoundError, "Empty provider list found for type:#{type} filter:#{filter}" unless providers.any?
104106

lib/providers/provider.rb

+13-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def required_credentials(*args)
1010
end
1111
end
1212

13-
attr_reader :deliverer, :defaults, :credentials, :weight
13+
attr_reader :deliverer, :defaults, :credentials
1414

1515
def initialize(deliverer, options = {})
1616

@@ -20,7 +20,7 @@ def initialize(deliverer, options = {})
2020
@deliverer = deliverer
2121
@defaults = (options[:defaults] || {}).symbolize_keys
2222
@credentials = (options[:credentials] || {}).symbolize_keys
23-
@weight = options[:weight].to_i
23+
@weight = options[:weight] || 0
2424

2525
# required credentials should hard stop if they aren't being met
2626
if self.class._required_credentials.try(:any?)
@@ -32,8 +32,8 @@ def initialize(deliverer, options = {})
3232
end
3333

3434
# provider weights need to be 0 (disabled), or greater than 0 to show as active
35-
unless @weight >= 0
36-
raise(InvalidWeightError, "Provider name:#{common_name} has invalid weight:#{@weight}")
35+
unless self.weight >= 0
36+
raise(InvalidWeightError, "Provider name:#{common_name} has invalid weight:#{self.weight}")
3737
end
3838
end
3939

@@ -52,6 +52,15 @@ def default(key)
5252
end
5353
end
5454

55+
def weight
56+
if @weight.is_a?(Fixnum)
57+
@weight.to_i
58+
elsif @weight.is_a?(Class)
59+
@weight_determiner ||= @weight.new(common_name)
60+
@weight_determiner.weight
61+
end
62+
end
63+
5564
def send_message(rails_message)
5665
raise ProviderInterfaceError.new("this is an abstract method and must be defined in the subclass")
5766
end

test/dummy/lib/hermes/non_compliant_provider.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
module Hermes
2-
class NonCompliantProvider < Provider
2+
class NonCompliantProvider < Provider
33
# don't define this so we can test the enforcement of it being defined :)
44
# def send_message(rails_message)
55
# end

0 commit comments

Comments
 (0)