lib/rubigen/scripts.rb in rubigen-1.4.0 vs lib/rubigen/scripts.rb in rubigen-1.5.0
- old
+ new
@@ -1,21 +1,23 @@
-require File.dirname(__FILE__) + '/options'
+require File.dirname(__FILE__) + '/options' unless Object.const_defined?("RubiGen") && RubiGen.const_defined?("Base")
module RubiGen
module Scripts
# Generator scripts handle command-line invocation. Each script
# responds to an invoke! class method which handles option parsing
# and generator invocation.
class Base
include Options
default_options :collision => :ask, :quiet => false
+ attr_reader :stdout
# Run the generator script. Takes an array of unparsed arguments
# and a hash of parsed arguments, takes the generator as an option
# or first remaining argument, and invokes the requested command.
def run(args = [], runtime_options = {})
+ @stdout = runtime_options[:stdout] || $stdout
begin
parse!(args.dup, runtime_options)
rescue OptionParser::InvalidOption => e
# Don't cry, script. Generators want what you think is invalid.
end
@@ -27,31 +29,36 @@
end
# Look up generator instance and invoke command on it.
RubiGen::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
rescue => e
- puts e
- puts " #{e.backtrace.join("\n ")}\n" if options[:backtrace]
- raise SystemExit
+ stdout.puts e
+ stdout.puts " #{e.backtrace.join("\n ")}\n" if options[:backtrace]
+ raise SystemExit unless options[:no_exit]
end
protected
# Override with your own script usage banner.
def banner
"Usage: #{$0} generator [options] [args]"
end
def usage_message
usage = "\nInstalled Generators\n"
- RubiGen::Base.sources.inject({}) do |mem, source|
+ RubiGen::Base.sources.inject([]) do |mem, source|
+ # Using an association list instead of a hash to preserve order,
+ # for aesthetic reasons more than anything else.
label = source.label.to_s.capitalize
- mem[label] ||= []
- mem[label] |= source.names(:visible)
+ pair = mem.assoc(label)
+ mem << (pair = [label, []]) if pair.nil?
+ pair[1] |= source.names(:visible)
mem
- end.each_pair do |label, names|
+ end.each do |label, names|
usage << " #{label}: #{names.join(', ')}\n" unless names.empty?
end
+ # TODO - extensible blurbs for rails/newgem/adhearsion etc
+ # e.g. for rails http://github.com/rails/rails/tree/daee6fd92ac16878f6806c3382a9e74592aa9656/railties/lib/rails_generator/scripts.rb#L50-74
usage << <<-end_blurb
More are available at http://rubigen.rubyforge.org/
end_blurb