diff --git a/lib/optparse.rb b/lib/optparse.rb index 238fa1e..4da233e 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -1148,6 +1148,7 @@ def initialize(banner = nil, width = 32, indent = ' ' * 4) @summary_indent = indent @default_argv = ARGV @require_exact = false + @raise_unknown = true add_officious yield self if block_given? end @@ -1225,6 +1226,9 @@ def self.reject(*args, &blk) top.reject(*args, &blk) end # abbreviated long option as short option). attr_accessor :require_exact + # Whether to raise at unknown option. + attr_accessor :raise_unknown + # # Heading banner preceding summary. # @@ -1639,9 +1643,11 @@ def parse_in_order(argv = default_argv, setter = nil, &nonopt) # :nodoc: begin sw, = complete(:long, opt, true) if require_exact && !sw.long.include?(arg) + throw :terminate, arg unless raise_unknown raise InvalidOption, arg end rescue ParseError + throw :terminate, arg unless raise_unknown raise $!.set_option(arg, true) end begin @@ -1673,6 +1679,7 @@ def parse_in_order(argv = default_argv, setter = nil, &nonopt) # :nodoc: end end rescue ParseError + throw :terminate, arg unless raise_unknown raise $!.set_option(arg, true) end begin diff --git a/test/optparse/test_optparse.rb b/test/optparse/test_optparse.rb index 5f5ea18..285c4a5 100644 --- a/test/optparse/test_optparse.rb +++ b/test/optparse/test_optparse.rb @@ -98,6 +98,18 @@ def test_require_exact assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-z foo))} end + def test_raise_unknown + @opt.def_option('--foo [ARG]') {|arg| @foo = arg} + assert @opt.raise_unknown + + @opt.raise_unknown = false + assert_equal(%w[--bar], @opt.parse(%w[--foo --bar])) + assert_nil(@foo) + + assert_equal(%w[--bar], @opt.parse(%w[--foo x --bar])) + assert_equal("x", @foo) + end + def test_nonopt_pattern @opt.def_option(/^[^-]/) do |arg| assert(false, "Never gets called")