foodsoft/lib/tasks/foodsoft_setup.rake
2015-05-02 14:34:13 +02:00

160 lines
4.1 KiB
Ruby

require 'stringio'
# put in here all foodsoft tasks
# => :environment loads the environment an gives easy access to the application
module Colors
def colorize(text, color_code)
"\033[#{color_code}m#{text}\033[0m"
end
{
:black => 30,
:red => 31,
:green => 32,
:yellow => 33,
:blue => 34,
:magenta => 35,
:cyan => 36,
:white => 37
}.each do |key, color_code|
define_method key do |text|
colorize(text, color_code)
end
end
end
include Colors
namespace :foodsoft do
desc "Setup foodsoft"
task :setup_development do
puts yellow "This task will help you get your foodcoop running in development."
setup_bundler
setup_app_config
setup_development
setup_database
setup_secret_token
start_mailcatcher
puts yellow "All done! Your foodcoft should be running smoothly."
start_server
end
namespace :setup do
desc "Initialize stock configuration"
task :stock_config do
setup_app_config
setup_development
setup_secret_token
end
end
end
def setup_bundler
puts yellow "Installing bundler if not installed..."
%x( if [ -z `which bundle` ]; then gem install bundler --no-rdoc --no-ri; fi )
puts yellow "Executing bundle install..."
%x( bundle install )
end
def setup_database
file = 'config/database.yml'
if ENV['DATABASE_URL']
puts blue "DATABASE_URL found, please remember to also set it when running Foodsoft"
return nil
end
return nil if skip?(file)
database = ask("What kind of database do you use?\nOptions:\n(1) MySQL\n(2) SQLite", ["1","2"])
if database == "1"
puts yellow "Using MySQL..."
%x( cp #{Rails.root.join("#{file}.MySQL_SAMPLE")} #{Rails.root.join(file)} )
elsif database == "2"
puts yellow "Using SQLite..."
%x( cp #{Rails.root.join("#{file}.SQLite_SAMPLE")} #{Rails.root.join(file)} )
end
reminder(file)
puts blue "Setup your database before you continue!"
finished = ask("Finished?\nOptions:\n(y) Yes", ["y"])
if finished
Rake::Task["db:setup"].reenable
db_setup = capture_stdout { Rake::Task["db:setup"].invoke }
puts db_setup
end
end
def setup_app_config
file = 'config/app_config.yml'
sample = Rails.root.join("#{file}.SAMPLE")
return nil if skip?(file)
puts yellow "Copying #{file}..."
%x( cp #{sample} #{Rails.root.join(file)} )
reminder(file)
end
def setup_development
file = 'config/environments/development.rb'
return nil if skip?(file)
puts yellow "Copying #{file}..."
%x( cp #{Rails.root.join("#{file}.SAMPLE")} #{Rails.root.join(file)} )
reminder(file)
end
def setup_secret_token
file = 'config/initializers/secret_token.rb'
return nil if skip?(file)
puts yellow "Generating secret_token and writing to #{file}..."
Rake::Task["secret"].reenable
secret = capture_stdout { Rake::Task["secret"].invoke }
%x( touch #{Rails.root.join("#{file}")}; echo 'Foodsoft::Application.config.secret_key_base = "#{secret.chomp}"' > #{Rails.root.join("#{file}")} )
end
def start_mailcatcher
return nil if ENV['MAILCATCHER_PORT'] # skip when it has an existing Docker container
mailcatcher = ask("Do you want to start mailcatcher?\nOptions:\n(y) Yes\n(n) No", ["y","n"])
if mailcatcher === "y"
puts yellow "Starting mailcatcher at http://localhost:1080..."
%x( mailcatcher )
end
end
def start_server
puts blue "Start your server running 'bundle exec rails s' and visit http://localhost:3000"
end
# Helper Methods
def ask(question, answers = false)
puts question
input = STDIN.gets.chomp
if input.blank? or (answers and !answers.include?(input))
puts red "Your Input is not valid. Try again!"
input = ask(question, answers)
end
input
end
def skip?(file)
output = false
skip = ask(cyan("We found #{file}!\nOptions:\n(1) Skip step\n(2) Force rewrite"), ["1","2"]) if File.exists?(Rails.root.join(file))
output = true if skip == "1"
output
end
def reminder(file)
puts blue "don't forget to edit #{file}"
end
def capture_stdout
s = StringIO.new
$stdout = s
yield
s.string
ensure
$stdout = STDOUT
end