Fix up Rubinius specific library specs.
[rbx.git] / lib / optparse.rb
blob4c14112cbf0395b7dd04b142387f61008b4526dc
2 # optparse.rb - command-line option analysis with the OptionParser class.
3
4 # Author:: Nobu Nakada
5 # Documentation:: Nobu Nakada and Gavin Sinclair.
7 # See OptionParser for documentation. 
11 # == Developer Documentation (not for RDoc output) 
12
13 # === Class tree
15 # - OptionParser:: front end
16 # - OptionParser::Switch:: each switches
17 # - OptionParser::List:: options list
18 # - OptionParser::ParseError:: errors on parsing
19 #   - OptionParser::AmbiguousOption
20 #   - OptionParser::NeedlessArgument
21 #   - OptionParser::MissingArgument
22 #   - OptionParser::InvalidOption
23 #   - OptionParser::InvalidArgument
24 #     - OptionParser::AmbiguousArgument
26 # === Object relationship diagram
28 #   +--------------+
29 #   | OptionParser |<>-----+
30 #   +--------------+       |                      +--------+
31 #                          |                    ,-| Switch |
32 #        on_head -------->+---------------+    /  +--------+
33 #        accept/reject -->| List          |<|>-
34 #                         |               |<|>-  +----------+
35 #        on ------------->+---------------+    `-| argument |
36 #                           :           :        |  class   |
37 #                         +---------------+      |==========|
38 #        on_tail -------->|               |      |pattern   |
39 #                         +---------------+      |----------|
40 #   OptionParser.accept ->| DefaultList   |      |converter |
41 #                reject   |(shared between|      +----------+
42 #                         | all instances)|
43 #                         +---------------+
45 # == OptionParser
47 # === Introduction
49 # OptionParser is a class for command-line option analysis.  It is much more
50 # advanced, yet also easier to use, than GetoptLong, and is a more Ruby-oriented
51 # solution.
53 # === Features
54
55 # 1. The argument specification and the code to handle it are written in the
56 #    same place.
57 # 2. It can output an option summary; you don't need to maintain this string
58 #    separately.
59 # 3. Optional and mandatory arguments are specified very gracefully.
60 # 4. Arguments can be automatically converted to a specified class.
61 # 5. Arguments can be restricted to a certain set.
63 # All of these features are demonstrated in the examples below.
65 # === Minimal example
67 #   require 'optparse'
69 #   options = {}
70 #   OptionParser.new do |opts|
71 #     opts.banner = "Usage: example.rb [options]"
73 #     opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
74 #       options[:verbose] = v
75 #     end
76 #   end.parse!
78 #   p options
79 #   p ARGV
81 # === Complete example
83 # The following example is a complete Ruby program.  You can run it and see the
84 # effect of specifying various options.  This is probably the best way to learn
85 # the features of +optparse+.
87 #   require 'optparse'
88 #   require 'optparse/time'
89 #   require 'ostruct'
90 #   require 'pp'
91 #   
92 #   class OptparseExample
93 #   
94 #     CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
95 #     CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
96 #   
97 #     #
98 #     # Return a structure describing the options.
99 #     #
100 #     def self.parse(args)
101 #       # The options specified on the command line will be collected in *options*.
102 #       # We set default values here.
103 #       options = OpenStruct.new
104 #       options.library = []
105 #       options.inplace = false
106 #       options.encoding = "utf8"
107 #       options.transfer_type = :auto
108 #       options.verbose = false
109 #       
110 #       opts = OptionParser.new do |opts|
111 #         opts.banner = "Usage: example.rb [options]"
112 #       
113 #         opts.separator ""
114 #         opts.separator "Specific options:"
115 #       
116 #         # Mandatory argument.
117 #         opts.on("-r", "--require LIBRARY",
118 #                 "Require the LIBRARY before executing your script") do |lib|
119 #           options.library << lib
120 #         end
121 #       
122 #         # Optional argument; multi-line description.
123 #         opts.on("-i", "--inplace [EXTENSION]",
124 #                 "Edit ARGV files in place",
125 #                 "  (make backup if EXTENSION supplied)") do |ext|
126 #           options.inplace = true
127 #           options.extension = ext || ''
128 #           options.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
129 #         end
130 #       
131 #         # Cast 'delay' argument to a Float.
132 #         opts.on("--delay N", Float, "Delay N seconds before executing") do |n|
133 #           options.delay = n
134 #         end
135 #       
136 #         # Cast 'time' argument to a Time object.
137 #         opts.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
138 #           options.time = time
139 #         end
140 #       
141 #         # Cast to octal integer.
142 #         opts.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
143 #                 "Specify record separator (default \\0)") do |rs|
144 #           options.record_separator = rs
145 #         end
146 #       
147 #         # List of arguments.
148 #         opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
149 #           options.list = list
150 #         end
151 #       
152 #         # Keyword completion.  We are specifying a specific set of arguments (CODES
153 #         # and CODE_ALIASES - notice the latter is a Hash), and the user may provide
154 #         # the shortest unambiguous text.
155 #         code_list = (CODE_ALIASES.keys + CODES).join(',')
156 #         opts.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
157 #                 "  (#{code_list})") do |encoding|
158 #           options.encoding = encoding
159 #         end
160 #       
161 #         # Optional argument with keyword completion.
162 #         opts.on("--type [TYPE]", [:text, :binary, :auto],
163 #                 "Select transfer type (text, binary, auto)") do |t|
164 #           options.transfer_type = t
165 #         end
166 #       
167 #         # Boolean switch.
168 #         opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
169 #           options.verbose = v
170 #         end
171 #       
172 #         opts.separator ""
173 #         opts.separator "Common options:"
174 #       
175 #         # No argument, shows at tail.  This will print an options summary.
176 #         # Try it and see!
177 #         opts.on_tail("-h", "--help", "Show this message") do
178 #           puts opts
179 #           exit
180 #         end
181 #       
182 #         # Another typical switch to print the version.
183 #         opts.on_tail("--version", "Show version") do
184 #           puts OptionParser::Version.join('.')
185 #           exit
186 #         end
187 #       end
188 #       
189 #       opts.parse!(args)
190 #       options
191 #     end  # parse()
192 #   
193 #   end  # class OptparseExample
194 #   
195 #   options = OptparseExample.parse(ARGV)
196 #   pp options
198 # === Further documentation
200 # The above examples should be enough to learn how to use this class.  If you
201 # have any questions, email me (gsinclair@soyabean.com.au) and I will update
202 # this document.
204 class OptionParser
205   # :stopdoc:
206   RCSID = %w$Id: optparse.rb 11798 2007-02-20 06:53:16Z knu $[1..-1].each {|s| s.freeze}.freeze
207   Version = (RCSID[1].split('.').collect {|s| s.to_i}.extend(Comparable).freeze if RCSID[1])
208   LastModified = (Time.gm(*RCSID[2, 2].join('-').scan(/\d+/).collect {|s| s.to_i}) if RCSID[2])
209   Release = RCSID[2]
211   NoArgument = [NO_ARGUMENT = :NONE, nil].freeze
212   RequiredArgument = [REQUIRED_ARGUMENT = :REQUIRED, true].freeze
213   OptionalArgument = [OPTIONAL_ARGUMENT = :OPTIONAL, false].freeze
214   # :startdoc:
216   #
217   # Keyword completion module.  This allows partial arguments to be specified
218   # and resolved against a list of acceptable values.
219   #
220   module Completion
221     def complete(key, icase = false, pat = nil)
222       pat ||= Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'),
223                          icase)
224       canon, sw, k, v, cn = nil
225       candidates = []
226       each do |k, *v|
227         (if Regexp === k
228            kn = nil
229            k === key
230          else
231            kn = defined?(k.id2name) ? k.id2name : k
232            pat === kn
233          end) or next
234         v << k if v.empty?
235         candidates << [k, v, kn]
236       end
237       candidates = candidates.sort_by {|k, v, kn| kn.size}
238       if candidates.size == 1
239         canon, sw, * = candidates[0]
240       elsif candidates.size > 1
241         canon, sw, cn = candidates.shift
242         candidates.each do |k, v, kn|
243           next if sw == v
244           if String === cn and String === kn
245             if cn.rindex(kn, 0)
246               canon, sw, cn = k, v, kn
247               next
248             elsif kn.rindex(cn, 0)
249               next
250             end
251           end
252           throw :ambiguous, key
253         end
254       end
255       if canon
256         block_given? or return key, *sw
257         yield(key, *sw)
258       end
259     end
261     def convert(opt = nil, val = nil, *)
262       val
263     end
264   end
267   #
268   # Map from option/keyword string to object with completion.
269   #
270   class OptionMap < Hash
271     include Completion
272   end
275   #
276   # Individual switch class.  Not important to the user.
277   #
278   # Defined within Switch are several Switch-derived classes: NoArgument,
279   # RequiredArgument, etc. 
280   #
281   class Switch
282     attr_reader :pattern, :conv, :short, :long, :arg, :desc, :block
284     #
285     # Guesses argument style from +arg+.  Returns corresponding
286     # OptionParser::Switch class (OptionalArgument, etc.).
287     #
288     def self.guess(arg)
289       case arg
290       when ""
291         t = self
292       when /\A=?\[/
293         t = Switch::OptionalArgument
294       when /\A\s+\[/
295         t = Switch::PlacedArgument
296       else
297         t = Switch::RequiredArgument
298       end
299       self >= t or incompatible_argument_styles(arg, t)
300       t
301     end
303     def self.incompatible_argument_styles(arg, t)
304       raise ArgumentError, "#{arg}: incompatible argument styles\n  #{self}, #{t}"
305     end
307     def self.pattern
308       NilClass
309     end
311     def initialize(pattern = nil, conv = nil,
312                    short = nil, long = nil, arg = nil,
313                    desc = ([] if short or long), block = Proc.new)
314       raise if Array === pattern
315       @pattern, @conv, @short, @long, @arg, @desc, @block =
316         pattern, conv, short, long, arg, desc, block
317     end
319     #
320     # Parses +arg+ and returns rest of +arg+ and matched portion to the
321     # argument pattern. Yields when the pattern doesn't match substring.
322     #
323     def parse_arg(arg)
324       pattern or return nil, arg
325       unless m = pattern.match(arg)
326         yield(InvalidArgument, arg)
327         return arg, nil
328       end
329       if String === m
330         m = [s = m]
331       else
332         m = m.to_a
333         s = m[0]
334         return nil, m unless String === s
335       end
336       raise InvalidArgument, arg unless arg.rindex(s, 0)
337       return nil, m if s.length == arg.length
338       yield(InvalidArgument, arg) # didn't match whole arg
339       return arg[s.length..-1], m
340     end
341     private :parse_arg
343     #
344     # Parses argument, converts and returns +arg+, +block+ and result of
345     # conversion. Yields at semi-error condition instead of raising an
346     # exception.
347     #
348     def conv_arg(arg, val = nil)
349       if conv
350         val = conv.call(*val)
351       else
352         val = proc {|val| val}.call(*val)
353       end
354       return arg, block, val
355     end
356     private :conv_arg
358     #
359     # Produces the summary text. Each line of the summary is yielded to the
360     # block (without newline).
361     #
362     # +sdone+::  Already summarized short style options keyed hash.
363     # +ldone+::  Already summarized long style options keyed hash.
364     # +width+::  Width of left side (option part). In other words, the right
365     #            side (description part) starts after +width+ columns.
366     # +max+::    Maximum width of left side -> the options are filled within
367     #            +max+ columns.
368     # +indent+:: Prefix string indents all summarized lines.
369     #
370     def summarize(sdone = [], ldone = [], width = 1, max = width - 1, indent = "")
371       sopts, lopts, s = [], [], nil
372       @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short
373       @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long
374       return if sopts.empty? and lopts.empty? # completely hidden
376       left = [sopts.join(', ')]
377       right = desc.dup
379       while s = lopts.shift
380         l = left[-1].length + s.length
381         l += arg.length if left.size == 1 && arg
382         l < max or left << ''
383         left[-1] << if left[-1].empty? then ' ' * 4 else ', ' end << s
384       end
386       left[0] << arg if arg
387       mlen = left.collect {|s| s.length}.max.to_i
388       while mlen > width and l = left.shift
389         mlen = left.collect {|s| s.length}.max.to_i if l.length == mlen
390         yield(indent + l)
391       end
393       while begin l = left.shift; r = right.shift; l or r end
394         l = l.to_s.ljust(width) + ' ' + r if r and !r.empty?
395         yield(indent + l)
396       end
398       self
399     end
401     def add_banner(to)  # :nodoc:
402       unless @short or @long
403         s = desc.join
404         to << " [" + s + "]..." unless s.empty?
405       end
406       to
407     end
409     def match_nonswitch?(str) # :nodoc:
410       @pattern =~ str unless @short or @long
411     end
413     #
414     # Main name of the switch.
415     #
416     def switch_name
417       (long.first || short.first).sub(/\A-+(?:\[no-\])?/, '')
418     end
420     #
421     # Switch that takes no arguments.
422     #
423     class NoArgument < self
425       #
426       # Raises an exception if any arguments given.
427       #
428       def parse(arg, argv)
429         yield(NeedlessArgument, arg) if arg
430         conv_arg(arg)
431       end
433       def self.incompatible_argument_styles(arg, t) # HACK was (*)
434         nil # HACK was empty
435       end
437       def self.pattern
438         Object
439       end
440     end
442     #
443     # Switch that takes an argument.
444     #
445     class RequiredArgument < self
447       #
448       # Raises an exception if argument is not present.
449       #
450       def parse(arg, argv)
451         unless arg
452           raise MissingArgument if argv.empty?
453           arg = argv.shift
454         end
455         conv_arg(*parse_arg(arg) {|*exc| raise(*exc)})
456       end
457     end
459     #
460     # Switch that can omit argument.
461     #
462     class OptionalArgument < self
464       #
465       # Parses argument if given, or uses default value.
466       #
467       def parse(arg, argv, &error)
468         if arg
469           conv_arg(*parse_arg(arg, &error))
470         else
471           conv_arg(arg)
472         end
473       end
474     end
476     #
477     # Switch that takes an argument, which does not begin with '-'.
478     #
479     class PlacedArgument < self
481       #
482       # Returns nil if argument is not present or begins with '-'.
483       #
484       def parse(arg, argv, &error)
485         if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
486           return nil, block, nil
487         end
488         opt = (val = parse_arg(val, &error))[1]
489         val = conv_arg(*val)
490         if opt and !arg
491           argv.shift
492         else
493           val[0] = nil
494         end
495         val
496       end
497     end
498   end
500   #
501   # Simple option list providing mapping from short and/or long option
502   # string to OptionParser::Switch and mapping from acceptable argument to
503   # matching pattern and converter pair. Also provides summary feature.
504   #
505   class List
506     # Map from acceptable argument types to pattern and converter pairs.
507     attr_reader :atype
508     
509     # Map from short style option switches to actual switch objects.
510     attr_reader :short
511     
512     # Map from long style option switches to actual switch objects.
513     attr_reader :long
514     
515     # List of all switches and summary string.
516     attr_reader :list
518     #
519     # Just initializes all instance variables.
520     #
521     def initialize
522       @atype = {}
523       @short = OptionMap.new
524       @long = OptionMap.new
525       @list = []
526     end
528     #
529     # See OptionParser.accept.
530     #
531     def accept(t, pat = /.*/nm, &block)
532       if pat
533         pat.respond_to?(:match) or raise TypeError, "has no `match'"
534       else
535         pat = t if t.respond_to?(:match)
536       end
537       unless block
538         block = pat.method(:convert).to_proc if pat.respond_to?(:convert)
539       end
540       @atype[t] = [pat, block]
541     end
543     #
544     # See OptionParser.reject.
545     #
546     def reject(t)
547       @atype.delete(t)
548     end
550     #
551     # Adds +sw+ according to +sopts+, +lopts+ and +nlopts+.
552     #
553     # +sw+::     OptionParser::Switch instance to be added.
554     # +sopts+::  Short style option list.
555     # +lopts+::  Long style option list.
556     # +nlopts+:: Negated long style options list.
557     #
558     def update(sw, sopts, lopts, nsw = nil, nlopts = nil)
559       o = nil
560       sopts.each {|o| @short[o] = sw} if sopts
561       lopts.each {|o| @long[o] = sw} if lopts
562       nlopts.each {|o| @long[o] = nsw} if nsw and nlopts
563       used = @short.invert.update(@long.invert)
564       @list.delete_if {|o| Switch === o and !used[o]}
565     end
566     private :update
568     #
569     # Inserts +switch+ at the head of the list, and associates short, long
570     # and negated long options. Arguments are:
571     # 
572     # +switch+::      OptionParser::Switch instance to be inserted.
573     # +short_opts+::  List of short style options.
574     # +long_opts+::   List of long style options.
575     # +nolong_opts+:: List of long style options with "no-" prefix.
576     #
577     #   prepend(switch, short_opts, long_opts, nolong_opts)
578     #
579     def prepend(*args)
580       update(*args)
581       @list.unshift(args[0])
582     end
584     #
585     # Appends +switch+ at the tail of the list, and associates short, long
586     # and negated long options. Arguments are:
587     # 
588     # +switch+::      OptionParser::Switch instance to be inserted.
589     # +short_opts+::  List of short style options.
590     # +long_opts+::   List of long style options.
591     # +nolong_opts+:: List of long style options with "no-" prefix.
592     #
593     #   append(switch, short_opts, long_opts, nolong_opts)
594     #
595     def append(*args)
596       update(*args)
597       @list.push(args[0])
598     end
600     #
601     # Searches +key+ in +id+ list. The result is returned or yielded if a
602     # block is given. If it isn't found, nil is returned.
603     #
604     def search(id, key)
605       if list = __send__(id)
606         val = list.fetch(key) {return nil}
607         block_given? ? yield(val) : val
608       end
609     end
611     #
612     # Searches list +id+ for +opt+ and the optional patterns for completion
613     # +pat+. If +icase+ is true, the search is case insensitive. The result
614     # is returned or yielded if a block is given. If it isn't found, nil is
615     # returned.
616     #
617     def complete(id, opt, icase = false, *pat, &block)
618       __send__(id).complete(opt, icase, *pat, &block)
619     end
621     #
622     # Iterates over each option, passing the option to the +block+.
623     #
624     def each_option(&block)
625       list.each(&block)
626     end
628     #
629     # Creates the summary table, passing each line to the +block+ (without
630     # newline). The arguments +args+ are passed along to the summarize
631     # method which is called on every option.
632     #
633     def summarize(*args, &block)
634       list.each do |opt|
635         if opt.respond_to?(:summarize) # perhaps OptionParser::Switch
636           opt.summarize(*args, &block)
637         elsif !opt or opt.empty?
638           yield("")
639         else
640           opt.each(&block)
641         end
642       end
643     end
645     def add_banner(to)  # :nodoc:
646       list.each do |opt|
647         if opt.respond_to?(:add_banner)
648           opt.add_banner(to)
649         end
650       end
651       to
652     end
653   end
655   #
656   # Hash with completion search feature. See OptionParser::Completion.
657   #
658   class CompletingHash < Hash
659     include Completion
661     #
662     # Completion for hash key.
663     #
664     def match(key)
665       return key, *fetch(key) {
666         raise AmbiguousArgument, catch(:ambiguous) {return complete(key)}
667       }
668     end
669   end
671   # :stopdoc:
673   #
674   # Enumeration of acceptable argument styles. Possible values are:
675   #
676   # NO_ARGUMENT::       The switch takes no arguments. (:NONE)
677   # REQUIRED_ARGUMENT:: The switch requires an argument. (:REQUIRED)
678   # OPTIONAL_ARGUMENT:: The switch requires an optional argument. (:OPTIONAL)
679   #
680   # Use like --switch=argument (long style) or -Xargument (short style). For
681   # short style, only portion matched to argument pattern is dealed as
682   # argument.
683   #
684   ArgumentStyle = {}
685   NoArgument.each {|el| ArgumentStyle[el] = Switch::NoArgument}
686   RequiredArgument.each {|el| ArgumentStyle[el] = Switch::RequiredArgument}
687   OptionalArgument.each {|el| ArgumentStyle[el] = Switch::OptionalArgument}
688   ArgumentStyle.freeze
690   #
691   # Switches common used such as '--', and also provides default
692   # argument classes
693   #
694   DefaultList = List.new
695   DefaultList.short['-'] = Switch::NoArgument.new {}
696   DefaultList.long[''] = Switch::NoArgument.new {throw :terminate}
698   #
699   # Default options for ARGV, which never appear in option summary.
700   #
701   Officious = {}
703   #
704   # --help
705   # Shows option summary.
706   #
707   Officious['help'] = proc do |parser|
708     Switch::NoArgument.new do
709       puts parser.help
710       exit
711     end
712   end
714   #
715   # --version
716   # Shows version string if Version is defined.
717   #
718   Officious['version'] = proc do |parser|
719     Switch::OptionalArgument.new do |pkg|
720       if pkg
721         begin
722           require 'optparse/version'
723         rescue LoadError
724         else
725           show_version(*pkg.split(/,/)) or
726             abort("#{parser.program_name}: no version found in package #{pkg}")
727           exit
728         end
729       end
730       v = parser.ver or abort("#{parser.program_name}: version unknown")
731       puts v
732       exit
733     end
734   end
736   # :startdoc:
738   #
739   # Class methods
740   #
742   #
743   # Initializes a new instance and evaluates the optional block in context
744   # of the instance. Arguments +args+ are passed to #new, see there for
745   # description of parameters.
746   # 
747   # This method is *deprecated*, its behavior corresponds to the older #new
748   # method.
749   #
750   def self.with(*args, &block)
751     opts = new(*args)
752     opts.instance_eval(&block)
753     opts
754   end
756   #
757   # Returns an incremented value of +default+ according to +arg+.
758   #
759   def self.inc(arg, default = nil)
760     case arg
761     when Integer
762       arg.nonzero?
763     when nil
764       default.to_i + 1
765     end
766   end
767   def inc(*args)
768     self.class.inc(*args)
769   end
771   #
772   # Initializes the instance and yields itself if called with a block.
773   #
774   # +banner+:: Banner message.
775   # +width+::  Summary width.
776   # +indent+:: Summary indent.
777   #
778   def initialize(banner = nil, width = 32, indent = ' ' * 4)
779     @stack = [DefaultList, List.new, List.new]
780     @program_name = nil
781     @banner = banner
782     @summary_width = width
783     @summary_indent = indent
784     @default_argv = ARGV
785     add_officious
786     yield self if block_given?
787   end
789   def add_officious  # :nodoc:
790     list = base()
791     Officious.each do |opt, block|
792       list.long[opt] ||= block.call(self)
793     end
794   end
796   #
797   # Terminates option parsing. Optional parameter +arg+ is a string pushed
798   # back to be the first non-option argument.
799   #
800   def terminate(arg = nil)
801     self.class.terminate(arg)
802   end
803   def self.terminate(arg = nil)
804     throw :terminate, arg
805   end
807   @stack = [DefaultList]
808   def self.top() DefaultList end
810   #
811   # Directs to accept specified class +t+. The argument string is passed to
812   # the block in which it should be converted to the desired class.
813   #
814   # +t+::   Argument class specifier, any object including Class.
815   # +pat+:: Pattern for argument, defaults to +t+ if it responds to match.
816   #
817   #   accept(t, pat, &block)
818   #
819   def accept(*args, &blk) top.accept(*args, &blk) end
820   #
821   # See #accept.
822   #
823   def self.accept(*args, &blk) top.accept(*args, &blk) end
825   #
826   # Directs to reject specified class argument.
827   #
828   # +t+:: Argument class speficier, any object including Class.
829   #
830   #   reject(t)
831   #
832   def reject(*args, &blk) top.reject(*args, &blk) end
833   #
834   # See #reject.
835   #
836   def self.reject(*args, &blk) top.reject(*args, &blk) end
838   #
839   # Instance methods
840   #
842   # Heading banner preceding summary.
843   attr_writer :banner
845   # Program name to be emitted in error message and default banner,
846   # defaults to $0.
847   attr_writer :program_name
849   # Width for option list portion of summary. Must be Numeric.
850   attr_accessor :summary_width
852   # Indentation for summary. Must be String (or have + String method).
853   attr_accessor :summary_indent
855   # Strings to be parsed in default.
856   attr_accessor :default_argv
858   #
859   # Heading banner preceding summary.
860   #
861   def banner
862     unless @banner
863       @banner = "Usage: #{program_name} [options]"
864       visit(:add_banner, @banner)
865     end
866     @banner
867   end
869   #
870   # Program name to be emitted in error message and default banner, defaults
871   # to $0.
872   #
873   def program_name
874     @program_name || File.basename($0, '.*')
875   end
877   # for experimental cascading :-)
878   alias set_banner banner=
879   alias set_program_name program_name=
880   alias set_summary_width summary_width=
881   alias set_summary_indent summary_indent=
883   # Version
884   attr_writer :version
885   # Release code
886   attr_writer :release
888   #
889   # Version
890   #
891   def version
892     @version || (defined?(::Version) && ::Version)
893   end
895   #
896   # Release code
897   #
898   def release
899     @release || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE)
900   end
902   #
903   # Returns version string from program_name, version and release.
904   #
905   def ver
906     if v = version
907       str = "#{program_name} #{[v].join('.')}"
908       str << " (#{v})" if v = release
909       str
910     end
911   end
913   def warn(mesg = $!)
914     super("#{program_name}: #{mesg}")
915   end
917   def abort(mesg = $!)
918     super("#{program_name}: #{mesg}")
919   end
921   #
922   # Subject of #on / #on_head, #accept / #reject
923   #
924   def top
925     @stack[-1]
926   end
928   #
929   # Subject of #on_tail.
930   #
931   def base
932     @stack[1]
933   end
935   #
936   # Pushes a new List.
937   #
938   def new
939     @stack.push(List.new)
940     if block_given?
941       yield self
942     else
943       self
944     end
945   end
947   #
948   # Removes the last List.
949   #
950   def remove
951     @stack.pop
952   end
954   #
955   # Puts option summary into +to+ and returns +to+. Yields each line if
956   # a block is given.
957   #
958   # +to+:: Output destination, which must have method <<. Defaults to [].
959   # +width+:: Width of left side, defaults to @summary_width.
960   # +max+:: Maximum length allowed for left side, defaults to +width+ - 1.
961   # +indent+:: Indentation, defaults to @summary_indent.
962   #
963   def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
964     visit(:summarize, {}, {}, width, max, indent, &(blk || proc {|l| to << l + $/}))
965     to
966   end
968   #
969   # Returns option summary string.
970   #
971   def help; summarize(banner.to_s.sub(/\n?\z/, "\n")) end
972   alias to_s help
974   #
975   # Returns option summary list.
976   #
977   def to_a; summarize(banner.to_a.dup) end
979   #
980   # Checks if an argument is given twice, in which case an ArgumentError is
981   # raised. Called from OptionParser#switch only.
982   #
983   # +obj+:: New argument.
984   # +prv+:: Previously specified argument.
985   # +msg+:: Exception message.
986   #
987   def notwice(obj, prv, msg)
988     unless !prv or prv == obj
989       begin
990         raise ArgumentError, "argument #{msg} given twice: #{obj}"
991       rescue
992         $@[0, 2] = nil
993         raise
994       end
995     end
996     obj
997   end
998   private :notwice
1000   #
1001   # Creates an OptionParser::Switch from the parameters. The parsed argument
1002   # value is passed to the given block, where it can be processed.
1003   #
1004   # See at the beginning of OptionParser for some full examples.
1005   #
1006   # +opts+ can include the following elements:
1007   #
1008   # [Argument style:]
1009   #   One of the following:
1010   #     :NONE, :REQUIRED, :OPTIONAL
1011   #
1012   # [Argument pattern:]
1013   #   Acceptable option argument format, must be pre-defined with
1014   #   OptionParser.accept or OptionParser#accept, or Regexp. This can appear
1015   #   once or assigned as String if not present, otherwise causes an
1016   #   ArgumentError. Examples:
1017   #     Float, Time, Array
1018   #
1019   # [Possible argument values:]
1020   #   Hash or Array.
1021   #     [:text, :binary, :auto]
1022   #     %w[iso-2022-jp shift_jis euc-jp utf8 binary]
1023   #     { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
1024   #
1025   # [Long style switch:]
1026   #   Specifies a long style switch which takes a mandatory, optional or no
1027   #   argument. It's a string of the following form:
1028   #     "--switch=MANDATORY" or "--switch MANDATORY"
1029   #     "--switch[=OPTIONAL]"
1030   #     "--switch"
1031   #
1032   # [Short style switch:]
1033   #   Specifies short style switch which takes a mandatory, optional or no
1034   #   argument. It's a string of the following form:
1035   #     "-xMANDATORY"
1036   #     "-x[OPTIONAL]"
1037   #     "-x"
1038   #   There is also a special form which matches character range (not full
1039   #   set of regural expression):
1040   #     "-[a-z]MANDATORY"
1041   #     "-[a-z][OPTIONAL]" 
1042   #     "-[a-z]"
1043   #
1044   # [Argument style and description:]
1045   #   Instead of specifying mandatory or optional orguments directly in the
1046   #   switch parameter, this separate parameter can be used.
1047   #     "=MANDATORY"
1048   #     "=[OPTIONAL]"
1049   #
1050   # [Description:]
1051   #   Description string for the option.
1052   #     "Run verbosely"
1053   # 
1054   # [Handler:]
1055   #   Handler for the parsed argument value. Either give a block or pass a
1056   #   Proc or Method as an argument.
1057   #
1058   def make_switch(opts, block = nil)
1059     short, long, nolong, style, pattern, conv, not_pattern, not_conv, not_style = [], [], []
1060     ldesc, sdesc, desc, arg = [], [], []
1061     default_style = Switch::NoArgument
1062     default_pattern = nil
1063     klass = nil
1064     o = nil
1065     n, q, a = nil
1067     opts.each do |o|
1068       # argument class
1069       next if search(:atype, o) do |pat, c|
1070         klass = notwice(o, klass, 'type')
1071         if not_style and not_style != Switch::NoArgument
1072           not_pattern, not_conv = pat, c
1073         else
1074           default_pattern, conv = pat, c
1075         end
1076       end
1078       # directly specified pattern(any object possible to match)
1079       if !(String === o) and o.respond_to?(:match)
1080         pattern = notwice(o, pattern, 'pattern')
1081         conv = (pattern.method(:convert).to_proc if pattern.respond_to?(:convert))
1082         next
1083       end
1085       # anything others
1086       case o
1087       when Proc, Method
1088         block = notwice(o, block, 'block')
1089       when Array, Hash
1090         case pattern
1091         when CompletingHash
1092         when nil
1093           pattern = CompletingHash.new
1094           conv = (pattern.method(:convert).to_proc if pattern.respond_to?(:convert))
1095         else
1096           raise ArgumentError, "argument pattern given twice"
1097         end
1098         o.each {|(o, *v)| pattern[o] = v.fetch(0) {o}}
1099       when Module
1100         raise ArgumentError, "unsupported argument type: #{o}"
1101       when *ArgumentStyle.keys
1102         style = notwice(ArgumentStyle[o], style, 'style')
1103       when /^--no-([^\[\]=\s]*)(.+)?/
1104         q, a = $1, $2
1105         o = notwice(a ? Object : TrueClass, klass, 'type')
1106         not_pattern, not_conv = search(:atype, o) unless not_style
1107         not_style = (not_style || default_style).guess(arg = a) if a
1108         default_style = Switch::NoArgument
1109         default_pattern, conv = search(:atype, FalseClass) unless default_pattern
1110         ldesc << "--no-#{q}"
1111         long << 'no-' + (q = q.downcase)
1112         nolong << q
1113       when /^--\[no-\]([^\[\]=\s]*)(.+)?/
1114         q, a = $1, $2
1115         o = notwice(a ? Object : TrueClass, klass, 'type')
1116         if a
1117           default_style = default_style.guess(arg = a)
1118           default_pattern, conv = search(:atype, o) unless default_pattern
1119         end
1120         ldesc << "--[no-]#{q}"
1121         long << (o = q.downcase)
1122         not_pattern, not_conv = search(:atype, FalseClass) unless not_style
1123         not_style = Switch::NoArgument
1124         nolong << 'no-' + o
1125       when /^--([^\[\]=\s]*)(.+)?/
1126         q, a = $1, $2
1127         if a
1128           o = notwice(NilClass, klass, 'type')
1129           default_style = default_style.guess(arg = a)
1130           default_pattern, conv = search(:atype, o) unless default_pattern
1131         end
1132         ldesc << "--#{q}"
1133         long << (o = q.downcase)
1134       when /^-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
1135         q, a = $1, $2
1136         o = notwice(Object, klass, 'type')
1137         if a
1138           default_style = default_style.guess(arg = a)
1139           default_pattern, conv = search(:atype, o) unless default_pattern
1140         end
1141         sdesc << "-#{q}"
1142         short << Regexp.new(q)
1143       when /^-(.)(.+)?/
1144         q, a = $1, $2
1145         if a
1146           o = notwice(NilClass, klass, 'type')
1147           default_style = default_style.guess(arg = a)
1148           default_pattern, conv = search(:atype, o) unless default_pattern
1149         end
1150         sdesc << "-#{q}"
1151         short << q
1152       when /^=/
1153         style = notwice(default_style.guess(arg = o), style, 'style')
1154         default_pattern, conv = search(:atype, Object) unless default_pattern
1155       else
1156         desc.push(o)
1157       end
1158     end
1160     default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern
1161     if !(short.empty? and long.empty?)
1162       s = (style || default_style).new(pattern || default_pattern,
1163                                        conv, sdesc, ldesc, arg, desc, block)
1164     elsif !block
1165       raise ArgumentError, "no switch given" if style or pattern
1166       s = desc
1167     else
1168       short << pattern
1169       s = (style || default_style).new(pattern,
1170                                        conv, nil, nil, arg, desc, block)
1171     end
1172     return s, short, long,
1173       (not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style),
1174       nolong
1175   end
1177   def define(*opts, &block)
1178     top.append(*(sw = make_switch(opts, block)))
1179     sw[0]
1180   end
1182   #
1183   # Add option switch and handler. See #make_switch for an explanation of
1184   # parameters.
1185   #
1186   def on(*opts, &block)
1187     define(*opts, &block)
1188     self
1189   end
1190   alias def_option define
1192   def define_head(*opts, &block)
1193     top.prepend(*(sw = make_switch(opts, block)))
1194     sw[0]
1195   end
1197   #
1198   # Add option switch like with #on, but at head of summary.
1199   #
1200   def on_head(*opts, &block)
1201     define_head(*opts, &block)
1202     self
1203   end
1204   alias def_head_option define_head
1206   def define_tail(*opts, &block)
1207     base.append(*(sw = make_switch(opts, block)))
1208     sw[0]
1209   end
1211   #
1212   # Add option switch like with #on, but at tail of summary.
1213   #
1214   def on_tail(*opts, &block)
1215     define_tail(*opts, &block)
1216     self
1217   end
1218   alias def_tail_option define_tail
1220   #
1221   # Add separator in summary.
1222   #
1223   def separator(string)
1224     top.append(string, nil, nil)
1225   end
1227   #
1228   # Parses command line arguments +argv+ in order. When a block is given,
1229   # each non-option argument is yielded.
1230   #
1231   # Returns the rest of +argv+ left unparsed.
1232   #
1233   def order(*argv, &block)
1234     argv = argv[0].dup if argv.size == 1 and Array === argv[0]
1235     order!(argv, &block)
1236   end
1238   #
1239   # Same as #order, but removes switches destructively.
1240   #
1241   def order!(argv = default_argv, &nonopt)
1242     parse_in_order(argv, &nonopt)
1243   end
1245   def parse_in_order(argv = default_argv, setter = nil, &nonopt)  # :nodoc:
1246     opt, arg, sw, val, rest = nil
1247     nonopt ||= proc {|arg| throw :terminate, arg}
1248     argv.unshift(arg) if arg = catch(:terminate) {
1249       while arg = argv.shift
1250         case arg
1251         # long option
1252         when /\A--([^=]*)(?:=(.*))?/nm
1253           opt, rest = $1, $2
1254           begin
1255             sw, = complete(:long, opt, true)
1256           rescue ParseError
1257             raise $!.set_option(arg, true)
1258           end
1259           begin
1260             opt, cb, val = sw.parse(rest, argv) {|*exc| raise(*exc)}
1261             val = cb.call(val) if cb
1262             setter.call(sw.switch_name, val) if setter
1263           rescue ParseError
1264             raise $!.set_option(arg, rest)
1265           end
1267         # short option
1268         when /\A-(.)((=).*|.+)?/nm
1269           opt, has_arg, eq, val, rest = $1, $3, $3, $2, $2
1270           begin
1271             sw, = search(:short, opt)
1272             unless sw
1273               begin
1274                 sw, = complete(:short, opt)
1275                 # short option matched.
1276                 val = arg.sub(/\A-/, '')
1277                 has_arg = true
1278               rescue InvalidOption
1279                 # if no short options match, try completion with long
1280                 # options.
1281                 sw, = complete(:long, opt)
1282                 eq ||= !rest
1283               end
1284             end
1285           rescue ParseError
1286             raise $!.set_option(arg, true)
1287           end
1288           begin
1289             opt, cb, val = sw.parse(val, argv) {|*exc| raise(*exc) if eq}
1290             raise InvalidOption, arg if has_arg and !eq and arg == "-#{opt}"
1291             argv.unshift(opt) if opt and (opt = opt.sub(/\A-*/, '-')) != '-'
1292             val = cb.call(val) if cb
1293             setter.call(sw.switch_name, val) if setter
1294           rescue ParseError
1295             raise $!.set_option(arg, arg.length > 2)
1296           end
1298         # non-option argument
1299         else
1300           catch(:prune) do
1301             visit(:each_option) do |sw|
1302               sw.block.call(arg) if Switch === sw and sw.match_nonswitch?(arg)
1303             end
1304             nonopt.call(arg)
1305           end
1306         end
1307       end
1309       nil
1310     }
1312     visit(:search, :short, nil) {|sw| sw.block.call(*argv) if !sw.pattern}
1314     argv
1315   end
1316   private :parse_in_order
1318   #
1319   # Parses command line arguments +argv+ in permutation mode and returns
1320   # list of non-option arguments.
1321   #
1322   def permute(*argv)
1323     argv = argv[0].dup if argv.size == 1 and Array === argv[0]
1324     permute!(argv)
1325   end
1327   #
1328   # Same as #permute, but removes switches destructively.
1329   #
1330   def permute!(argv = default_argv)
1331     nonopts = []
1332     arg = nil
1333     order!(argv) {|arg| nonopts << arg}
1334     argv[0, 0] = nonopts
1335     argv
1336   end
1338   #
1339   # Parses command line arguments +argv+ in order when environment variable
1340   # POSIXLY_CORRECT is set, and in permutation mode otherwise.
1341   #
1342   def parse(*argv)
1343     argv = argv[0].dup if argv.size == 1 and Array === argv[0]
1344     parse!(argv)
1345   end
1347   #
1348   # Same as #parse, but removes switches destructively.
1349   #
1350   def parse!(argv = default_argv)
1351     if ENV.include?('POSIXLY_CORRECT')
1352       order!(argv)
1353     else
1354       permute!(argv)
1355     end
1356   end
1358   #
1359   # Wrapper method for getopts.rb.
1360   #
1361   #   params = ARGV.getopts("ab:", "foo", "bar:")
1362   #   # params[:a] = true   # -a
1363   #   # params[:b] = "1"    # -b1
1364   #   # params[:foo] = "1"  # --foo
1365   #   # params[:bar] = "x"  # --bar x
1366   #
1367   def getopts(*args)
1368     argv = Array === args.first ? args.shift : default_argv
1369     single_options, *long_options = *args
1371     result = {}
1373     single_options.scan(/(.)(:)?/) do |opt, val|
1374       if val
1375         result[opt] = nil
1376         define("-#{opt} VAL")
1377       else
1378         result[opt] = false
1379         define("-#{opt}")
1380       end
1381     end if single_options
1383     long_options.each do |arg|
1384       opt, val = arg.split(':', 2)
1385       if val
1386         result[opt] = val.empty? ? nil : val
1387         define("--#{opt} VAL")
1388       else
1389         result[opt] = false
1390         define("--#{opt}")
1391       end
1392     end
1394     parse_in_order(argv, result.method(:[]=))
1395     result
1396   end
1398   #
1399   # See #getopts.
1400   #
1401   def self.getopts(*args)
1402     new.getopts(*args)
1403   end
1405   #
1406   # Traverses @stack, sending each element method +id+ with +args+ and
1407   # +block+.
1408   #
1409   def visit(id, *args, &block)
1410     el = nil
1411     @stack.reverse_each do |el|
1412       el.send(id, *args, &block)
1413     end
1414     nil
1415   end
1416   private :visit
1418   #
1419   # Searches +key+ in @stack for +id+ hash and returns or yields the result.
1420   #
1421   def search(id, key)
1422     block_given = block_given?
1423     visit(:search, id, key) do |k|
1424       return block_given ? yield(k) : k
1425     end
1426   end
1427   private :search
1429   #
1430   # Completes shortened long style option switch and returns pair of
1431   # canonical switch and switch descriptor OptionParser::Switch.
1432   #
1433   # +id+::    Searching table.
1434   # +opt+::   Searching key.
1435   # +icase+:: Search case insensitive if true.
1436   # +pat+::   Optional pattern for completion.
1437   #
1438   def complete(typ, opt, icase = false, *pat)
1439     if pat.empty?
1440       search(typ, opt) {|sw| return [sw, opt]} # exact match or...
1441     end
1442     raise AmbiguousOption, catch(:ambiguous) {
1443       visit(:complete, typ, opt, icase, *pat) {|opt, *sw| return sw}
1444       raise InvalidOption, opt
1445     }
1446   end
1447   private :complete
1449   #
1450   # Loads options from file names as +filename+. Does nothing when the file
1451   # is not present. Returns whether successfully loaded.
1452   #
1453   # +filename+ defaults to basename of the program without suffix in a
1454   # directory ~/.options.
1455   #
1456   def load(filename = nil)
1457     begin
1458       filename ||= File.expand_path(File.basename($0, '.*'), '~/.options')
1459     rescue
1460       return false
1461     end
1462     begin
1463       parse(*IO.readlines(filename).each {|s| s.chomp!})
1464       true
1465     rescue Errno::ENOENT, Errno::ENOTDIR
1466       false
1467     end
1468   end
1470   #
1471   # Parses environment variable +env+ or its uppercase with splitting like a
1472   # shell.
1473   #
1474   # +env+ defaults to the basename of the program.
1475   #
1476   def environment(env = File.basename($0, '.*'))
1477     env = ENV[env] || ENV[env.upcase] or return
1478     parse(*Shellwords.shellwords(env))
1479   end
1481   #
1482   # Acceptable argument classes
1483   #
1485   #
1486   # Any string and no conversion. This is fall-back.
1487   #
1488   accept(Object) {|s,|s or s.nil?}
1490   accept(NilClass) {|s,|s}
1492   #
1493   # Any non-empty string, and no conversion.
1494   #
1495   accept(String, /.+/nm) {|s,*|s}
1497   #
1498   # Ruby/C-like integer, octal for 0-7 sequence, binary for 0b, hexadecimal
1499   # for 0x, and decimal for others; with optional sign prefix. Converts to
1500   # Integer.
1501   #
1502   decimal = '\d+(?:_\d+)*'
1503   binary = 'b[01]+(?:_[01]+)*'
1504   hex = 'x[\da-f]+(?:_[\da-f]+)*'
1505   octal = "0(?:[0-7]*(?:_[0-7]+)*|#{binary}|#{hex})"
1506   integer = "#{octal}|#{decimal}"
1507   accept(Integer, %r"\A[-+]?(?:#{integer})"io) {|s,| Integer(s) if s}
1509   #
1510   # Float number format, and converts to Float.
1511   #
1512   float = "(?:#{decimal}(?:\\.(?:#{decimal})?)?|\\.#{decimal})(?:E[-+]?#{decimal})?"
1513   floatpat = %r"\A[-+]?#{float}"io
1514   accept(Float, floatpat) {|s,| s.to_f if s}
1516   #
1517   # Generic numeric format, converts to Integer for integer format, Float
1518   # for float format.
1519   #
1520   accept(Numeric, %r"\A[-+]?(?:#{octal}|#{float})"io) {|s,| eval(s) if s}
1522   #
1523   # Decimal integer format, to be converted to Integer.
1524   #
1525   DecimalInteger = /\A[-+]?#{decimal}/io
1526   accept(DecimalInteger) {|s,| s.to_i if s}
1528   #
1529   # Ruby/C like octal/hexadecimal/binary integer format, to be converted to
1530   # Integer.
1531   #
1532   OctalInteger = /\A[-+]?(?:[0-7]+(?:_[0-7]+)*|0(?:#{binary}|#{hex}))/io
1533   accept(OctalInteger) {|s,| s.oct if s}
1535   #
1536   # Decimal integer/float number format, to be converted to Integer for
1537   # integer format, Float for float format.
1538   #
1539   DecimalNumeric = floatpat     # decimal integer is allowed as float also.
1540   accept(DecimalNumeric) {|s,| eval(s) if s}
1542   #
1543   # Boolean switch, which means whether it is present or not, whether it is
1544   # absent or not with prefix no-, or it takes an argument
1545   # yes/no/true/false/+/-.
1546   #
1547   yesno = CompletingHash.new
1548   %w[- no false].each {|el| yesno[el] = false}
1549   %w[+ yes true].each {|el| yesno[el] = true}
1550   yesno['nil'] = false          # shoud be nil?
1551   accept(TrueClass, yesno) {|arg, val| val == nil or val}
1552   #
1553   # Similar to TrueClass, but defaults to false.
1554   #
1555   accept(FalseClass, yesno) {|arg, val| val != nil and val}
1557   #
1558   # List of strings separated by ",".
1559   #
1560   accept(Array) do |s,|
1561     if s
1562       s = s.split(',').collect {|s| s unless s.empty?}
1563     end
1564     s
1565   end
1567   #
1568   # Regular expression with options.
1569   #
1570   accept(Regexp, %r"\A/((?:\\.|[^\\])*)/([[:alpha:]]+)?\z|.*") do |all, s, o|
1571     f = 0
1572     if o
1573       f |= Regexp::IGNORECASE if /i/ =~ o
1574       f |= Regexp::MULTILINE if /m/ =~ o
1575       f |= Regexp::EXTENDED if /x/ =~ o
1576       k = o.delete("^imx")
1577     end
1578     Regexp.new(s || all, f, k)
1579   end
1581   #
1582   # Exceptions
1583   #
1585   #
1586   # Base class of exceptions from OptionParser.
1587   #
1588   class ParseError < RuntimeError
1589     # Reason which caused the error.
1590     Reason = 'parse error'.freeze
1592     def initialize(*args)
1593       @args = args
1594       @reason = nil
1595     end
1597     attr_reader :args
1598     attr_writer :reason
1600     #
1601     # Pushes back erred argument(s) to +argv+.
1602     #
1603     def recover(argv)
1604       argv[0, 0] = @args
1605       argv
1606     end
1608     def set_option(opt, eq)
1609       if eq
1610         @args[0] = opt
1611       else
1612         @args.unshift(opt)
1613       end
1614       self
1615     end
1617     #
1618     # Returns error reason. Override this for I18N.
1619     #
1620     def reason
1621       @reason || self.class::Reason
1622     end
1624     def inspect
1625       "#<#{self.class.to_s}: #{args.join(' ')}>"
1626     end
1628     #
1629     # Default stringizing method to emit standard error message.
1630     #
1631     def message
1632       reason + ': ' + args.join(' ')
1633     end
1635     alias to_s message
1636   end
1638   #
1639   # Raises when ambiguously completable string is encountered.
1640   #
1641   class AmbiguousOption < ParseError
1642     const_set(:Reason, 'ambiguous option'.freeze)
1643   end
1645   #
1646   # Raises when there is an argument for a switch which takes no argument.
1647   #
1648   class NeedlessArgument < ParseError
1649     const_set(:Reason, 'needless argument'.freeze)
1650   end
1652   #
1653   # Raises when a switch with mandatory argument has no argument.
1654   #
1655   class MissingArgument < ParseError
1656     const_set(:Reason, 'missing argument'.freeze)
1657   end
1659   #
1660   # Raises when switch is undefined.
1661   #
1662   class InvalidOption < ParseError
1663     const_set(:Reason, 'invalid option'.freeze)
1664   end
1666   #
1667   # Raises when the given argument does not match required format.
1668   #
1669   class InvalidArgument < ParseError
1670     const_set(:Reason, 'invalid argument'.freeze)
1671   end
1673   #
1674   # Raises when the given argument word can't be completed uniquely.
1675   #
1676   class AmbiguousArgument < InvalidArgument
1677     const_set(:Reason, 'ambiguous argument'.freeze)
1678   end
1680   #
1681   # Miscellaneous
1682   #
1684   #
1685   # Extends command line arguments array (ARGV) to parse itself.
1686   #
1687   module Arguable
1689     #
1690     # Sets OptionParser object, when +opt+ is +false+ or +nil+, methods
1691     # OptionParser::Arguable#options and OptionParser::Arguable#options= are
1692     # undefined. Thus, there is no ways to access the OptionParser object
1693     # via the receiver object.
1694     #
1695     def options=(opt)
1696       unless @optparse = opt
1697         class << self
1698           undef_method(:options)
1699           undef_method(:options=)
1700         end
1701       end
1702     end
1704     #
1705     # Actual OptionParser object, automatically created if nonexistent.
1706     #
1707     # If called with a block, yields the OptionParser object and returns the
1708     # result of the block. If an OptionParser::ParseError exception occurs
1709     # in the block, it is rescued, a error message printed to STDERR and
1710     # +nil+ returned.
1711     #
1712     def options
1713       @optparse ||= OptionParser.new
1714       @optparse.default_argv = self
1715       block_given? or return @optparse
1716       begin
1717         yield @optparse
1718       rescue ParseError
1719         @optparse.warn $!
1720         nil
1721       end
1722     end
1724     #
1725     # Parses +self+ destructively in order and returns +self+ containing the
1726     # rest arguments left unparsed.
1727     #
1728     def order!(&blk) options.order!(self, &blk) end
1730     #
1731     # Parses +self+ destructively in permutation mode and returns +self+
1732     # containing the rest arguments left unparsed.
1733     #
1734     def permute!() options.permute!(self) end
1736     #
1737     # Parses +self+ destructively and returns +self+ containing the
1738     # rest arguments left unparsed.
1739     #
1740     def parse!() options.parse!(self) end
1742     #
1743     # Substitution of getopts is possible as follows. Also see
1744     # OptionParser#getopts.
1745     #
1746     #   def getopts(*args)
1747     #     ($OPT = ARGV.getopts(*args)).each do |opt, val|
1748     #       eval "$OPT_#{opt.gsub(/[^A-Za-z0-9_]/, '_')} = val"
1749     #     end
1750     #   rescue OptionParser::ParseError
1751     #   end
1752     #
1753     def getopts(*args)
1754       options.getopts(self, *args)
1755     end
1757     #
1758     # Initializes instance variable.
1759     #
1760     def self.extend_object(obj)
1761       super
1762       obj.instance_eval {@optparse = nil}
1763     end
1764     def initialize(*args)
1765       super
1766       @optparse = nil
1767     end
1768   end
1770   #
1771   # Acceptable argument classes. Now contains DecimalInteger, OctalInteger
1772   # and DecimalNumeric. See Acceptable argument classes (in source code).
1773   #
1774   module Acceptables
1775     const_set(:DecimalInteger, OptionParser::DecimalInteger)
1776     const_set(:OctalInteger, OptionParser::OctalInteger)
1777     const_set(:DecimalNumeric, OptionParser::DecimalNumeric)
1778   end
1781 # ARGV is arguable by OptionParser
1782 ARGV.extend(OptionParser::Arguable)
1784 if $0 == __FILE__
1785   Version = OptionParser::Version
1786   ARGV.options {|q|
1787     q.parse!.empty? or puts "what's #{ARGV.join(' ')}?"
1788   } or abort(ARGV.options.to_s)