lib/tasks/simple_switch.rake
namespace :simple_switch do
# eg: bundle exec rake simple_switch:add_feature name='Foo' description='Foo feature'
desc 'Add a feature'
task :add_feature => :environment do
check_strategy
name = ENV['name']
description = ENV['description']
feature_manager = SimpleSwitch.feature_manager
abort 'Feature name is required.' if name.blank?
abort "Feature #{name} already exists." if feature_manager.has_feature?(name)
feature_manager.add_feature(name: name, description: description)
abort "Feature #{name} added."
end
# eg: bundle exec rake simple_switch:add_environment name='test'
desc 'Add an environment'
task :add_environment => :environment do
check_strategy
name = ENV['name']
feature_manager = SimpleSwitch.feature_manager
abort 'Environment name is required.' if name.blank?
abort "Environment #{name} already exists." if feature_manager.has_environment?(name)
feature_manager.add_environment(name: name)
abort "Environment #{name} added."
end
# eg: bundle exec rake simple_switch:add_feature_config feature='foo' environment='test' status=true
desc 'Add feature configuration'
task :add_feature_config => :environment do
check_strategy
feature = ENV['feature']
environment = ENV['environment']
status = ENV['status']
feature_manager = SimpleSwitch.feature_manager
abort 'Feature name is required.' if feature.blank?
abort "Feature #{feature} does not exist, add this feature first." unless feature_manager.has_feature?(feature)
abort 'Environment name is required.' if environment.blank?
abort "Environment #{environment} does not exist, add this environment first." unless feature_manager.has_environment?(environment)
feature_manager.add_state(feature: feature, environment: environment, status: status)
abort 'Feature configuration added.'
end
# eg: bundle exec rake simple_switch:turn_on feature='foo' environment='test'
desc 'Turn on feature for an environment'
task :turn_on => :environment do
toggle_feature_task(:on)
end
# eg: bundle exec rake simple_switch:turn_off feature='foo' environment='test'
desc 'Turn off feature for an environment'
task :turn_off => :environment do
toggle_feature_task(:off)
end
private
def check_strategy
# TODO: Temporarily disable rake tasks for yml strategy
abort "'yml' strategy does not support this task, please modify feature"\
' configuration yaml file instead.' if SimpleSwitch.feature_store != :database
end
def toggle_feature_task(status)
check_strategy
environment, feature, feature_manager = validate_args
toggle_feature(feature, environment, feature_manager, status)
end
def validate_args
feature = ENV['feature']
environment = ENV['environment']
feature_manager = SimpleSwitch.feature_manager
abort 'Feature name is required.' if feature.blank?
abort "Feature #{feature} does not exist." unless feature_manager.has_feature?(feature)
abort 'Environment name is required.' if environment.blank?
abort "Environment #{environment} does not exist, add this environment first." unless feature_manager.has_environment?(environment)
return environment, feature, feature_manager
end
def toggle_feature(feature, environment, feature_manager, status)
success_msg = "Feature '#{feature}' has been turned #{status} for environment '#{environment}'."
error_msg = "Feature '#{feature}' is not configured on environment '#{environment}'."
toggle_method = status == :on ? :turn_on : :turn_off
begin
feature_manager.send(toggle_method, feature, environment)
abort success_msg
rescue
abort error_msg
end
end
end