lib/shepherd/cli.rb in shepherd-0.3.0 vs lib/shepherd/cli.rb in shepherd-0.3.1

- old
+ new

@@ -1,100 +1,100 @@ require "trollop" -module Shepherd - - # Command Line Interface class - # - # === Usage - # - # module Shepherd - # Cli.new.run! - # end - # - # or - # - # Shepherd::Cli.new.run! - # - # === Exit statuses - # - # - *0* Everything went just fine :) - # - *1* User said ^C :] - # - *2* User wanted a UnknownCommand - # - *3* The database file was not found - # - *4* User wanted to init another sheep/project with the same name and/or path - # - *5* User wanted to init a project in a path that doesn't exist - # - *6* User wanted to see a sheep that was not inited - # - class Cli - - # Kinda self explanatory - class UnknownCommand < RuntimeError; end - - # A command which is about to be run - attr_accessor :command - - # Require *all* command files - # TODO: Is it possible to make it use autoload? It'd be cool! :) - Dir[File.join(File.dirname(__FILE__), "commands", "*.rb")].each do |all_command_files| - require all_command_files - end - - # Handle the commands list - # - # @return [Array] all available commands - COMMANDS = Command.constants.select { |c| Class === Command.const_get(c) } - - # Get a list of available commands to be printed. (Almost) every line is separated by new line mark - \n - # - # @return [String] list of all available commands - def commands_list - out = "" - # If there are no commands set - if COMMANDS.empty? - out << " ooops! commands are not here!" - else - # Get the longest command's name, so we can output it nice 'n' clean - # This '+ int' at the end is a distance (in spaces) from the longest - # command to descriptions - longest = COMMANDS.max_by(&:size).size + 8 - COMMANDS.each do |cmd| - # Calc, calc. - spaces = longest - cmd.size - # Check if there is a 'desc' method - desc = if eval "Command::#{cmd}.new.respond_to? 'desc'" - # If there is - execute it - eval "Command::#{cmd}.new.desc" - else - # If there is not - "---" - end - out << " " << cmd.downcase.to_s << " " * spaces << desc - # If this command is the last one, don't make a new line - unless cmd == COMMANDS.last - out << "\n" - end - end - end - out - end # commands_list:Method - - # Check if command really exists - # - # @return [Boolean] whether the command exists or not - def command_exists? - COMMANDS.include? @command - end - - # Rruns t'e Cli! - def run! - - # Nice, cool 'n' AWESOME --options parsing with Trollop[http://trollop.rubyforge.org/]! - # - # @return [Hash] array full of options - $opts = Trollop::options do - version "shepherd version #{Version::STRING}" - banner <<-EOB +module Shepherd + + # Command Line Interface class + # + # === Usage + # + # module Shepherd + # Cli.new.run! + # end + # + # or + # + # Shepherd::Cli.new.run! + # + # === Exit statuses + # + # - *0* Everything went just fine :) + # - *1* User said ^C :] + # - *2* User wanted a UnknownCommand + # - *3* The database file was not found + # - *4* User wanted to init another sheep/project with the same name and/or path + # - *5* User wanted to init a project in a path that doesn't exist + # - *6* User wanted to see a sheep that was not inited + # + class Cli + + # Kinda self explanatory + class UnknownCommand < RuntimeError; end + + # A command which is about to be run + attr_accessor :command + + # Require *all* command files + # TODO: Is it possible to make it use autoload? It'd be cool! :) + Dir[File.join(File.dirname(__FILE__), "commands", "*.rb")].each do |all_command_files| + require all_command_files + end + + # Handle the commands list + # + # @return [Array] all available commands + COMMANDS = Command.constants.select { |c| Class === Command.const_get(c) } + + # Get a list of available commands to be printed. (Almost) every line is separated by new line mark - \n + # + # @return [String] list of all available commands + def commands_list + out = "" + # If there are no commands set + if COMMANDS.empty? + out << " ooops! commands are not here!" + else + # Get the longest command's name, so we can output it nice 'n' clean + # This '+ int' at the end is a distance (in spaces) from the longest + # command to descriptions + longest = COMMANDS.max_by(&:size).size + 8 + COMMANDS.each do |cmd| + # Calc, calc. + spaces = longest - cmd.size + # Check if there is a 'desc' method + desc = if eval "Command::#{cmd}.new.respond_to? 'desc'" + # If there is - execute it + eval "Command::#{cmd}.new.desc" + else + # If there is not + "---" + end + out << " " << cmd.downcase.to_s << " " * spaces << desc + # If this command is the last one, don't make a new line + unless cmd == COMMANDS.last + out << "\n" + end + end + end + out + end # commands_list:Method + + # Check if command really exists + # + # @return [Boolean] whether the command exists or not + def command_exists? + COMMANDS.include? @command + end + + # Rruns t'e Cli! + def run! + + # Nice, cool 'n' AWESOME --options parsing with Trollop[http://trollop.rubyforge.org/]! + # + # @return [Hash] array full of options + $opts = Trollop::options do + version "shepherd version #{Version::STRING}" + banner <<-EOB usage: shep [options] <command> commands are: #{Cli.new.commands_list} @@ -102,42 +102,42 @@ shep <command> --help/-h for more info about specified command options are: EOB - opt :version, "show version and exit", :short => '-v' - opt :help, "show me and exit", :short => '-h' - - stop_on COMMANDS.collect { |e| e.downcase.to_s } - end - - # Get the command - @command = ARGV.shift.capitalize.to_sym - - begin - execute @command - exit 0 - rescue UnknownCommand => e - puts e.message - exit 2 - rescue Db::DatabaseNotFound => e - puts e.message - exit 3 - rescue Interrupt - puts "\n\n!# interrupted" - exit 1 - end - end # run!:Method - - # Executes a command - # - # @return [Object] command to execute - # @raise [UnknownCommand] if there is no such a command - def execute command - if command_exists? - eval "Command::#{command}.new.init" - else - raise UnknownCommand, "Error: unknown command '#{command.downcase.to_s}'.\nTry --help for help." - end - end # execute_command:Method - end # Cli:Class + opt :version, "show version and exit", :short => '-v' + opt :help, "show me and exit", :short => '-h' + + stop_on COMMANDS.collect { |e| e.downcase.to_s } + end + + # Get the command + @command = ARGV.shift.capitalize.to_sym + + begin + execute @command + exit 0 + rescue UnknownCommand => e + puts e.message + exit 2 + rescue Db::DatabaseNotFound => e + puts e.message + exit 3 + rescue Interrupt + puts "\n\n!# interrupted" + exit 1 + end + end # run!:Method + + # Executes a command + # + # @return [Object] command to execute + # @raise [UnknownCommand] if there is no such a command + def execute command + if command_exists? + eval "Command::#{command}.new.init" + else + raise UnknownCommand, "Error: unknown command '#{command.downcase.to_s}'.\nTry --help for help." + end + end # execute_command:Method + end # Cli:Class end # Shepherd:Module