lib/magellan/cli/base.rb in magellan-cli-0.2.17 vs lib/magellan/cli/base.rb in magellan-cli-0.2.18
- old
+ new
@@ -5,10 +5,11 @@
module Magellan
module Cli
class Base < Thor
class_option :verbose, type: :boolean, aliases: "-V"
class_option :dryrun , type: :boolean, aliases: "-D"
+ class_option :version, type: :boolean, aliases: "-v"
no_commands do
def sub(klass)
task = klass.new
@@ -27,26 +28,121 @@
def verbose?
opts[:verbose]
end
def verbose(msg)
- $stderr.puts("\e[34m#{msg}\e[0m") if verbose?
+ self.class.verbose(msg) if verbose?
end
def info(msg)
- $stderr.puts(msg)
+ self.class.info(msg)
end
def success(msg)
- $stderr.puts("\e[32m#{msg}\e[0m")
+ self.class.success(msg)
end
def error(msg)
- $stderr.puts("\e[31m#{msg}\e[0m")
+ self.class.error(msg)
end
def fatal(msg)
verbose(caller.join("\n "))
raise Cli::Error, msg
end
+ end
+
+ class << self
+ def puts_with_color(color_no, msg)
+ $stderr.puts("\e[#{color_no}m#{msg}\e[0m")
+ end
+
+ def verbose(msg, flag = true)
+ puts_with_color(34, msg) if flag
+ end
+ def info(msg)
+ puts_with_color(0, msg)
+ end
+ def success(msg)
+ puts_with_color(32, msg)
+ end
+ def error(msg)
+ puts_with_color(31, msg)
+ end
+
+ def sorted_commands(all = true)
+ cmd_hash = all_commands.dup
+ Thor::Util.thor_classes_in(self).each do |klass|
+ cmd_hash.update(klass.commands)
+ end
+ if order = self.const_get(:COMMAND_ORDER) rescue nil
+ result = order.map{|i| cmd_hash[i]}
+ result += (cmd_hash.keys - order).map{|i| cmd_hash[i]}
+ else
+ result = cmd_hash.values
+ end
+ if idx = result.index{|cmd| cmd.name == "help" }
+ h = result.delete_at(idx)
+ result << h
+ end
+ return result
+ end
+
+ def sorted_printable_commands(all = true, subcommand = false)
+ list = printable_commands(all, subcommand)
+ Thor::Util.thor_classes_in(self).each do |klass|
+ list += klass.printable_commands(false)
+ end
+ order = self.const_get(:COMMAND_ORDER) rescue nil
+ if order
+ orig = list
+ list = order.map do |ptn|
+ idx = orig.index{|t| t.first =~ /\b#{ptn}\b/}
+ raise "#{ptn} not found" unless idx
+ orig.delete_at(idx)
+ end
+ list += orig # add items not in COMMAND_ORDER
+ end
+ # # don't sort in alphabetical order
+ # list.sort! { |a, b| a[0] <=> b[0] }
+
+ # move help to the end of list
+ if idx = list.index{|t| t.first =~ /\bhelp\b/ }
+ h = list.delete_at(idx)
+ list << h
+ end
+ return list
+ end
+
+ # overwrite Thor.help method
+ def help(shell, subcommand = false)
+ if defined?(@package_name) && @package_name
+ shell.say "#{@package_name} commands:"
+ else
+ shell.say "Commands:"
+ end
+
+ shell.print_table(sorted_printable_commands(true, subcommand), :indent => 2, :truncate => true)
+ shell.say
+ class_options_help(shell)
+ end
+
+ # override Thor.command_help
+ def command_help(shell, command_name)
+ meth = normalize_command_name(command_name)
+ command = all_commands[meth]
+ handle_no_command_error(meth) unless command
+
+ shell.say "Usage:"
+ shell.say " #{banner(command)}"
+ shell.say
+ class_options_help(shell, nil => command.options.map { |_, o| o })
+ if command.long_description
+ shell.say "Description:"
+ shell.print_wrapped(command.long_description, :indent => 2)
+ else
+ shell.say command.description
+ end
+ end
+
end
end
end
end