* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / lib / optparse.rb
blob86681235a00869ce07783d60ef2a739f5ff0de7e
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$[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, 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, []
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 = [])
349       if conv
350         val = conv.call(*val)
351       else
352         val = proc {|v| v}.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 = [], [], 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 sopts.empty? 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 {|ss| ss.length}.max.to_i
388       while mlen > width and l = left.shift
389         mlen = left.collect {|ss| ss.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(*)
434       end
436       def self.pattern
437         Object
438       end
439     end
441     #
442     # Switch that takes an argument.
443     #
444     class RequiredArgument < self
446       #
447       # Raises an exception if argument is not present.
448       #
449       def parse(arg, argv)
450         unless arg
451           raise MissingArgument if argv.empty?
452           arg = argv.shift
453         end
454         conv_arg(*parse_arg(arg, &method(:raise)))
455       end
456     end
458     #
459     # Switch that can omit argument.
460     #
461     class OptionalArgument < self
463       #
464       # Parses argument if given, or uses default value.
465       #
466       def parse(arg, argv, &error)
467         if arg
468           conv_arg(*parse_arg(arg, &error))
469         else
470           conv_arg(arg)
471         end
472       end
473     end
475     #
476     # Switch that takes an argument, which does not begin with '-'.
477     #
478     class PlacedArgument < self
480       #
481       # Returns nil if argument is not present or begins with '-'.
482       #
483       def parse(arg, argv, &error)
484         if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
485           return nil, block, nil
486         end
487         opt = (val = parse_arg(val, &error))[1]
488         val = conv_arg(*val)
489         if opt and !arg
490           argv.shift
491         else
492           val[0] = nil
493         end
494         val
495       end
496     end
497   end
499   #
500   # Simple option list providing mapping from short and/or long option
501   # string to OptionParser::Switch and mapping from acceptable argument to
502   # matching pattern and converter pair. Also provides summary feature.
503   #
504   class List
505     # Map from acceptable argument types to pattern and converter pairs.
506     attr_reader :atype
507     
508     # Map from short style option switches to actual switch objects.
509     attr_reader :short
510     
511     # Map from long style option switches to actual switch objects.
512     attr_reader :long
513     
514     # List of all switches and summary string.
515     attr_reader :list
517     #
518     # Just initializes all instance variables.
519     #
520     def initialize
521       @atype = {}
522       @short = OptionMap.new
523       @long = OptionMap.new
524       @list = []
525     end
527     #
528     # See OptionParser.accept.
529     #
530     def accept(t, pat = /.*/nm, &block)
531       if pat
532         pat.respond_to?(:match) or raise TypeError, "has no `match'"
533       else
534         pat = t if t.respond_to?(:match)
535       end
536       unless block
537         block = pat.method(:convert).to_proc if pat.respond_to?(:convert)
538       end
539       @atype[t] = [pat, block]
540     end
542     #
543     # See OptionParser.reject.
544     #
545     def reject(t)
546       @atype.delete(t)
547     end
549     #
550     # Adds +sw+ according to +sopts+, +lopts+ and +nlopts+.
551     #
552     # +sw+::     OptionParser::Switch instance to be added.
553     # +sopts+::  Short style option list.
554     # +lopts+::  Long style option list.
555     # +nlopts+:: Negated long style options list.
556     #
557     def update(sw, sopts, lopts, nsw = nil, nlopts = nil)
558       sopts.each {|o| @short[o] = sw} if sopts
559       lopts.each {|o| @long[o] = sw} if lopts
560       nlopts.each {|o| @long[o] = nsw} if nsw and nlopts
561       used = @short.invert.update(@long.invert)
562       @list.delete_if {|o| Switch === o and !used[o]}
563     end
564     private :update
566     #
567     # Inserts +switch+ at the head of the list, and associates short, long
568     # and negated long options. Arguments are:
569     # 
570     # +switch+::      OptionParser::Switch instance to be inserted.
571     # +short_opts+::  List of short style options.
572     # +long_opts+::   List of long style options.
573     # +nolong_opts+:: List of long style options with "no-" prefix.
574     #
575     #   prepend(switch, short_opts, long_opts, nolong_opts)
576     #
577     def prepend(*args)
578       update(*args)
579       @list.unshift(args[0])
580     end
582     #
583     # Appends +switch+ at the tail of the list, and associates short, long
584     # and negated long options. Arguments are:
585     # 
586     # +switch+::      OptionParser::Switch instance to be inserted.
587     # +short_opts+::  List of short style options.
588     # +long_opts+::   List of long style options.
589     # +nolong_opts+:: List of long style options with "no-" prefix.
590     #
591     #   append(switch, short_opts, long_opts, nolong_opts)
592     #
593     def append(*args)
594       update(*args)
595       @list.push(args[0])
596     end
598     #
599     # Searches +key+ in +id+ list. The result is returned or yielded if a
600     # block is given. If it isn't found, nil is returned.
601     #
602     def search(id, key)
603       if list = __send__(id)
604         val = list.fetch(key) {return nil}
605         block_given? ? yield(val) : val
606       end
607     end
609     #
610     # Searches list +id+ for +opt+ and the optional patterns for completion
611     # +pat+. If +icase+ is true, the search is case insensitive. The result
612     # is returned or yielded if a block is given. If it isn't found, nil is
613     # returned.
614     #
615     def complete(id, opt, icase = false, *pat, &block)
616       __send__(id).complete(opt, icase, *pat, &block)
617     end
619     #
620     # Iterates over each option, passing the option to the +block+.
621     #
622     def each_option(&block)
623       list.each(&block)
624     end
626     #
627     # Creates the summary table, passing each line to the +block+ (without
628     # newline). The arguments +args+ are passed along to the summarize
629     # method which is called on every option.
630     #
631     def summarize(*args, &block)
632       list.each do |opt|
633         if opt.respond_to?(:summarize) # perhaps OptionParser::Switch
634           opt.summarize(*args, &block)
635         elsif !opt
636           yield("")
637         elsif opt.respond_to?(:each_line)
638           opt.each_line(&block)
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       *values = fetch(key) {
666         raise AmbiguousArgument, catch(:ambiguous) {return complete(key)}
667       }
668       return key, *values
669     end
670   end
672   # :stopdoc:
674   #
675   # Enumeration of acceptable argument styles. Possible values are:
676   #
677   # NO_ARGUMENT::       The switch takes no arguments. (:NONE)
678   # REQUIRED_ARGUMENT:: The switch requires an argument. (:REQUIRED)
679   # OPTIONAL_ARGUMENT:: The switch requires an optional argument. (:OPTIONAL)
680   #
681   # Use like --switch=argument (long style) or -Xargument (short style). For
682   # short style, only portion matched to argument pattern is dealed as
683   # argument.
684   #
685   ArgumentStyle = {}
686   NoArgument.each {|el| ArgumentStyle[el] = Switch::NoArgument}
687   RequiredArgument.each {|el| ArgumentStyle[el] = Switch::RequiredArgument}
688   OptionalArgument.each {|el| ArgumentStyle[el] = Switch::OptionalArgument}
689   ArgumentStyle.freeze
691   #
692   # Switches common used such as '--', and also provides default
693   # argument classes
694   #
695   DefaultList = List.new
696   DefaultList.short['-'] = Switch::NoArgument.new {}
697   DefaultList.long[''] = Switch::NoArgument.new {throw :terminate}
699   #
700   # Default options for ARGV, which never appear in option summary.
701   #
702   Officious = {}
704   #
705   # --help
706   # Shows option summary.
707   #
708   Officious['help'] = proc do |parser|
709     Switch::NoArgument.new do
710       puts parser.help
711       exit
712     end
713   end
715   #
716   # --version
717   # Shows version string if Version is defined.
718   #
719   Officious['version'] = proc do |parser|
720     Switch::OptionalArgument.new do |pkg|
721       if pkg
722         begin
723           require 'optparse/version'
724         rescue LoadError
725         else
726           show_version(*pkg.split(/,/)) or
727             abort("#{parser.program_name}: no version found in package #{pkg}")
728           exit
729         end
730       end
731       v = parser.ver or abort("#{parser.program_name}: version unknown")
732       puts v
733       exit
734     end
735   end
737   # :startdoc:
739   #
740   # Class methods
741   #
743   #
744   # Initializes a new instance and evaluates the optional block in context
745   # of the instance. Arguments +args+ are passed to #new, see there for
746   # description of parameters.
747   # 
748   # This method is *deprecated*, its behavior corresponds to the older #new
749   # method.
750   #
751   def self.with(*args, &block)
752     opts = new(*args)
753     opts.instance_eval(&block)
754     opts
755   end
757   #
758   # Returns an incremented value of +default+ according to +arg+.
759   #
760   def self.inc(arg, default = nil)
761     case arg
762     when Integer
763       arg.nonzero?
764     when nil
765       default.to_i + 1
766     end
767   end
768   def inc(*args)
769     self.class.inc(*args)
770   end
772   #
773   # Initializes the instance and yields itself if called with a block.
774   #
775   # +banner+:: Banner message.
776   # +width+::  Summary width.
777   # +indent+:: Summary indent.
778   #
779   def initialize(banner = nil, width = 32, indent = ' ' * 4)
780     @stack = [DefaultList, List.new, List.new]
781     @program_name = nil
782     @banner = banner
783     @summary_width = width
784     @summary_indent = indent
785     @default_argv = ARGV
786     add_officious
787     yield self if block_given?
788   end
790   def add_officious  # :nodoc:
791     list = base()
792     Officious.each do |opt, block|
793       list.long[opt] ||= block.call(self)
794     end
795   end
797   #
798   # Terminates option parsing. Optional parameter +arg+ is a string pushed
799   # back to be the first non-option argument.
800   #
801   def terminate(arg = nil)
802     self.class.terminate(arg)
803   end
804   def self.terminate(arg = nil)
805     throw :terminate, arg
806   end
808   @stack = [DefaultList]
809   def self.top() DefaultList end
811   #
812   # Directs to accept specified class +t+. The argument string is passed to
813   # the block in which it should be converted to the desired class.
814   #
815   # +t+::   Argument class specifier, any object including Class.
816   # +pat+:: Pattern for argument, defaults to +t+ if it responds to match.
817   #
818   #   accept(t, pat, &block)
819   #
820   def accept(*args, &blk) top.accept(*args, &blk) end
821   #
822   # See #accept.
823   #
824   def self.accept(*args, &blk) top.accept(*args, &blk) end
826   #
827   # Directs to reject specified class argument.
828   #
829   # +t+:: Argument class specifier, any object including Class.
830   #
831   #   reject(t)
832   #
833   def reject(*args, &blk) top.reject(*args, &blk) end
834   #
835   # See #reject.
836   #
837   def self.reject(*args, &blk) top.reject(*args, &blk) end
839   #
840   # Instance methods
841   #
843   # Heading banner preceding summary.
844   attr_writer :banner
846   # Program name to be emitted in error message and default banner,
847   # defaults to $0.
848   attr_writer :program_name
850   # Width for option list portion of summary. Must be Numeric.
851   attr_accessor :summary_width
853   # Indentation for summary. Must be String (or have + String method).
854   attr_accessor :summary_indent
856   # Strings to be parsed in default.
857   attr_accessor :default_argv
859   #
860   # Heading banner preceding summary.
861   #
862   def banner
863     unless @banner
864       @banner = "Usage: #{program_name} [options]"
865       visit(:add_banner, @banner)
866     end
867     @banner
868   end
870   #
871   # Program name to be emitted in error message and default banner, defaults
872   # to $0.
873   #
874   def program_name
875     @program_name || File.basename($0, '.*')
876   end
878   # for experimental cascading :-)
879   alias set_banner banner=
880   alias set_program_name program_name=
881   alias set_summary_width summary_width=
882   alias set_summary_indent summary_indent=
884   # Version
885   attr_writer :version
886   # Release code
887   attr_writer :release
889   #
890   # Version
891   #
892   def version
893     @version || (defined?(::Version) && ::Version)
894   end
896   #
897   # Release code
898   #
899   def release
900     @release || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE)
901   end
903   #
904   # Returns version string from program_name, version and release.
905   #
906   def ver
907     if v = version
908       str = "#{program_name} #{[v].join('.')}"
909       str << " (#{v})" if v = release
910       str
911     end
912   end
914   def warn(mesg = $!)
915     super("#{program_name}: #{mesg}")
916   end
918   def abort(mesg = $!)
919     super("#{program_name}: #{mesg}")
920   end
922   #
923   # Subject of #on / #on_head, #accept / #reject
924   #
925   def top
926     @stack[-1]
927   end
929   #
930   # Subject of #on_tail.
931   #
932   def base
933     @stack[1]
934   end
936   #
937   # Pushes a new List.
938   #
939   def new
940     @stack.push(List.new)
941     if block_given?
942       yield self
943     else
944       self
945     end
946   end
948   #
949   # Removes the last List.
950   #
951   def remove
952     @stack.pop
953   end
955   #
956   # Puts option summary into +to+ and returns +to+. Yields each line if
957   # a block is given.
958   #
959   # +to+:: Output destination, which must have method <<. Defaults to [].
960   # +width+:: Width of left side, defaults to @summary_width.
961   # +max+:: Maximum length allowed for left side, defaults to +width+ - 1.
962   # +indent+:: Indentation, defaults to @summary_indent.
963   #
964   def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
965     visit(:summarize, {}, {}, width, max, indent, &(blk || proc {|l| to << l + $/}))
966     to
967   end
969   #
970   # Returns option summary string.
971   #
972   def help; summarize(banner.to_s.sub(/\n?\z/, "\n")) end
973   alias to_s help
975   #
976   # Returns option summary list.
977   #
978   def to_a; summarize(banner.to_a.dup) end
980   #
981   # Checks if an argument is given twice, in which case an ArgumentError is
982   # raised. Called from OptionParser#switch only.
983   #
984   # +obj+:: New argument.
985   # +prv+:: Previously specified argument.
986   # +msg+:: Exception message.
987   #
988   def notwice(obj, prv, msg)
989     unless !prv or prv == obj
990       begin
991         raise ArgumentError, "argument #{msg} given twice: #{obj}"
992       rescue
993         $@[0, 2] = nil
994         raise
995       end
996     end
997     obj
998   end
999   private :notwice
1001   #
1002   # Creates an OptionParser::Switch from the parameters. The parsed argument
1003   # value is passed to the given block, where it can be processed.
1004   #
1005   # See at the beginning of OptionParser for some full examples.
1006   #
1007   # +opts+ can include the following elements:
1008   #
1009   # [Argument style:]
1010   #   One of the following:
1011   #     :NONE, :REQUIRED, :OPTIONAL
1012   #
1013   # [Argument pattern:]
1014   #   Acceptable option argument format, must be pre-defined with
1015   #   OptionParser.accept or OptionParser#accept, or Regexp. This can appear
1016   #   once or assigned as String if not present, otherwise causes an
1017   #   ArgumentError. Examples:
1018   #     Float, Time, Array
1019   #
1020   # [Possible argument values:]
1021   #   Hash or Array.
1022   #     [:text, :binary, :auto]
1023   #     %w[iso-2022-jp shift_jis euc-jp utf8 binary]
1024   #     { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
1025   #
1026   # [Long style switch:]
1027   #   Specifies a long style switch which takes a mandatory, optional or no
1028   #   argument. It's a string of the following form:
1029   #     "--switch=MANDATORY" or "--switch MANDATORY"
1030   #     "--switch[=OPTIONAL]"
1031   #     "--switch"
1032   #
1033   # [Short style switch:]
1034   #   Specifies short style switch which takes a mandatory, optional or no
1035   #   argument. It's a string of the following form:
1036   #     "-xMANDATORY"
1037   #     "-x[OPTIONAL]"
1038   #     "-x"
1039   #   There is also a special form which matches character range (not full
1040   #   set of regular expression):
1041   #     "-[a-z]MANDATORY"
1042   #     "-[a-z][OPTIONAL]" 
1043   #     "-[a-z]"
1044   #
1045   # [Argument style and description:]
1046   #   Instead of specifying mandatory or optional arguments directly in the
1047   #   switch parameter, this separate parameter can be used.
1048   #     "=MANDATORY"
1049   #     "=[OPTIONAL]"
1050   #
1051   # [Description:]
1052   #   Description string for the option.
1053   #     "Run verbosely"
1054   # 
1055   # [Handler:]
1056   #   Handler for the parsed argument value. Either give a block or pass a
1057   #   Proc or Method as an argument.
1058   #
1059   def make_switch(opts, block = nil)
1060     short, long, nolong, style, pattern, conv, not_pattern, not_conv, not_style = [], [], []
1061     ldesc, sdesc, desc, arg = [], [], []
1062     default_style = Switch::NoArgument
1063     default_pattern = nil
1064     klass = 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 {|pat, *v| pattern[pat] = v.fetch(0) {pat}}
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, val, rest = nil
1247     nonopt ||= proc {|a| throw :terminate, a}
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 |sw0|
1302               sw = sw0
1303               sw.block.call(arg) if Switch === sw and sw.match_nonswitch?(arg)
1304             end
1305             nonopt.call(arg)
1306           end
1307         end
1308       end
1310       nil
1311     }
1313     visit(:search, :short, nil) {|sw| sw.block.call(*argv) if !sw.pattern}
1315     argv
1316   end
1317   private :parse_in_order
1319   #
1320   # Parses command line arguments +argv+ in permutation mode and returns
1321   # list of non-option arguments.
1322   #
1323   def permute(*argv)
1324     argv = argv[0].dup if argv.size == 1 and Array === argv[0]
1325     permute!(argv)
1326   end
1328   #
1329   # Same as #permute, but removes switches destructively.
1330   #
1331   def permute!(argv = default_argv)
1332     nonopts = []
1333     order!(argv, &nonopts.method(:<<))
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     @stack.reverse_each do |el|
1411       el.send(id, *args, &block)
1412     end
1413     nil
1414   end
1415   private :visit
1417   #
1418   # Searches +key+ in @stack for +id+ hash and returns or yields the result.
1419   #
1420   def search(id, key)
1421     block_given = block_given?
1422     visit(:search, id, key) do |k|
1423       return block_given ? yield(k) : k
1424     end
1425   end
1426   private :search
1428   #
1429   # Completes shortened long style option switch and returns pair of
1430   # canonical switch and switch descriptor OptionParser::Switch.
1431   #
1432   # +id+::    Searching table.
1433   # +opt+::   Searching key.
1434   # +icase+:: Search case insensitive if true.
1435   # +pat+::   Optional pattern for completion.
1436   #
1437   def complete(typ, opt, icase = false, *pat)
1438     if pat.empty?
1439       search(typ, opt) {|sw| return [sw, opt]} # exact match or...
1440     end
1441     raise AmbiguousOption, catch(:ambiguous) {
1442       visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
1443       raise InvalidOption, opt
1444     }
1445   end
1446   private :complete
1448   #
1449   # Loads options from file names as +filename+. Does nothing when the file
1450   # is not present. Returns whether successfully loaded.
1451   #
1452   # +filename+ defaults to basename of the program without suffix in a
1453   # directory ~/.options.
1454   #
1455   def load(filename = nil)
1456     begin
1457       filename ||= File.expand_path(File.basename($0, '.*'), '~/.options')
1458     rescue
1459       return false
1460     end
1461     begin
1462       parse(*IO.readlines(filename).each {|s| s.chomp!})
1463       true
1464     rescue Errno::ENOENT, Errno::ENOTDIR
1465       false
1466     end
1467   end
1469   #
1470   # Parses environment variable +env+ or its uppercase with splitting like a
1471   # shell.
1472   #
1473   # +env+ defaults to the basename of the program.
1474   #
1475   def environment(env = File.basename($0, '.*'))
1476     env = ENV[env] || ENV[env.upcase] or return
1477     require 'shellwords'
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 {|ss| ss unless ss.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)