From a1e6472d07451770ba19d958f49e423b05ca647a Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Sat, 3 Jun 2017 11:48:05 +0200 Subject: [PATCH] Support specifying values for combined options --- lib/cri/option_parser.rb | 5 +--- test/test_option_parser.rb | 53 +++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/lib/cri/option_parser.rb b/lib/cri/option_parser.rb index b104e60..561bc58 100644 --- a/lib/cri/option_parser.rb +++ b/lib/cri/option_parser.rb @@ -223,10 +223,7 @@ def handle_dash_option(e) definition = @definitions.find { |d| d[:short] == option_key } raise IllegalOptionError.new(option_key) if definition.nil? - if option_keys.length > 1 && definition[:argument] == :required - # This is a combined option and it requires an argument, so complain - raise OptionRequiresAnArgumentError.new(option_key) - elsif %i[required optional].include?(definition[:argument]) + if %i[required optional].include?(definition[:argument]) # Get option value option_value = find_option_value(definition, option_key) diff --git a/test/test_option_parser.rb b/test/test_option_parser.rb index 55aa8a1..c2969b9 100644 --- a/test/test_option_parser.rb +++ b/test/test_option_parser.rb @@ -171,16 +171,19 @@ def test_parse_with_short_combined_valueless_options end def test_parse_with_short_combined_valueful_options_with_missing_value - input = %w[foo -abc bar] + input = %w[foo -abc bar qux] definitions = [ { long: 'aaa', short: 'a', argument: :required }, { long: 'bbb', short: 'b', argument: :forbidden }, { long: 'ccc', short: 'c', argument: :forbidden }, ] - assert_raises(Cri::OptionParser::OptionRequiresAnArgumentError) do - Cri::OptionParser.parse(input, definitions) - end + parser = Cri::OptionParser.parse(input, definitions) + + assert_equal('bar', parser.options[:aaa]) + assert(parser.options[:bbb]) + assert(parser.options[:ccc]) + assert_equal(%w[foo qux], parser.arguments) end def test_parse_with_two_short_valueful_options @@ -337,5 +340,47 @@ def test_parse_with_default_optional_value_and_arg assert_equal({ animal: 'gi' }, parser.options) assert_equal(%w[foo raffe], parser.arguments) end + + def test_parse_with_combined_required_options + input = %w[foo -abc xxx yyy zzz] + definitions = [ + { long: 'aaa', short: 'a', argument: :forbidden }, + { long: 'bbb', short: 'b', argument: :required }, + { long: 'ccc', short: 'c', argument: :required }, + ] + + parser = Cri::OptionParser.parse(input, definitions) + + assert_equal({ aaa: true, bbb: 'xxx', ccc: 'yyy' }, parser.options) + assert_equal(%w[foo zzz], parser.arguments) + end + + def test_parse_with_combined_optional_options + input = %w[foo -abc xxx yyy zzz] + definitions = [ + { long: 'aaa', short: 'a', argument: :forbidden }, + { long: 'bbb', short: 'b', argument: :optional }, + { long: 'ccc', short: 'c', argument: :required }, + ] + + parser = Cri::OptionParser.parse(input, definitions) + + assert_equal({ aaa: true, bbb: 'xxx', ccc: 'yyy' }, parser.options) + assert_equal(%w[foo zzz], parser.arguments) + end + + def test_parse_with_combined_optional_options_with_missing_value + input = %w[foo -abc xxx] + definitions = [ + { long: 'aaa', short: 'a', argument: :forbidden }, + { long: 'bbb', short: 'b', argument: :required }, + { long: 'ccc', short: 'c', argument: :optional, default: 'c default' }, + ] + + parser = Cri::OptionParser.parse(input, definitions) + + assert_equal({ aaa: true, bbb: 'xxx', ccc: 'c default' }, parser.options) + assert_equal(%w[foo], parser.arguments) + end end end