Feature #11523 ยป optparse-require-exact.patch
| lib/optparse.rb | ||
|---|---|---|
| 
         @summary_width = width 
   | 
||
| 
         @summary_indent = indent 
   | 
||
| 
         @default_argv = ARGV 
   | 
||
| 
         @require_exact = false 
   | 
||
| 
         add_officious 
   | 
||
| 
         yield self if block_given? 
   | 
||
| 
       end 
   | 
||
| ... | ... | |
| 
       # Strings to be parsed in default. 
   | 
||
| 
       attr_accessor :default_argv 
   | 
||
| 
       # Whether to require that options match exactly (disallows providing 
   | 
||
| 
       # abbreviated long option as short option). 
   | 
||
| 
       attr_accessor :require_exact 
   | 
||
| 
       # 
   | 
||
| 
       # Heading banner preceding summary. 
   | 
||
| 
       # 
   | 
||
| ... | ... | |
| 
               opt.tr!('_', '-') 
   | 
||
| 
               begin 
   | 
||
| 
                 sw, = complete(:long, opt, true) 
   | 
||
| 
                 if require_exact && !sw.long.include?(arg) 
   | 
||
| 
                   raise InvalidOption, arg 
   | 
||
| 
                 end 
   | 
||
| 
               rescue ParseError 
   | 
||
| 
                 raise $!.set_option(arg, true) 
   | 
||
| 
               end 
   | 
||
| ... | ... | |
| 
                     val = arg.delete_prefix('-') 
   | 
||
| 
                     has_arg = true 
   | 
||
| 
                   rescue InvalidOption 
   | 
||
| 
                     raise if require_exact 
   | 
||
| 
                     # if no short options match, try completion with long 
   | 
||
| 
                     # options. 
   | 
||
| 
                     sw, = complete(:long, opt) 
   | 
||
| test/optparse/test_optparse.rb | ||
|---|---|---|
| 
         assert_equal({host: "localhost", port: 8000, verbose: true}, result) 
   | 
||
| 
         assert_equal(true, @verbose) 
   | 
||
| 
       end 
   | 
||
| 
       def test_require_exact 
   | 
||
| 
         @opt.def_option('-F', '--irs=IRS', 'irs') 
   | 
||
| 
         %w(--irs --ir --i -ifoo -i -F -Ffoo).each do |arg| 
   | 
||
| 
           result = {} 
   | 
||
| 
           @opt.parse([arg, 'foo'], into: result) 
   | 
||
| 
           assert_equal({irs: 'foo'}, result) 
   | 
||
| 
         end 
   | 
||
| 
         @opt.require_exact = true 
   | 
||
| 
         %w(--irs -F -Ffoo).each do |arg| 
   | 
||
| 
           result = {} 
   | 
||
| 
           @opt.parse([arg, 'foo'], into: result) 
   | 
||
| 
           assert_equal({irs: 'foo'}, result) 
   | 
||
| 
         end 
   | 
||
| 
         assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(--ir foo))} 
   | 
||
| 
         assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(--i foo))} 
   | 
||
| 
         assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-irs foo))} 
   | 
||
| 
         assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-ir foo))} 
   | 
||
| 
         assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-i foo))} 
   | 
||
| 
       end 
   | 
||
| 
     end 
   | 
||