Parent

CommandLine::Application

Constants

DEFAULT_BODY_INDENT
DEFAULT_CONSOLE_WIDTH

TODO: Consolidate these with OptionParser - put in command line

MIN_CONSOLE_WIDTH

Attributes

args[R]
argv[R]

Public Class Methods

__set_auto_run() click to toggle source
# File lib/commandline/application.rb, line 269
def self.__set_auto_run
  at_exit { @@child_class.run }
end
inherited(child_class) click to toggle source
# File lib/commandline/application.rb, line 261
def self.inherited(child_class)
  @@appname = caller[0][/.*:/][0..-2]
  @@child_class = child_class
  if @@appname == $0
    __set_auto_run
  end
end
new() click to toggle source
# File lib/commandline/application.rb, line 41
def initialize
  @synopsis    = ""
  @arg_arity   = [0,0]
  @options     = []
  @arg_names   = []
  @args        = []
  @replay      = false
  @replay_file = ".replay"

  __initialize_text_formatting

  # Call the child usurped initialize
  __child_initialize if 
    self.class.private_instance_methods(false).include?("__child_initialize")

  @option_parser ||= CommandLine::OptionParser.new(@options)
end
run(argv=ARGV) click to toggle source
# File lib/commandline/application.rb, line 238
def self.run(argv=ARGV)
  # Usurp an existing initialize so ours can be called first.
  # We rename it __child_initialize and call it from initialize.
  if self.private_instance_methods(false).include?("initialize")
    $VERBOSE, verbose = nil, $VERBOSE
    self.class_eval {
      alias :__child_initialize :initialize
      remove_method :initialize
    }
    $VERBOSE = verbose
  end
  obj = self.new
  obj.__parse_command_line(argv)
  obj.main

  #alias :user_init :initialize
  #@@child_class.new.main if ($0 == @@appname)
  obj
  rescue => err
    puts "ERROR: #{err}"
    exit(-1)
end

Public Instance Methods

__debug() click to toggle source
# File lib/commandline/application.rb, line 405
def __debug
   {
     :names           => %(--debug -d),
     :arity           => [0,0],
     :opt_description => "Sets debug to true.",
     :arg_description => "",
     :opt_found       => lambda { $DEBUG = true }
   }
end
__help() click to toggle source
# File lib/commandline/application.rb, line 364
def __help
   {
     :names           => %(--help -h),
     :arity           => [0,0],
     :opt_description => "Displays help page.",
     :arg_description => "",
     :opt_found       => lambda { puts man; exit },
     :opt_not_found   => false
   }
end
__initialize_text_formatting() click to toggle source
# File lib/commandline/application.rb, line 334
def __initialize_text_formatting
  #
  # Formatting defaults
  #
  console_width = ENV["COLUMNS"]
  @columns = 
    if console_width.nil?
      DEFAULT_CONSOLE_WIDTH
    elsif console_width < MIN_CONSOLE_WIDTH
      console_width
    else
      console_width - DEFAULT_BODY_INDENT
    end
  @body_indent   = DEFAULT_BODY_INDENT
  @tag_paragraph = false
  @order         = :index  # | :alpha
end
__parse_command_line(argv) click to toggle source
# File lib/commandline/application.rb, line 297
def __parse_command_line(argv)
  @argv = argv
  if @replay && File.exist?(@replay_file) && !@argv.grep("-r").empty?
    __restore_argv
  elsif @argv.empty? && @arg_arity[0] != 0
    puts usage
    exit(0)
  end

  begin
    @option_data = @option_parser.parse(@argv)
    @args = @option_data.args
  rescue => err
    puts err
    puts
    puts usage
    exit(-1)
  end

  __validate_args(@option_data.args)
  @arg_names.each_with_index { |name, idx|
    instance_variable_set("@#{name}", @option_data.args[idx])
  }
  
  __save_argv
end
__restore_argv() click to toggle source
# File lib/commandline/application.rb, line 292
def __restore_argv
  @argv = File.read(@replay_file).gsub(/\n/, "").split
  raise "Bad @argv" unless @argv.kind_of?(Array)
end
__save_argv() click to toggle source
# File lib/commandline/application.rb, line 279
def __save_argv
  return unless @replay

  line = 0
  File.open(@replay_file, "w") { |f|
    @argv.each { |arg|
      f.puts "\n" if arg[0] == -- && line != 0
      f.print " #{arg}"
      line += 1
    }
  }
end
__validate_arg_arity(arity) click to toggle source
# File lib/commandline/application.rb, line 324
def __validate_arg_arity(arity)
  min, max = *arity
  raise(InvalidArgumentArityError, "Minimum argument arity '#{min}' must be "+
    "greater than or equal to 0.") unless min >= 0
  raise(InvalidArgumentArityError, "Maximum argument arity '#{max}' must be "+
    "greater than or equal to -1.") if max < -1
  raise(InvalidArgumentArityError, "Maximum argument arity '#{max}' must be "+
    "greater than minimum arg_arity '#{min}'.") if max < min && max != -1
end
__validate_args(od_args) click to toggle source
# File lib/commandline/application.rb, line 352
def __validate_args(od_args)
  size = od_args.size
  min, max = @arg_arity
  max = 1.0/0.0 if -1 == max
  raise(ArgumentError,
    "Missing expected arguments. Found #{size} but expected #{min}. "+
    "#{od_args.inspect}\n"+
    "#{usage}") if size < min
  raise(ArgumentError, "Too many arguments. Found #{size} but "+
    "expected #{max}.\n#{usage}") if size > max
end
__verbose() click to toggle source
# File lib/commandline/application.rb, line 375
def __verbose
   {
     :names           => %(--verbose -v),
     :arity           => [0,0],
     :opt_description => "Sets verbosity level. Subsequent "+
                         "flags increase verbosity level",
     :arg_description => "",
     :opt_found       => lambda { @verbose ||= -1; @verbose += 1 },
     :opt_not_found   => nil
   }
end
__version() click to toggle source
# File lib/commandline/application.rb, line 387
def __version
   {
     :names           => %(--version -V),
     :arity           => [0,0],
     :opt_description => "Displays application version.",
     :arg_description => "",
     :opt_found       => lambda { 
                           begin 
                             puts "#{name} - Version: #{version}"
                           rescue 
                             puts "No version specified" 
                           end; 
                           exit 
                         },
     :opt_not_found   => nil
   }
end
append_arg() click to toggle source
# File lib/commandline/application.rb, line 230
def append_arg
  CommandLine::OptionParser::GET_ARG_ARRAY
end
expected_args(*exp_args) click to toggle source

expected_args :cmd Now, what to do if command line has more args than expected app --app-option cmd --cmd-option arg-for-cmd

# File lib/commandline/application.rb, line 134
def expected_args(*exp_args)
  @arg_names = []
  case exp_args.size
  when 0 then @arg_arity = [0,0]
  when 1
    case exp_args[0]
    when Fixnum 
      v = exp_args[0]
      @arg_arity = [v,v]
    when Symbol
      @arg_names = exp_args
      @arg_arity = [1,1]
    when Array
      v = exp_args[0]
      __validate_arg_arity(v)
      @arg_arity = v
    else 
      raise(InvalidArgumentArityError, 
        "Args must be a Fixnum or Array: #{exp_args[0].inspect}.")
    end
  else
    @arg_names = exp_args
    size = exp_args.size
    @arg_arity = [size, size]
  end
end
get_arg() click to toggle source
# File lib/commandline/application.rb, line 225
def get_arg
  CommandLine::OptionParser::GET_ARGS
end
Also aliased as: get_args
get_args() click to toggle source
Alias for: get_arg
help() click to toggle source
Alias for: man
main() click to toggle source
# File lib/commandline/application.rb, line 273
def main
  #raise(MissingMainError, "Method #main must be defined in class #{@@child_class}.")
  @@child_class.class_eval %{ def main; end }
  #self.class_eval %{ def main; end }
end
man() click to toggle source
# File lib/commandline/application.rb, line 170
def man
  require 'text/format'
  f = Text::Format.new
  f = Text::Format.new
  f.columns = @columns
  f.first_indent  = 4
  f.body_indent   = @body_indent
  f.tag_paragraph = false

  s = []
  s << ["NAME\n"]

  nm = "#{short_description}".empty? ? name : "#{name} - #{short_description}"
  s << f.format(nm)

  sn = "#{synopsis}".empty? ? "" : "#{name} #{synopsis}"
  unless sn.empty?
    s << "SYNOPSIS\n"
    s << f.format(sn)
  end

  dc = "#{long_description}"
  unless dc.empty?
    s << "DESCRIPTION\n"
    s << f.format(dc)
  end

  op = option_parser.to_s
  unless op.empty?
    s << option_parser.to_s
  end

  ar = "#{author}"
  unless ar.empty?
    s << "AUTHOR:  #{ar}"
  end


  ct = "COPYRIGHT (c) #{copyright}"
  unless "#{copyright}".empty?
    s << ct
  end

  s.join("\n")
end
Also aliased as: help
name() click to toggle source
# File lib/commandline/application.rb, line 217
def name
  File.basename(pathname)
end
opt() click to toggle source

Alternative for @"">option_data, but with symbols

# File lib/commandline/application.rb, line 81
def opt
  @option_data
end
option(*args) click to toggle source
# File lib/commandline/application.rb, line 63
def option(*args)
  @options ||= []
  new_list = []
  args.each { |arg|
    new_list << 
    case arg
      when :help    then __help
      when :debug   then __debug
      when :verbose then __verbose
      when :version then __version
      else arg
    end
  }
  #p new_list
  @options << CommandLine::Option.new(*new_list)
end
options(*opts) click to toggle source
# File lib/commandline/application.rb, line 59
def options(*opts)
  opts.each { |opt| option(*[opt].flatten) }
end
pathname() click to toggle source
# File lib/commandline/application.rb, line 221
def pathname
  @@appname
end
required() click to toggle source
# File lib/commandline/application.rb, line 234
def required
  CommandLine::OptionParser::OPT_NOT_FOUND_BUT_REQUIRED
end
usage() click to toggle source
# File lib/commandline/application.rb, line 166
def usage
  " Usage: #{name} #{synopsis}"
end
use_replay(attribs = {}) click to toggle source
# File lib/commandline/application.rb, line 161
def use_replay(attribs = {})
  @replay = true
  @replay_file = attribs[:replay_file] || @replay_file
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.