Forum: Ruby optparse "invalid option" problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Michael K. (Guest)
on 2006-05-30 19:53
(Received via mailing list)
Hi,

'optparse' seems to continue parsing even after the first invalid
argument.

example.rb:

require 'optparse'

ARGV.options do |opts|
   opts.separator  "Required:"
   opts.on("-f", "--ffmpeg PATH", String, "ffmpeg's path") { |val|
ffmpeg = val }
end

leftOver = ARGV.parse!
p leftOver



 > example.rb -f ./ffmpeg Tool/to/call/from/example.rb

works as expected (leftOver contains "Tool/to/call/from/example.rb"),
but


 > example.rb -f ./ffmpeg Tool/to/call/from/example.rb --toolsOption
value

raises "invalid option: --toolsOption"

instead of pushing "Tool/to/call/from/example.rb", "--toolsOption"
and "value" into leftOver



Is there a way to tell optparse that everything after the first
unknown argument is ignored and pushed into the resulting array?

Thanks!

   Michael
Anton 'tony' Bangratz (Guest)
on 2006-05-30 20:06
(Received via mailing list)
Michael K. wrote:
> Hi,

Hello,

> = val }
>
>
>> example.rb -f ./ffmpeg Tool/to/call/from/example.rb --toolsOption value
>
> raises "invalid option: --toolsOption"
>
> instead of pushing "Tool/to/call/from/example.rb", "--toolsOption" and
> "value" into leftOver
>

That's how it's supposed to work: you can catch the error, or ...

>
>
> Is there a way to tell optparse that everything after the first unknown
> argument is ignored and pushed into the resulting array?
>


Not automatically, but you can try:

example.rb -f ./ffmpeg Tool/to/call/from/example.rb -- --toolsOption\
value

=> ["Tool/to/call/from/example.rb", "--toolsOption", "value"]

or you can quote the argument as a whole and split it later:


example.rb -f ./ffmpeg Tool/to/call/from/example.rb "--toolsOption\
value"

=> ["Tool/to/call/from/example.rb  --toolsOption value"]

HTH,

t.
Michael K. (Guest)
on 2006-05-30 20:31
(Received via mailing list)
Hi tony,

if I use order!() instead of parse!() then it works the way I need

I took a look in optparse.rb (that's why i love open source :-) :

  def parse!(argv = ARGV)
     if ENV.include?('POSIXLY_CORRECT')
       order!(argv)
     else
       permute!(argv)
     end
   end

and POSIXLY_CORRECT' is not set on my system...



Thanks for your help.

   Michael
unknown (Guest)
on 2006-05-30 20:31
(Received via mailing list)
Hi,

At Wed, 31 May 2006 01:03:56 +0900,
Anton 'tony' Bangratz wrote in [ruby-talk:195197]:
> > "value" into leftOver
optparse has two modes, permutation and in-order.  It is
permutation mode by default, and in-order mode if the
environment variable POSIXLY_CORRECT is set.


> > Is there a way to tell optparse that everything after the first unknown
> > argument is ignored and pushed into the resulting array?

ARGV.order!
Logan C. (Guest)
on 2006-05-30 21:27
(Received via mailing list)
On May 30, 2006, at 12:29 PM, Michael K. wrote:

>       permute!(argv)
>
And here's how I did it, not bothering to look at the source

( warning: Excessive sillyness follows)

% cat oparse.rb
args = ARGV.dup
cc = callcc { |x| x }
begin
   old_verbose = $VERBOSE
   $VERBOSE = nil
   require 'optparse'
ensure
   $VERBOSE = old_verbose
end


ARGV.options do |opts|
   opts.separator  "Required:"
   opts.on("-f", "--ffmpeg PATH", String, "ffmpeg's path") { |val|
ffmpeg = val }
end

begin
leftOver = ARGV.parse!
rescue OptionParser::InvalidOption => ex
i = nil
args.each_with_index do |v, idx|
    if v == ex.args.first
      i = idx
      break
    end
end

args.insert(i, "--")
begin
    old_verbose = $VERBOSE
    $VERBOSE = nil
    ARGV = args
ensure
    $VERBOSE = old_verbose
end
$LOADED_FEATURES.delete('optparse.rb')
cc.call
end

p leftOver

% ruby oparse.rb
["Tool/to/call/from/example.rb", "--toolsOption", "value"]
This topic is locked and can not be replied to.