class StepByStep::Rollout

Public Class Methods

activate(name) click to toggle source

Activates a feature for everyone

# File lib/step_by_step/rollout.rb, line 12
def self.activate(name)
  create! name: name, group: :all
end
activate_group(name, group) click to toggle source

Activates a feature for a specific group

# File lib/step_by_step/rollout.rb, line 17
def self.activate_group(name, group)
  create! name: name, group: group
end
activate_percentage(name, percentage) click to toggle source

Activates a feature for a fraction of users

# File lib/step_by_step/rollout.rb, line 22
def self.activate_percentage(name, percentage)
  create! name: name, percentage: percentage
end
activate_user(name, user) click to toggle source

Activates a feature for a specific user

# File lib/step_by_step/rollout.rb, line 27
def self.activate_user(name, user)
  create! name: name, user_id: user.id
end
deactivate(name) click to toggle source

Deactivates a feature for everyone

# File lib/step_by_step/rollout.rb, line 32
def self.deactivate(name)
  where(name: name).destroy_all
end
deactivate_group(name, group) click to toggle source

Deactivates a feature for a specific group

# File lib/step_by_step/rollout.rb, line 37
def self.deactivate_group(name, group)
  where(name: name, group: group).destroy_all
end
deactivate_percentage(name) click to toggle source

Deactivates a feature for a fraction of users

# File lib/step_by_step/rollout.rb, line 47
def self.deactivate_percentage(name)
  where('name = ? AND percentage IS NOT NULL', name).destroy_all
end
deactivate_user(name, user) click to toggle source

Deactivates a feature for a specific user

# File lib/step_by_step/rollout.rb, line 42
def self.deactivate_user(name, user)
  where(name: name, user_id: user.id).destroy_all
end
define_group(group) { |user| ... } click to toggle source

Define groups

# File lib/step_by_step/rollout.rb, line 52
def self.define_group(group, &block)
  @@groups ||= []
  @@groups << [group.to_sym, ->(user){ yield(user) }]
end

Public Instance Methods

match?(user) click to toggle source
# File lib/step_by_step/rollout.rb, line 3
def match?(user)
  public? || user && enabled? && (match_group?(user) || match_user?(user) || match_percentage?(user))
end
public?() click to toggle source
# File lib/step_by_step/rollout.rb, line 7
def public?
  group == 'all'
end

Private Instance Methods

enabled?() click to toggle source
# File lib/step_by_step/rollout.rb, line 62
def enabled?
  failure_count.to_i < 1
end
match_group?(user) click to toggle source
# File lib/step_by_step/rollout.rb, line 66
def match_group?(user)
  if group
    # Find the group whose block should be evaluated based on its name
    g = @@groups.select { |i| i.first.to_sym == group.to_sym }

    if g.present?
      # There could theoretically be multiple groups with the same name;
      # only take the last one
      g = g.last

      # g is now an array that looks like this:
      # [:group_name, code_block]
      # Call the code block here with the user
      g.last.call(user)
    end
  end
end
match_percentage?(user) click to toggle source
# File lib/step_by_step/rollout.rb, line 88
def match_percentage?(user)
  percentage ? Zlib::crc32(user.id.to_s) % 100 < percentage : false
end
match_user?(user) click to toggle source
# File lib/step_by_step/rollout.rb, line 84
def match_user?(user)
  user_id ? user_id == user.id : false
end