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