module Main class Usage < ::Array attribute 'chunkname' attribute 'upcase' attribute 'eos' def initialize opts={} self.fields=[] self.chunkname = lambda{|chunkname| chunkname.to_s.strip.upcase} self.upcase = true self.eos = "\n\n" if opts.has_key?(:upcase) or opts.has_key?('upcase') self.upcase = opts[:upcase] || opts['optcase'] end end def clear super ensure fields.clear end def delete_at key self[key] = nil end alias_method 'delete', 'delete_at' def self.default_synopsis main s = "#{ main.name }" main.parameters.each do |p| if p.type == :argument if p.required? s << " #{ p.name }" else s << " [#{ p.name }]" end end end main.parameters.each do |p| if p.type == :keyword if p.required? s << " #{ p.name }=#{ p.name }" else s << " [#{ p.name }=#{ p.name }]" end end end n = 0 main.parameters.each do |p| if p.type == :option if p.required? case p.argument when :required s << " --#{ p.name }=#{ p.name }" when :optional s << " --#{ p.name }=[#{ p.name }]" else s << " --#{ p.name }" end else n += 1 end end end if n > 0 s << " [options]+" end s end def self.default_usage main usage = new # name usage['name'] = if main.version? "#{ main.name } v#{ main.version }" else "#{ main.name }" end # synopsis usage['synopsis'] = main.synopsis # description usage['description'] = main.description if main.description? # parameters arguments = main.parameters.select{|p| p.type == :argument} keywords = main.parameters.select{|p| p.type == :keyword} options = main.parameters.select{|p| p.type == :option} environment = main.parameters.select{|p| p.type == :environment} help, nothelp = options.partition{|p| p.name == 'help'} options = nothelp + help parameters = arguments + keywords + options + environment s = parameters.map do |p| ps = '' ps << Util.columnize("* #{ p.synopsis }", :indent => 2, :width => 78) ps << "\n" if p.description? ps << Util.columnize(p.description, :indent => 6, :width => 78) ps << "\n" end ps end.join("\n") usage['parameters'] = s # author usage['author'] = main.author if main.author? usage end class << self alias_method "default", "default_usage" end def to_s s = '' each_pair do |key, value| up, down = key.to_s.upcase, key.to_s.downcase if value s << (upcase ? up : down) << "\n" s << Util.indent(Util.unindent(value.to_s), 2) s << eos end end s end end end