lib/ggem/cli.rb in ggem-1.7.0 vs lib/ggem/cli.rb in ggem-1.8.0

- old
+ new

@@ -1,106 +1,63 @@ -require 'ggem' require 'ggem/version' +require 'ggem/cli/clirb' +require 'ggem/cli/commands' module GGem class CLI - def self.run(*args) - self.new.run(*args) + COMMANDS = CommandSet.new{ |unknown| InvalidCommand.new(unknown) }.tap do |c| + c.add(GenerateCommand, 'generate', 'g') + c.add(BuildCommand, 'build', 'b') + c.add(InstallCommand, 'install', 'i') + c.add(PushCommand, 'push', 'p') + c.add(TagCommand, 'tag', 't') + c.add(ReleaseCommand, 'release', 'r') end - def initialize - @cli = CLIRB.new do - option 'debug', 'run in debug mode' - end + def self.run(args) + self.new.run(args) end - def run(*args) - begin - # parse manually in the case that parsing fails before the debug arg - debug_mode ||= args.include?('-d') || args.include?('--debug') - @cli.parse!(args) - raise CLIRB::Error, "please provide a gem name" if @cli.args.size < 1 + def initialize(kernel = nil, stdout = nil, stderr = nil) + @kernel = kernel || Kernel + @stdout = stdout || $stdout + @stderr = stderr || $stderr + end - path = GGem::Gem.new(Dir.pwd, *args).save!.path - puts "created gem and initialized git repo in #{path}" + def run(args) + begin + cmd_name = args.shift + cmd = COMMANDS[cmd_name] + cmd.run(args) rescue CLIRB::HelpExit - puts help + @stdout.puts cmd.help rescue CLIRB::VersionExit - puts GGem::VERSION - rescue CLIRB::Error => exception - puts "#{exception.message}\n\n" - puts debug_mode ? exception.backtrace.join("\n") : help - exit(1) - rescue Exception => exception - puts "#{exception.class}: #{exception.message}" - puts exception.backtrace.join("\n") if debug_mode - exit(1) + @stdout.puts GGem::VERSION + rescue CLIRB::Error, ArgumentError, InvalidCommandError => exception + display_debug(exception) + @stderr.puts "#{exception.message}\n\n" + @stdout.puts cmd.help + @kernel.exit 1 + rescue CommandExitError + @kernel.exit 1 + rescue StandardError => exception + @stderr.puts "#{exception.class}: #{exception.message}" + @stderr.puts exception.backtrace.join("\n") + @kernel.exit 1 end - exit(0) + @kernel.exit 0 end - def help - "Usage: ggem GEM-NAME\n\n"\ - "Options:"\ - "#{@cli}" - end + private - end - - class CLIRB # Version 1.0.0, https://github.com/redding/cli.rb - Error = Class.new(RuntimeError); - HelpExit = Class.new(RuntimeError); VersionExit = Class.new(RuntimeError) - attr_reader :argv, :args, :opts, :data - - def initialize(&block) - @options = []; instance_eval(&block) if block - require 'optparse' - @data, @args, @opts = [], [], {}; @parser = OptionParser.new do |p| - p.banner = ''; @options.each do |o| - @opts[o.name] = o.value; p.on(*o.parser_args){ |v| @opts[o.name] = v } - end - p.on_tail('--version', ''){ |v| raise VersionExit, v.to_s } - p.on_tail('--help', ''){ |v| raise HelpExit, v.to_s } + def display_debug(exception) + if ENV['DEBUG'] + @stderr.puts "#{exception.class}: #{exception.message}" + @stderr.puts exception.backtrace.join("\n") end end - def option(*args); @options << Option.new(*args); end - def parse!(argv) - @args = (argv || []).dup.tap do |args_list| - begin; @parser.parse!(args_list) - rescue OptionParser::ParseError => err; raise Error, err.message; end - end; @data = @args + [@opts] - end - def to_s; @parser.to_s; end - def inspect - "#<#{self.class}:#{'0x0%x' % (object_id << 1)} @data=#{@data.inspect}>" - end - - class Option - attr_reader :name, :opt_name, :desc, :abbrev, :value, :klass, :parser_args - - def initialize(name, *args) - settings, @desc = args.last.kind_of?(::Hash) ? args.pop : {}, args.pop || '' - @name, @opt_name, @abbrev = parse_name_values(name, settings[:abbrev]) - @value, @klass = gvalinfo(settings[:value]) - @parser_args = if [TrueClass, FalseClass, NilClass].include?(@klass) - ["-#{@abbrev}", "--[no-]#{@opt_name}", @desc] - else - ["-#{@abbrev}", "--#{@opt_name} #{@opt_name.upcase}", @klass, @desc] - end - end - - private - - def parse_name_values(name, custom_abbrev) - [ (processed_name = name.to_s.strip.downcase), processed_name.gsub('_', '-'), - custom_abbrev || processed_name.gsub(/[^a-z]/, '').chars.first || 'a' - ] - end - def gvalinfo(v); v.kind_of?(Class) ? [nil,gklass(v)] : [v,gklass(v.class)]; end - def gklass(k); k == Fixnum ? Integer : k; end - end end end