unleash 5.1.1 → 6.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/unleash/client.rb +21 -22
- data/lib/unleash/configuration.rb +2 -2
- data/lib/unleash/context.rb +35 -9
- data/lib/unleash/metrics_reporter.rb +12 -26
- data/lib/unleash/strategies.rb +14 -73
- data/lib/unleash/toggle_fetcher.rb +22 -56
- data/lib/unleash/variant.rb +6 -0
- data/lib/unleash/version.rb +1 -1
- data/lib/unleash.rb +1 -1
- data/unleash-client.gemspec +1 -0
- metadata +20 -22
- data/lib/unleash/activation_strategy.rb +0 -44
- data/lib/unleash/constraint.rb +0 -117
- data/lib/unleash/feature_toggle.rb +0 -253
- data/lib/unleash/metrics.rb +0 -41
- data/lib/unleash/strategy/application_hostname.rb +0 -26
- data/lib/unleash/strategy/base.rb +0 -16
- data/lib/unleash/strategy/default.rb +0 -13
- data/lib/unleash/strategy/flexible_rollout.rb +0 -64
- data/lib/unleash/strategy/gradual_rollout_random.rb +0 -24
- data/lib/unleash/strategy/gradual_rollout_sessionid.rb +0 -21
- data/lib/unleash/strategy/gradual_rollout_userid.rb +0 -21
- data/lib/unleash/strategy/remote_address.rb +0 -36
- data/lib/unleash/strategy/user_with_id.rb +0 -20
- data/lib/unleash/strategy/util.rb +0 -17
- data/lib/unleash/variant_definition.rb +0 -26
- data/lib/unleash/variant_override.rb +0 -44
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'unleash/strategy/util'
|
2
|
-
|
3
|
-
module Unleash
|
4
|
-
module Strategy
|
5
|
-
class GradualRolloutRandom < Base
|
6
|
-
def name
|
7
|
-
'gradualRolloutRandom'
|
8
|
-
end
|
9
|
-
|
10
|
-
# need: params['percentage']
|
11
|
-
def is_enabled?(params = {}, _context = nil)
|
12
|
-
return false unless params.is_a?(Hash) && params.has_key?('percentage')
|
13
|
-
|
14
|
-
begin
|
15
|
-
percentage = Integer(params['percentage'] || 0)
|
16
|
-
rescue ArgumentError
|
17
|
-
return false
|
18
|
-
end
|
19
|
-
|
20
|
-
(percentage >= Random.rand(1..100))
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'unleash/strategy/util'
|
2
|
-
|
3
|
-
module Unleash
|
4
|
-
module Strategy
|
5
|
-
class GradualRolloutSessionId < Base
|
6
|
-
def name
|
7
|
-
'gradualRolloutSessionId'
|
8
|
-
end
|
9
|
-
|
10
|
-
# need: params['percentage'], params['groupId'], context.user_id,
|
11
|
-
def is_enabled?(params = {}, context = nil)
|
12
|
-
return false unless params.is_a?(Hash) && params.has_key?('percentage')
|
13
|
-
return false unless context.instance_of?(Unleash::Context)
|
14
|
-
return false if context.session_id.nil? || context.session_id.empty?
|
15
|
-
|
16
|
-
percentage = Integer(params['percentage'] || 0)
|
17
|
-
(percentage.positive? && Util.get_normalized_number(context.session_id, params['groupId'] || "", 0) <= percentage)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'unleash/strategy/util'
|
2
|
-
|
3
|
-
module Unleash
|
4
|
-
module Strategy
|
5
|
-
class GradualRolloutUserId < Base
|
6
|
-
def name
|
7
|
-
'gradualRolloutUserId'
|
8
|
-
end
|
9
|
-
|
10
|
-
# need: params['percentage'], params['groupId'], context.user_id,
|
11
|
-
def is_enabled?(params = {}, context = nil, _constraints = [])
|
12
|
-
return false unless params.is_a?(Hash) && params.has_key?('percentage')
|
13
|
-
return false unless context.instance_of?(Unleash::Context)
|
14
|
-
return false if context.user_id.nil? || context.user_id.empty?
|
15
|
-
|
16
|
-
percentage = Integer(params['percentage'] || 0)
|
17
|
-
(percentage.positive? && Util.get_normalized_number(context.user_id, params['groupId'] || "", 0) <= percentage)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Unleash
|
2
|
-
module Strategy
|
3
|
-
class RemoteAddress < Base
|
4
|
-
PARAM = 'IPs'.freeze
|
5
|
-
|
6
|
-
def name
|
7
|
-
'remoteAddress'
|
8
|
-
end
|
9
|
-
|
10
|
-
# need: params['IPs'], context.remote_address
|
11
|
-
def is_enabled?(params = {}, context = nil)
|
12
|
-
return false unless params.is_a?(Hash) && params.has_key?(PARAM)
|
13
|
-
return false unless params.fetch(PARAM, nil).is_a? String
|
14
|
-
return false unless context.instance_of?(Unleash::Context)
|
15
|
-
|
16
|
-
remote_address = ipaddr_or_nil_from_str(context.remote_address)
|
17
|
-
|
18
|
-
params[PARAM]
|
19
|
-
.split(',')
|
20
|
-
.map(&:strip)
|
21
|
-
.map{ |ipblock| ipaddr_or_nil_from_str(ipblock) }
|
22
|
-
.compact
|
23
|
-
.map{ |ipb| ipb.include? remote_address }
|
24
|
-
.any?
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def ipaddr_or_nil_from_str(ip)
|
30
|
-
IPAddr.new(ip)
|
31
|
-
rescue StandardError
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Unleash
|
2
|
-
module Strategy
|
3
|
-
class UserWithId < Base
|
4
|
-
PARAM = 'userIds'.freeze
|
5
|
-
|
6
|
-
def name
|
7
|
-
'userWithId'
|
8
|
-
end
|
9
|
-
|
10
|
-
# requires: params['userIds'], context.user_id,
|
11
|
-
def is_enabled?(params = {}, context = nil)
|
12
|
-
return false unless params.is_a?(Hash) && params.has_key?(PARAM)
|
13
|
-
return false unless params.fetch(PARAM, nil).is_a? String
|
14
|
-
return false unless context.instance_of?(Unleash::Context)
|
15
|
-
|
16
|
-
params[PARAM].split(",").map(&:strip).include?(context.user_id)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'murmurhash3'
|
2
|
-
|
3
|
-
module Unleash
|
4
|
-
module Strategy
|
5
|
-
module Util
|
6
|
-
module_function
|
7
|
-
|
8
|
-
NORMALIZER = 100
|
9
|
-
VARIANT_NORMALIZER_SEED = 86_028_157
|
10
|
-
|
11
|
-
# convert the two strings () into a number between 1 and base (100 by default)
|
12
|
-
def get_normalized_number(identifier, group_id, seed, base = NORMALIZER)
|
13
|
-
MurmurHash3::V32.str_hash("#{group_id}:#{identifier}", seed) % base + 1
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'unleash/variant_override'
|
2
|
-
|
3
|
-
module Unleash
|
4
|
-
class VariantDefinition
|
5
|
-
attr_accessor :name, :weight, :payload, :overrides, :stickiness
|
6
|
-
|
7
|
-
def initialize(name, weight = 0, payload = nil, stickiness = nil, overrides = []) # rubocop:disable Metrics/ParameterLists
|
8
|
-
self.name = name
|
9
|
-
self.weight = weight
|
10
|
-
self.payload = payload
|
11
|
-
self.stickiness = stickiness
|
12
|
-
self.overrides = (overrides || [])
|
13
|
-
.select{ |v| v.is_a?(Hash) && v.has_key?('contextName') }
|
14
|
-
.map{ |v| VariantOverride.new(v.fetch('contextName', ''), v.fetch('values', [])) } || []
|
15
|
-
end
|
16
|
-
|
17
|
-
def override_matches_context?(context)
|
18
|
-
self.overrides.select{ |o| o.matches_context?(context) }.first
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
"<VariantDefinition: name=#{self.name},weight=#{self.weight},payload=#{self.payload},stickiness=#{self.stickiness}" \
|
23
|
-
",overrides=#{self.overrides}>"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module Unleash
|
2
|
-
class VariantOverride
|
3
|
-
attr_accessor :context_name, :values
|
4
|
-
|
5
|
-
def initialize(context_name, values = [])
|
6
|
-
self.context_name = context_name
|
7
|
-
self.values = values || []
|
8
|
-
|
9
|
-
validate
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
"<VariantOverride: context_name=#{self.context_name},values=#{self.values}>"
|
14
|
-
end
|
15
|
-
|
16
|
-
def matches_context?(context)
|
17
|
-
raise ArgumentError, 'context must be of class Unleash::Context' unless context.instance_of?(Unleash::Context)
|
18
|
-
|
19
|
-
context_value =
|
20
|
-
case self.context_name
|
21
|
-
when 'userId'
|
22
|
-
context.user_id
|
23
|
-
when 'sessionId'
|
24
|
-
context.session_id
|
25
|
-
when 'remoteAddress'
|
26
|
-
context.remote_address
|
27
|
-
else
|
28
|
-
context.properties.fetch(self.context_name, nil)
|
29
|
-
end
|
30
|
-
|
31
|
-
Unleash.logger.debug "VariantOverride: context_name: #{context_name} context_value: #{context_value}"
|
32
|
-
|
33
|
-
self.values.include? context_value.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def validate
|
39
|
-
raise ArgumentError, 'context_name must be a String' unless self.context_name.is_a?(String)
|
40
|
-
raise ArgumentError, 'values must be an Array of strings' unless self.values.is_a?(Array) \
|
41
|
-
&& self.values.reject{ |v| v.is_a?(String) }.empty?
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|