lib/ext/feature_branch.rb
class Object
class << self
raise 'Abstract feature branch conflicts with another Ruby library having Object::feature_branch' if respond_to?(:feature_branch)
def feature_branch(feature_name, scope = nil, &feature_work)
if feature_enabled?(feature_name, scope)
feature_work.call
end
end
raise 'Abstract feature branch conflicts with another Ruby library having Object::feature_enabled?' if respond_to?(:feature_enabled?)
def feature_enabled?(feature_name, scope = nil)
normalized_feature_name = feature_name.to_s.downcase
redis_override_value = feature_enabled_reddis_override_value(normalized_feature_name)
value = !redis_override_value.nil? ? redis_override_value : AbstractFeatureBranch.application_features[normalized_feature_name]
if AbstractFeatureBranch.scoped_value?(value)
value = !scope.nil? && feature_enabled_scoped_value(feature_name, scope)
end
value
end
private
raise 'Abstract feature branch conflicts with another Ruby library having Object::feature_enabled_reddis_override_value' if Object.new.respond_to?(:feature_enabled_reddis_override_value, true)
def feature_enabled_reddis_override_value(normalized_feature_name)
if AbstractFeatureBranch.configuration.feature_store_live_fetching?
begin
AbstractFeatureBranch.get_store_feature(normalized_feature_name)
rescue Exception => error
AbstractFeatureBranch.logger.error "AbstractFeatureBranch encountered an error in retrieving Redis Override value for feature \"#{normalized_feature_name}\"! Defaulting to YAML configuration value...\n\nError: #{error.full_message}\n\n"
nil
end
end
end
raise 'Abstract feature branch conflicts with another Ruby library having Object::feature_enabled_scoped_value' if Object.new.respond_to?(:feature_enabled_scoped_value, true)
def feature_enabled_scoped_value(normalized_feature_name, scope)
if AbstractFeatureBranch.configuration.feature_store_live_fetching?
begin
AbstractFeatureBranch.feature_store.sismember("#{AbstractFeatureBranch::ENV_FEATURE_PREFIX}#{normalized_feature_name}", scope)
rescue Exception => error
AbstractFeatureBranch.logger.error "AbstractFeatureBranch encountered an error in retrieving Per-User value for feature \"#{normalized_feature_name}\" and scope #{scope}! Defaulting to nil value...\n\nError: #{error.full_message}\n\n"
nil
end
else
AbstractFeatureBranch.redis_scoped_features[normalized_feature_name]&.include?(scope.to_s)
end
end
end
raise 'Abstract feature branch conflicts with another Ruby library having Object#feature_branch' if Object.new.respond_to?(:feature_branch)
def feature_branch(feature_name, scope = nil, &feature_work)
Object.feature_branch(feature_name.to_s, scope, &feature_work)
end
raise 'Abstract feature branch conflicts with another Ruby library having Object#feature_enabled?' if Object.new.respond_to?(:feature_enabled?)
def feature_enabled?(feature_name, scope = nil)
Object.feature_enabled?(feature_name.to_s, scope)
end
end