Class: CommandOptionParser

Inherits:
Object
  • Object
show all
Defined in:
lib/kwalify/util/option-parser.rb

Overview

ex.

## create parser
arg_none     = "hv"      # ex. -h -v
arg_required = "xf"      # ex. -x suffix -f filename
arg_optional = "i"       # ex. -i  (or -i10)
parser = CommandOptionParser.new(arg_none, arg_required, arg_optional)

## parse options
argv = %w[-h -v -f filename -i 10 aaa bbb]
options, properties = parser.parse(argv)
p options   #=> { ?h=>true, ?v=>true, ?f=>"filename", ?i=>true }
p argv      #=> ["10", "aaa", "bbb"]

## parse options #2
argv = %w[-hvx.txt -ffilename -i10 aaa bbb]
options, properties = parser.parse(argv)
p options   #=> { ?h=>true, ?v=>true, ?x=>".txt", ?f=>"filename", ?i=>10 }
p argv      #=> ["aaa", "bbb"]

## parse properties
argv = %w[-hi --index=10 --user-name=foo --help]
options, properties = parser.parse(argv)
p options     #=> {?h=>true, ?i=>true}
p properties  #=> {"index"=>"10", "user-name"=>"foo", "help"=>nil}

## parse properties with auto-convert
argv = %w[-hi --index=10 --user-name=foo --help]
options, properties = parser.parse(argv, true)
p options     #=> {?h=>true, ?i=>true}
p properties  #=> {:index=>10, :user_name=>foo, :help=>true}

## -a: unknown option.
argv = %w[-abc]
begin
   options, properties = parser.parse(argv)
rescue CommandOptionError => ex
   $stderr.puts ex.message     # -a: unknown option.
end

## -f: argument required.
argv = %w[-f]
begin
   options, properties = parser.parse(argv)
rescue CommandOptionError => ex
   $stderr.puts ex.message     # -f: argument required.
end

## --@prop=10: invalid property.
argv = %w[--@prop=10]
begin
   options, properties = parser.parse(argv)
rescue CommandOptionError => ex
   $stderr.puts ex.message     # --@prop=10: invalid property.
end

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(arg_none = nil, arg_required = nil, arg_optional = nil) ⇒ CommandOptionParser

arg_none: option string which takes no argument arg_required: option string which takes argument arg_otpional: option string which may takes argument optionally



92
93
94
95
96
# File 'lib/kwalify/util/option-parser.rb', line 92

def initialize(arg_none=nil, arg_required=nil, arg_optional=nil)
  @arg_none      = arg_none     || ""
  @arg_required  = arg_required || ""
  @arg_optional  = arg_optional || ""
end

Class Method Details

.to_value(str) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/kwalify/util/option-parser.rb', line 99

def self.to_value(str)
  case str
  when nil, "null", "nil"         ;   return nil
  when "true", "yes"              ;   return true
  when "false", "no"              ;   return false
  when /\A\d+\z/                  ;   return str.to_i
  when /\A\d+\.\d+\z/             ;   return str.to_f
  when /\/(.*)\//                 ;   return Regexp.new($1)
  when /\A'.*'\z/, /\A".*"\z/     ;   return eval(str)
  else                            ;   return str
  end
end

Instance Method Details

#parse(argv, auto_convert = false) ⇒ Object

argv

array of string

auto_convert

if true, convert properties value to int, boolean, string, regexp, … (default false)



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/kwalify/util/option-parser.rb', line 115

def parse(argv, auto_convert=false)
  options = {}
  properties = {}
  while argv[0] && argv[0][0] == ?-
    optstr = argv.shift
    optstr = optstr[1, optstr.length-1]
    #
    if optstr[0] == ?-    ## property
      unless optstr =~ /\A\-([-\w]+)(?:=(.*))?/
        raise CommandOptionError.new(optstr, :invalid_property)
      end
      prop_name = $1;  prop_value = $2
      if auto_convert
        key   = prop_name.gsub(/-/, '_').intern
        value = prop_value.nil? ? true : CommandOptionParser.to_value(prop_value)
        properties[key] = value
      else
        properties[prop_name] = prop_value
      end
      #
    else                  ## options
      while optstr && !optstr.empty?
        optchar = optstr[0]
        optstr[0,1] = ""
        #puts "*** debug: optchar=#{optchar.chr}, optstr=#{optstr.inspect}"
        if @arg_none.include?(optchar)
          options[optchar] = true
        elsif @arg_required.include?(optchar)
          arg = optstr.empty? ? argv.shift : optstr
          raise CommandOptionError.new(optchar.chr, :no_argument) unless arg
          options[optchar] = arg
          optstr = nil
        elsif @arg_optional.include?(optchar)
          arg = optstr.empty? ? true : optstr
          options[optchar] = arg
          optstr = nil
        else
          raise CommandOptionError.new(optchar.chr, :unknown_option)
        end
      end
    end
    #
  end  # end of while

  return options, properties
end