module Blackbeard::FeatureRollout

Public Instance Methods

active_segment?(context) click to toggle source
# File lib/blackbeard/feature_rollout.rb, line 7
def active_segment?(context)
  return false unless group_segments
  #TODO: speed this up. memoize group on the feature. store segment in user session
  group_segments.each_pair do |group_id, segments|
    next if segments.nil? || segments.empty?
    group = Group.find(group_id) or next
    user_segment = group.segment_for(context) or next
    return true if segments.include?(user_segment)
  end
  false
end
active_user?(context) click to toggle source
# File lib/blackbeard/feature_rollout.rb, line 19
def active_user?(context)
  return false if (users_rate.zero? || !context.user)
  return true if users_rate == 100

  user_id = id_to_int(context.user_id)
  (user_id % 100).between?(1,users_rate)
end
active_visitor?(context) click to toggle source
# File lib/blackbeard/feature_rollout.rb, line 27
def active_visitor?(context)
  return false if visitors_rate.zero?
  return true if visitors_rate == 100
  (context.visitor_id % 100).between?(1,visitors_rate)
end
id_to_int(id) click to toggle source
# File lib/blackbeard/feature_rollout.rb, line 33
def id_to_int(id)
  if id.kind_of?(Integer)
    id
  elsif id.kind_of?(String)
    bytes = id.bytes
    if bytes.count > 8
      bytes = bytes[-8..-1]
    end
    bytes.inject { |sum, n| sum * n }
  else
    raise UserIdNotDivisable
  end
end
rollout?(context) click to toggle source
# File lib/blackbeard/feature_rollout.rb, line 3
def rollout?(context)
  active_user?(context) || active_visitor?(context) || active_segment?(context)
end