def educate stream=$stdout
width
left = {}
@specs.each do |name, spec|
left[name] =
(spec[:short] && spec[:short] != :none ? "-#{spec[:short]}" : "") +
(spec[:short] && spec[:short] != :none ? ", " : "") + "--#{spec[:long]}" +
case spec[:type]
when :flag; ""
when :int; "=<i>"
when :ints; "=<i+>"
when :string; "=<s>"
when :strings; "=<s+>"
when :float; "=<f>"
when :floats; "=<f+>"
when :io; "=<filename/uri>"
when :ios; "=<filename/uri+>"
when :date; "=<date>"
when :dates; "=<date+>"
end +
(spec[:type] == :flag && spec[:default] ? ", --no-#{spec[:long]}" : "")
end
leftcol_width = left.values.map { |s| s.length }.max || 0
rightcol_start = leftcol_width + 6
unless @order.size > 0 && @order.first.first == :text
command_name = File.basename($0).gsub(/\.[^.]+$/, '')
stream.puts "Usage: #{command_name} #@usage\n" if @usage
stream.puts "#@synopsis\n" if @synopsis
stream.puts if @usage or @synopsis
stream.puts "#@version\n" if @version
stream.puts "Options:"
end
@order.each do |what, opt|
if what == :text
stream.puts wrap(opt)
next
end
spec = @specs[opt]
stream.printf " %-#{leftcol_width}s ", left[opt]
desc = spec[:desc] + begin
default_s = case spec[:default]
when $stdout; "<stdout>"
when $stdin; "<stdin>"
when $stderr; "<stderr>"
when Array
spec[:default].join(", ")
else
spec[:default].to_s
end
if spec[:default]
if spec[:desc] =~ /\.$/
" (Default: #{default_s})"
else
" (default: #{default_s})"
end
else
""
end
end
stream.puts wrap(desc, :width => width - rightcol_start - 1, :prefix => rightcol_start)
end
end