foodsoft/lib/tasks/foodsoft_setup.rake

175 lines
4.2 KiB
Ruby
Raw Permalink Normal View History

2014-01-04 20:12:01 +01:00
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_storage
start_mailcatcher
puts yellow 'All done! Your foodsoft setup should be running smoothly.'
start_server
end
2013-07-24 13:21:52 +02:00
desc 'Setup foodsoft'
task :setup_development_docker do
puts yellow 'This task will help you get your foodcoop running in development via docker.'
setup_app_config
setup_development
setup_storage
setup_run_rake_db_setup
puts yellow 'All done! Your foodsoft setup should be running smoothly via docker.'
end
2013-07-24 13:21:52 +02:00
namespace :setup do
desc 'Initialize stock configuration'
2013-07-24 13:21:52 +02:00
task :stock_config do
setup_app_config
2023-05-06 11:46:45 +02:00
setup_storage
2013-07-24 13:21:52 +02:00
setup_development
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...'
`bundle install`
end
def setup_database
file = 'config/database.yml'
2015-05-02 13:47:52 +02:00
if ENV['DATABASE_URL']
puts blue 'DATABASE_URL found, please remember to also set it when running Foodsoft'
2015-05-02 13:47:52 +02:00
return nil
end
return nil if skip?(file)
database = ask("What kind of database do you use?\nOptions:\n(1) MySQL\n(2) SQLite", %w[1 2])
if database == '1'
puts yellow 'Using MySQL...'
`cp -p #{Rails.root.join("#{file}.MySQL_SAMPLE")} #{Rails.root.join(file)}`
elsif database == '2'
puts yellow 'Using SQLite...'
`cp -p #{Rails.root.join("#{file}.SQLite_SAMPLE")} #{Rails.root.join(file)}`
end
reminder(file)
puts blue 'IMPORTANT: Edit (rake-generated) config/database.yml with valid username and password for EACH env before continuing!'
finished = ask("Finished?\nOptions:\n(y) Yes", ['y'])
setup_run_rake_db_setup if finished
end
def setup_run_rake_db_setup
Rake::Task['db:setup'].reenable
db_setup = capture_stdout { Rake::Task['db:setup'].invoke }
puts db_setup
end
def setup_app_config
file = 'config/app_config.yml'
2014-01-04 20:12:01 +01:00
sample = Rails.root.join("#{file}.SAMPLE")
return nil if skip?(file)
puts yellow "Copying #{file}..."
`cp -p #{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}..."
`cp -p #{Rails.root.join("#{file}.SAMPLE")} #{Rails.root.join(file)}`
reminder(file)
end
def setup_storage
file = 'config/storage.yml'
return nil if skip?(file)
puts yellow "Copying #{file}..."
`cp -p #{Rails.root.join("#{file}.SAMPLE")} #{Rails.root.join(file)}`
reminder(file)
end
def start_mailcatcher
2015-05-02 13:47:52 +02:00
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", %w[y n])
return unless mailcatcher === 'y'
puts yellow 'Starting mailcatcher at http://localhost:1080...'
`mailcatcher`
end
def start_server
puts blue "Start your server running 'bundle exec rails s' and visit http://localhost:3000"
end
2014-01-04 20:12:01 +01:00
# Helper Methods
def ask(question, answers = false)
puts question
input = STDIN.gets.chomp
if input.blank? || (answers && !answers.include?(input))
puts red 'Your Input is not valid. Try again!'
input = ask(question, answers)
end
input
end
def skip?(file)
output = false
if File.exist?(Rails.root.join(file))
skip = ask(cyan("We found #{file}!\nOptions:\n(1) Skip step\n(2) Force rewrite"),
%w[1 2])
end
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