diff options
author | Lee Jarvis <leejarvis@fastmail.com> | 2016-04-15 10:21:33 +0100 |
---|---|---|
committer | Lee Jarvis <leejarvis@fastmail.com> | 2016-04-15 10:21:33 +0100 |
commit | 34af9a160fc1d234bb4b5954845ace84dd7e3057 (patch) | |
tree | 9adb41989b1ef1f982a0a0c2390648dbc215e392 | |
parent | c77f3c3d0ce9fcda28f3df3a789c166c622d16ee (diff) | |
parent | 7f6aef195716989d8fb7e66b1ca52e348551b67a (diff) | |
download | slop-34af9a160fc1d234bb4b5954845ace84dd7e3057.tar.gz |
Merge pull request #192 from aclemons/leading_dash
Support arguments to options with leading -
-rw-r--r-- | lib/slop/parser.rb | 10 | ||||
-rw-r--r-- | lib/slop/types.rb | 4 | ||||
-rw-r--r-- | test/parser_test.rb | 21 |
3 files changed, 32 insertions, 3 deletions
diff --git a/lib/slop/parser.rb b/lib/slop/parser.rb index ea1869e..0b33d55 100644 --- a/lib/slop/parser.rb +++ b/lib/slop/parser.rb @@ -43,7 +43,8 @@ module Slop @arguments = strings.dup - pairs.each do |flag, arg| + pairs.each_with_index do |pair, idx| + flag, arg = pair break if !flag # ignore everything after '--', flag or not @@ -54,6 +55,7 @@ module Slop # support `foo=bar` orig_flag = flag.dup + orig_arg = arg if flag.include?("=") flag, arg = flag.split("=") end @@ -63,6 +65,12 @@ module Slop # arguments (plus the arg if necessary) # delete argument first while we can find its index. if opt.expects_argument? + + # if we consumed the argument, remove the next pair + if orig_arg == opt.value.to_s + pairs.delete_at(idx + 1) + end + arguments.each_with_index do |argument, i| if argument == orig_flag && !orig_flag.include?("=") arguments.delete_at(i + 1) diff --git a/lib/slop/types.rb b/lib/slop/types.rb index 7e80544..b7e41c8 100644 --- a/lib/slop/types.rb +++ b/lib/slop/types.rb @@ -44,7 +44,7 @@ module Slop # Cast the option argument to an Integer. class IntegerOption < Option def call(value) - value =~ /\A\d+\z/ && value.to_i + value =~ /\A-?\d+\z/ && value.to_i end end IntOption = IntegerOption @@ -53,7 +53,7 @@ module Slop class FloatOption < Option def call(value) # TODO: scientific notation, etc. - value =~ /\A\d*\.*\d+\z/ && value.to_f + value =~ /\A-?\d*\.*\d+\z/ && value.to_f end end diff --git a/test/parser_test.rb b/test/parser_test.rb index 1099871..339a522 100644 --- a/test/parser_test.rb +++ b/test/parser_test.rb @@ -22,6 +22,27 @@ describe Slop::Parser do assert_equal 123, @result[:port] end + it "parses arg with leading -" do + @options.string "-t", "--text" + @result.parser.parse %w(--name=bob --text --sometext) + assert_equal "bob", @result[:name] + assert_equal "--sometext", @result[:text] + end + + it "parses negative integer" do + @options.integer "-p", "--port" + @result.parser.parse %w(--name=bob --port -123) + assert_equal "bob", @result[:name] + assert_equal(-123, @result[:port]) + end + + it "parses negative float" do + @options.float "-m", "--multiple" + @result.parser.parse %w(--name=bob -m -123.987) + assert_equal "bob", @result[:name] + assert_equal(-123.987, @result[:multiple]) + end + describe "parsing grouped short flags" do before do @options.bool "-q", "--quiet" |