Issue #10021 has been updated by James Byrne.


When I try this:
  
   `--re-run x -r --rerun y -- file`

Then I see this 

   `:in `eval': Only one output filename is permitted (RuntimeError)
`
From which I infer that -r has 'eaten' --rerun as its argument and is treating y as the file name (args[0])

But if I do this:

  `--re-run x -re-run --rerun y -- file 
`
Then the program runs.  I exposed the structures with a debug routine and this is what they show:

`Options before parsing with --debug
Number of arguments passed: 8
Arguments passed are:
---
- "--debug"
- "--re-run"
- x
- "-re-run"
- "--rerun"
- y
- "--"
- file
Argument object contains:
["--debug", "--re-run", "x", "-re-run", "--rerun", "y", "--", "file"]`

----------------------------------------
Bug #10021: OptParse does not handle missing arguments bracketed by valid option switches 
https://bugs.ruby-lang.org/issues/10021#change-47669

* Author: James Byrne
* Status: Open
* Priority: Normal
* Assignee: 
* Category: core
* Target version: 
* ruby -v: Ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux-gnu]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
OS=CentOS-6.5 x86_64
Ruby=2.1.2p95

I have this in an optparse structure:

      # Create parser
      opts = OptionParser.new do |opts|
        opts.banner = <<-BANNER
. . .
        opts.on("-r", "--rerun=DATEorTRANSACTION", "--re-run=DATEorTRANSACTION",
                "Re-run extract for specific date (yyyymmdd)",
                "  or transaction number (SSSSSNNNNNNNNC).",
                "  Multiple specifications are ORed for selections.",
                "  All billable transactions are selectable",
                "  whether previously billed or not.",
                "  Sets and enforces --no-update" ) do |rr|
          options.rerun << rr
          options.update = false
        end
. . .


If I run a program incorporating this option class so:

  --re-run x --rerun y -r

Then I see this:

  missing argument: -r

However, if I do this:

  --re-run x --rerun y -r --debug

or this

  --re-run x -r --rerun y

Then the program runs and does not report the missing argument.  

Is this the intended behaviour?  It does not seem correct to me.



-- 
https://bugs.ruby-lang.org/