class ArgsParser::Parser

Attributes

aliases[R]
argv[R]
params[R]

Public Class Methods

new(config, &block) click to toggle source
# File lib/args_parser/parser.rb, line 11
def initialize(config, &block)
  raise ArgumentError, 'initialize block was not given' unless block_given?

  @config = config
  @argv = []
  @params = Hash.new{|h,k|
    h[k] = {
      :default => nil,
      :description => nil,
      :value => nil,
      :alias => nil,
      :index => -1
    }
  }
  @aliases = {}
  @filter = Filter.new
  @validator = Validator.new
  @ons = []

  filter do |v|
    (v.kind_of? String and v =~ /^-?\d+$/) ? v.to_i : v
  end
  filter do |v|
    (v.kind_of? String and v =~ /^-?\d+\.\d+$/) ? v.to_f : v
  end
  on_filter_error do |err, name, value|
    raise err
  end
  on_validate_error do |err, name, value|
    STDERR.puts "Error: #{err.message} (--#{name} #{value})"
    exit 1
  end

  instance_eval &block
end

Public Instance Methods

[](key) click to toggle source
# File lib/args_parser/parser.rb, line 125
def [](key)
  params[key.to_sym][:value] || default(key)
end
[]=(key, value) click to toggle source
# File lib/args_parser/parser.rb, line 129
def []=(key, value)
  params[key.to_sym][:value] = value
end
args() click to toggle source
# File lib/args_parser/parser.rb, line 98
def args
  params.keys
end
first() click to toggle source
# File lib/args_parser/parser.rb, line 7
def first
  argv.first
end
has_option?(*opts) click to toggle source
# File lib/args_parser/parser.rb, line 133
def has_option?(*opts)
  !opts.flatten.find{|i| self[i] != true}
end
has_param?(*params) click to toggle source
# File lib/args_parser/parser.rb, line 137
def has_param?(*params)
  !params.flatten.find{|i| self[i] == nil or self[i] == true }
end
help() click to toggle source
# File lib/args_parser/parser.rb, line 149
def help
  params_ = Array.new
  params.each do |k,v|
    v[:name] = k
    params_.push v
  end
  params_ = params_.reject{|i| i[:index] < 0 }.sort{|a,b| a[:index] <=> b[:index] }

  len = params_.map{|i|
    (i[:alias] ?
     " -#{i[:name]} (-#{i[:alias]})" :
     " -#{i[:name]}").size
  }.max

  "options:\n" + params_.map{|i|
    line = (i[:alias] ?
            " -#{i[:name]} (-#{i[:alias]})" :
            " -#{i[:name]}").ljust(len+2)
    line += i[:description].to_s
    line += " : default - #{default i[:name]}" if i[:default]
    line
  }.join("\n")
end
inspect() click to toggle source
# File lib/args_parser/parser.rb, line 141
def inspect
  h = Hash.new
  params.each do |k,v|
    h[k] = v[:value]
  end
  h.inspect
end
parse(argv) click to toggle source
# File lib/args_parser/parser.rb, line 102
def parse(argv)
  send "parse_style_#{@config[:style]}", argv
  params.each do |name, param|
    next if [nil, true].include? param[:value]
    begin
      param[:value] = @filter.filter name, param[:value]
    rescue => e
      on_filter_error e, name, param[:value]
    end
    begin
      msg = @validator.validate name, param[:value]
    rescue => e
      on_validate_error e, name, param[:value]
    end
    if msg
      on_validate_error ValidationError.new(msg), name, param[:value]
    end
  end
  params.keys.each do |name|
    on name if has_option? name or has_param? name
  end
end
parse_style_default(argv) click to toggle source
# File lib/args_parser/styles/default.rb, line 5
def parse_style_default(argv)
  k = nil
  is_key = /^-+([^-\s]+)$/
  argv.each_with_index do |arg, index|
    unless k
      if arg =~ is_key
        k = arg.scan(is_key)[0][0].strip.to_sym
        k = aliases[k]  if aliases[k]
      else
        @argv.push arg
      end
    else
      if arg =~ is_key
        params[k][:value] = true
        k = arg.scan(is_key)[0][0].strip.to_sym
        k = aliases[k]  if aliases[k]
      else
        params[k][:value] = arg
        k = nil
      end
    end
  end
  if k
    params[k][:value] = true
  end
end
parse_style_equal(argv) click to toggle source
# File lib/args_parser/styles/equal.rb, line 5
def parse_style_equal(argv)
  on_validate_error do |err, name, value|
    STDERR.puts "Error: #{err.message} (--#{name}=#{value})"
    exit 1
  end

  is_option = /^-+([^-=\s]+)$/
  is_param = /^-+([^-=\s]+)=(.+)$/
  argv.each_with_index do |arg, i|
    if arg =~ is_option
      k,v = arg.scan(is_option)[0][0], true
    elsif arg =~ is_param
      k,v = arg.scan(is_param)[0]
    else
      @argv.push arg
    end
    if k and v
      k = k.strip.to_sym
      k = aliases[k] if aliases[k]
      params[k][:value] = v
    end
  end
end

Private Instance Methods

arg(name, description, opts={}) click to toggle source
# File lib/args_parser/parser.rb, line 48
def arg(name, description, opts={})
  name = name.to_sym
  params[name][:default] = opts[:default]
  params[name][:description] = description
  params[name][:index] = params.keys.size
  params[name][:alias] = opts[:alias]
  aliases[opts[:alias]] = name if opts[:alias]
end
default(key) click to toggle source
# File lib/args_parser/parser.rb, line 92
def default(key)
  d = params[key.to_sym][:default]
  d.kind_of?(Proc) ? d.call : d
end
filter(name=nil, &block) click to toggle source
# File lib/args_parser/parser.rb, line 57
def filter(name=nil, &block)
  @filter.add name, block if block_given?
end
on(name, &block) click to toggle source
# File lib/args_parser/parser.rb, line 81
def on(name, &block)
  name = name.to_sym
  if block_given?
    @ons.push :name => name, :callback => block
  else
    @ons.each do |event|
      event[:callback].call(self[name]) if event[:name] == name
    end
  end
end
on_filter_error(err=nil, name=nil, value=nil, &block) click to toggle source
# File lib/args_parser/parser.rb, line 61
def on_filter_error(err=nil, name=nil, value=nil, &block)
  if block_given?
    @on_filter_error = block
  elsif @on_filter_error.kind_of? Proc
    @on_filter_error.call(err, name, value)
  end
end
on_validate_error(err=nil, name=nil, value=nil, &block) click to toggle source
# File lib/args_parser/parser.rb, line 73
def on_validate_error(err=nil, name=nil, value=nil, &block)
  if block_given?
    @on_validate_error = block
  elsif @on_validate_error.kind_of? Proc
    @on_validate_error.call(err, name, value)
  end
end
validate(name, message, &block) click to toggle source
# File lib/args_parser/parser.rb, line 69
def validate(name, message, &block)
  @validator.add name, message, block if block_given?
end