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