diff options
author | Nobuyoshi Nakada <[email protected]> | 2022-10-30 00:36:19 +0900 |
---|---|---|
committer | git <[email protected]> | 2022-11-28 14:24:06 +0000 |
commit | 0bfb185654b13237b874dc00d5719e695416b711 (patch) | |
tree | e5e0e9303e961d7642a5b939c6f405e62d24893b | |
parent | dcf94e719c6fca527f219a4c9fa79e13fd3d4484 (diff) |
[ruby/optparse] Add `raise_unknown` flag
(https://github.com/ruby/optparse/pull/38)
https://github.com/ruby/optparse/commit/12529653cd
-rw-r--r-- | lib/optparse.rb | 7 | ||||
-rw-r--r-- | test/optparse/test_optparse.rb | 12 |
2 files changed, 19 insertions, 0 deletions
diff --git a/lib/optparse.rb b/lib/optparse.rb index 7ddde82342..7cc7d10982 100644 --- a/lib/optparse.rb +++ b/lib/optparse.rb @@ -1148,6 +1148,7 @@ XXX @summary_indent = indent @default_argv = ARGV @require_exact = false + @raise_unknown = true add_officious yield self if block_given? end @@ -1225,6 +1226,9 @@ XXX # 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 @@ XXX 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 @@ XXX 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 5f5ea183b0..285c4a5d1b 100644 --- a/test/optparse/test_optparse.rb +++ b/test/optparse/test_optparse.rb @@ -98,6 +98,18 @@ class TestOptionParser < Test::Unit::TestCase 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") |