card/lib/generators/deck/deck_generator/interactive.rb
module Decko
module Generators
module Deck
class DeckGenerator
# Guides through the decko deck installation with an interactive menu
# Offers the possibilitiy to
# - edit database config
# - edit application.rb
# - seed database
# - run server
class Interactive
def initialize destination_root, dev=false
@dev = dev
@destination_root = destination_root
end
def run
require config_path("application") # need this for Rails.env
@menu = ActiveSupport::OrderedHash.new
add_config_options
add_seed_options
add_exit_option
while (answer = ask(build_menu)) != "x"
if @menu.key? answer
@menu[answer][:code].call
else
puts "invalid choice"
end
end
end
private
def dev_options?
@dev
end
def config_path file
File.join destination_root, "config", file
end
def bundle_exec command, opts={}
rails_env = "RAILS_ENV=#{opts[:rails_env]}" if opts[:rails_env]
system "cd #{destination_root} && #{rails_env} bundle exec #{command}"
end
def build_menu
lines = ["What would you like to do next?"]
lines += @menu.map { |key, v| build_option key, v[:desc], v[:command] }
lines << "[#{@menu.keys.join}]"
"\n#{lines.join("\n")}\n"
end
def build_option key, desc, command
command &&= "#{' ' * (65 - desc.size)}[#{command}]"
" #{key} - #{desc}#{command}"
end
def add_config_options
@menu["d"] = {
desc: "edit database configuration file",
command: "nano config/database.yml",
code: proc { system "nano #{config_path 'database.yml'}" }
}
@menu["c"] = {
desc: "configure Decko (e.g. email settings)",
command: "nano config/application.rb",
code: proc { system "nano #{config_path 'application.rb'}" }
}
end
def add_seed_options
add_common_seed_option
add_seed_all_option
end
def add_common_seed_option
@menu["s"] = {
desc: "seed #{Rails.env}#{' and test' if dev_options?} database",
command: "decko setup",
code: proc do
bundle_exec "rake decko:seed"
bundle_exec "rake decko:seed", rails_env: "test" if dev_options?
add_after_seed_options
end
}
end
def add_seed_all_option
@menu["a"] = {
desc: "seed all databases (production, development, and test)",
command: "decko setup --all",
code: proc do
%w[production development test].each do |env|
bundle_exec "rake decko:seed", rails_env: env
end
add_after_seed_options
end
}
end
def add_exit_option
@menu["x"] = {
desc: "exit (run 'decko setup' to complete the installation later)"
}
end
def add_after_seed_options
@menu["x"][:desc] = "exit"
@menu["r"] = {
desc: "run decko server",
command: "decko server",
code: proc { bundle_exec "decko server" }
}
end
end
end
end
end
end