require 'open3'
namespace :multi_db do
environments = ENV['environments'].nil? ? ['test', 'development'] : ENV['environments'].split(',') desc "Drops all specified environment databases" task :drop do environments.each do |env_name| drop env_name end end desc "Migrates all specified environment databases" task :migrate do environments.each do |env_name| migrate env_name end end desc "Drops and then Migrates all specified environment databases" task :redo do environments.each do |env_name| drop env_name migrate env_name end end desc "Resets all table data in the specified environment databases" task :reset do environments.each do |env_name| reset env_name end end desc "Executes the seed script to populate the specified environment databases" task :seed do environments.each do |env_name| seed env_name end end # Helper methods # def prompt_user(message) # Don't show a message, if the force param was passed force = ENV['force'].nil? ? false : ENV['force'] return true if force puts "#{message} (y|n|yes|no)" # parse the response resp = STDIN.gets.strip case resp.downcase when 'yes', 'y' return true when 'no', 'n' puts 'Aborting...' exit 0 else # Re-prompt the user return prompt_user message end end def drop(env_name) puts "Dropping #{env_name.capitalize} Database" execute_command("rake db:drop RAILS_ENV=#{env_name}") end def migrate(env_name) puts "Migrating #{env_name.capitalize} Database" execute_command("rake db:migrate RAILS_ENV=#{env_name}") end def reset(env_name) puts "Resetting #{env_name.capitalize} Database" execute_command("rake db:reset RAILS_ENV=#{env_name}") end def seed(env_name) puts "Seeding #{env_name.capitalize} Database" execute_command("rake db:seed RAILS_ENV=#{env_name}") end def execute_command(command) Open3::popen3(command) do |stdin, stdout, stderr| out_text = stdout.gets error_text = stderr.gets unless error_text.nil? puts "Error: #{error_text}" prompt_user 'An error occurred. Would you like to continue?' end unless out_text.nil? puts out_text end end end
end