card/lib/cardio/command.rb
require "English"
require "colorize"
require "cardio/command/custom"
module Cardio
# manage different types of commands that can be run via bin/card (and bin/decko)
class Command
include Custom
attr_reader :command, :args
class << self
attr_accessor :bin_name
def run_non_deck_command command, commands_script
if command == "new"
ARGV.shift
Cardio::Generators::Deck::DeckGenerator.start
elsif command.blank?
require commands_script
else
puts "ERROR: `#{bin_name} #{command}` " \
"cannot be run from outside deck".red
end
end
end
def map
@map ||= {
new: { desc: "create a new deck", group: :shark, via: :call },
setup: { desc: "populate a database", group: :shark, via: :rake },
update: { desc: "run data updates", group: :shark, alias: :u, via: :rake },
version: { desc: "#{gem} gem version", group: :shark, alias: :v, via: :call },
help: { desc: "show this text", group: :shark, alias: :h, via: :call },
console: { desc: "start a ruby console", group: :monkey, alias: :c },
dbconsole: { desc: "start a database console", group: :monkey, alias: :db },
runner: { desc: "run code in app environment", group: :monkey, alias: :r },
rspec: { desc: "run rspec tests", group: :monkey, alias: :rs, via: :call },
generate: { desc: "generate templated code", group: :monkey, alias: :g },
reset: { desc: "reset cache and tmpfiles", group: :monkey, via: :rake },
sow: { desc: "export card data to mod yaml", group: :monkey, via: :rake },
eat: { desc: "ingest card data from mod yaml", group: :monkey, via: :rake }
}
end
# TODO: review the following. see if any work well enough to include
#
# application Generate the Rails application code
# destroy Undo code generated with "generate" (short-cut alias: "d")
# benchmarker See how fast a piece of code runs
# profiler Get profile information from a piece of code
# plugin Install a plugin
# jasmine
def initialize args
@args = args
@command = command_for_key args.first&.to_sym
ENV["PRY_RESCUE_RAILS"] = "1" if rescue?
@args.shift unless handler == :rails
end
def gem
"card"
end
def run
case handler
when :rails
run_rails
when :rake
run_rake
when :call
send "run_#{command}"
when :unknown
unknown_error
end
exit 0
end
private
def command_for_key key
return :help unless key
return key if map.key? key
map.each { |k, v| return k if v[:alias] == key }
@unknown = true
key
end
def rescue?
args.delete "--rescue"
end
def config
map[command]
end
def handler
@handler ||= @unknown ? :unknown : (config[:via] || :rails)
end
# runs all commands in "rails" list
def run_rails
require generator_requirement if command == :generate
require "rails/commands"
end
def generator_requirement
"cardio/generators"
end
# runs all commands in "rake" list
def run_rake
require "cardio/command/rake_command"
RakeCommand.new(gem, command, args).run
end
# ~~~~~~~~~~~~~~~~~~~~~ catch-all -------------- #
def unknown_error
puts "----------------------------------------------\n" \
"ERROR: Command not recognized: #{command}\n" \
"----------------------------------------------\n".red
run_help
exit 1
end
end
end