__debug()
click to toggle source
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
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
def __initialize_text_formatting
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
end
__parse_command_line(argv)
click to toggle source
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
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
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
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
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
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
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
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
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
def get_arg
CommandLine::OptionParser::GET_ARGS
end
get_args()
click to toggle source
help()
click to toggle source
main()
click to toggle source
def main
@@child_class.class_eval %{ def main; end }
end
man()
click to toggle source
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
name()
click to toggle source
def name
File.basename(pathname)
end
opt()
click to toggle source
option(*args)
click to toggle source
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
}
@options << CommandLine::Option.new(*new_list)
end
options(*opts)
click to toggle source
def options(*opts)
opts.each { |opt| option(*[opt].flatten) }
end
pathname()
click to toggle source
def pathname
@@appname
end
required()
click to toggle source
def required
CommandLine::OptionParser::OPT_NOT_FOUND_BUT_REQUIRED
end
usage()
click to toggle source
def usage
" Usage: #{name} #{synopsis}"
end
use_replay(attribs = {})
click to toggle source
def use_replay(attribs = {})
@replay = true
@replay_file = attribs[:replay_file] || @replay_file
end