OptionParser - no short options or incomplete options

Discussion in 'Ruby' started by Bryan Richardson, Feb 21, 2008.

  1. Hello all,

    Is it possible to force only complete, long options to be used in
    OptionParser? I'm wanting to force users to enter the entire option for
    certain destructive actions...

    I've tried only including a '--long_option' as one of the options, but
    if I use '-l' or even '--lon' as the option it still executes the code
    specified for '--long_option'.

    Any and all help is appreciated!!!

    --
    Bryan
    --
    Posted via http://www.ruby-forum.com/.
    Bryan Richardson, Feb 21, 2008
    #1
    1. Advertising

  2. Bryan Richardson

    7stud -- Guest

    Bryan Richardson wrote:
    > Hello all,
    >
    > Is it possible to force only complete, long options to be used in
    > OptionParser? I'm wanting to force users to enter the entire option for
    > certain destructive actions...
    >
    > I've tried only including a '--long_option' as one of the options, but
    > if I use '-l' or even '--lon' as the option it still executes the code
    > specified for '--long_option'.
    >
    > Any and all help is appreciated!!!
    >
    > --
    > Bryan



    How about:


    require 'optparse'

    val_I_will_use_for_destructive_actions = nil

    opts = OptionParser.new do |opts|
    opts.on('--long_option') do |val|
    val_I_will_use_for_destructive_actions = '--long_option'
    end
    end

    opts.parse!

    if val_I_will_use_for_destructive_actions
    puts 'destroy stuff'
    end
    --
    Posted via http://www.ruby-forum.com/.
    7stud --, Feb 22, 2008
    #2
    1. Advertising

  3. [Note: parts of this message were removed to make it a legal post.]

    Thanks for responding 7stud. However, I'm not clear on how this will solve
    my problem. By typing -l, I'll still execute this option. I've also come
    across the case where if I have an option for --migrate VERSION (required
    input) and I use the option -m, I'll get an error because the version was
    not included. However, if I use -mig, I get no error and a version value of
    nil is passed...

    Please help!

    On Thu, Feb 21, 2008 at 5:11 PM, 7stud -- <> wrote:

    > Bryan Richardson wrote:
    > > Hello all,
    > >
    > > Is it possible to force only complete, long options to be used in
    > > OptionParser? I'm wanting to force users to enter the entire option for
    > > certain destructive actions...
    > >
    > > I've tried only including a '--long_option' as one of the options, but
    > > if I use '-l' or even '--lon' as the option it still executes the code
    > > specified for '--long_option'.
    > >
    > > Any and all help is appreciated!!!
    > >
    > > --
    > > Bryan

    >
    >
    > How about:
    >
    >
    > require 'optparse'
    >
    > val_I_will_use_for_destructive_actions = nil
    >
    > opts = OptionParser.new do |opts|
    > opts.on('--long_option') do |val|
    > val_I_will_use_for_destructive_actions = '--long_option'
    > end
    > end
    >
    > opts.parse!
    >
    > if val_I_will_use_for_destructive_actions
    > puts 'destroy stuff'
    > end
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >
    Bryan Richardson, Feb 24, 2008
    #3
  4. Bryan Richardson

    7stud -- Guest

    Bryan Richardson wrote:
    > Thanks for responding 7stud. However, I'm not clear on how this will
    > solve
    > my problem. By typing -l, I'll still execute this option.


    You've given no reason why forcing your users to type more than they
    have to is required.
    --
    Posted via http://www.ruby-forum.com/.
    7stud --, Feb 25, 2008
    #4
  5. [Note: parts of this message were removed to make it a legal post.]

    I'd just hate for someone to fat-finger a simple option and end up deleting
    an entire database worth of data. Am I overlooking something? Also, what
    if I wanted -l to do one thing, and --long_option to do something
    different? I'm not trying to get on anyone's nerves here, I'm just
    wondering if forcing long options is doable...

    --
    Thanks!
    Bryan

    On Sun, Feb 24, 2008 at 5:20 PM, 7stud -- <> wrote:

    > Bryan Richardson wrote:
    > > Thanks for responding 7stud. However, I'm not clear on how this will
    > > solve
    > > my problem. By typing -l, I'll still execute this option.

    >
    > You've given no reason why forcing your users to type more than they
    > have to is required.
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >
    Bryan Richardson, Feb 25, 2008
    #5
  6. Bryan Richardson

    7stud -- Guest

    Bryan Richardson wrote:
    > I'd just hate for someone to fat-finger a simple option and end up
    > deleting
    > an entire database worth of data. Am I overlooking something? Also,
    > what
    > if I wanted -l to do one thing, and --long_option to do something
    > different? I'm not trying to get on anyone's nerves here, I'm just
    > wondering if forcing long options is doable...
    >
    > --
    > Thanks!
    > Bryan


    Personally, I think all the optparse modules in any language are more
    trouble than they are worth. Invariably, you can examine ARGV yourself
    and come up with a solution quicker than trying to figure out how the
    overly complex optparse modules work.

    In particular, the ruby optparse module appears to have a design flaw:
    it doesn't send the option that was actually entered to the on() method.


    1) This seems to work:

    require 'optparse'

    opts = OptionParser.new do |opts|
    opts.on('--long_option') do |val|
    #destroy stuff
    puts "in first on"
    end

    opts.on('--long_optio') do |val|
    #do nothing
    puts "in 2nd on"
    end
    end

    opts.parse!


    2) Or, you can always do this:

    require 'optparse'

    puts 'start:'
    puts ARGV

    prohibited = ['-l', '--l']

    ARGV.delete_if do |str_in_argv|
    prohibited.include?(str_in_argv)
    end

    puts 'end:'
    puts ARGV

    opts = OptionParser.new do |opts|
    opts.on('--long_option') do |val|
    #destroy stuff
    puts "This won't output for -l or --l short form."
    end
    end

    opts.parse!




    > Also, what
    > if I wanted -l to do one thing, and --long_option to
    > do something different?




    require 'optparse'

    opts = OptionParser.new do |opts|
    opts.on('--long_option') do |val|
    puts 'in first on'
    end

    opts.on('-l') do |val|
    puts 'in 2nd on'
    end
    end

    opts.parse!



    --
    Posted via http://www.ruby-forum.com/.
    7stud --, Feb 25, 2008
    #6
  7. [Note: parts of this message were removed to make it a legal post.]

    Thanks again 7stud. Your suggestions have answered my ultimate question,
    which is "is it possible to have OptionParser only parse on fully matching
    options." The answer obviously seems to be "no."

    I'll be implementing your 2nd suggestion.

    --
    Bryan

    On Sun, Feb 24, 2008 at 8:00 PM, 7stud -- <> wrote:

    > Bryan Richardson wrote:
    > > I'd just hate for someone to fat-finger a simple option and end up
    > > deleting
    > > an entire database worth of data. Am I overlooking something? Also,
    > > what
    > > if I wanted -l to do one thing, and --long_option to do something
    > > different? I'm not trying to get on anyone's nerves here, I'm just
    > > wondering if forcing long options is doable...
    > >
    > > --
    > > Thanks!
    > > Bryan

    >
    > Personally, I think all the optparse modules in any language are more
    > trouble than they are worth. Invariably, you can examine ARGV yourself
    > and come up with a solution quicker than trying to figure out how the
    > overly complex optparse modules work.
    >
    > In particular, the ruby optparse module appears to have a design flaw:
    > it doesn't send the option that was actually entered to the on() method.
    >
    >
    > 1) This seems to work:
    >
    > require 'optparse'
    >
    > opts = OptionParser.new do |opts|
    > opts.on('--long_option') do |val|
    > #destroy stuff
    > puts "in first on"
    > end
    >
    > opts.on('--long_optio') do |val|
    > #do nothing
    > puts "in 2nd on"
    > end
    > end
    >
    > opts.parse!
    >
    >
    > 2) Or, you can always do this:
    >
    > require 'optparse'
    >
    > puts 'start:'
    > puts ARGV
    >
    > prohibited = ['-l', '--l']
    >
    > ARGV.delete_if do |str_in_argv|
    > prohibited.include?(str_in_argv)
    > end
    >
    > puts 'end:'
    > puts ARGV
    >
    > opts = OptionParser.new do |opts|
    > opts.on('--long_option') do |val|
    > #destroy stuff
    > puts "This won't output for -l or --l short form."
    > end
    > end
    >
    > opts.parse!
    >
    >
    >
    >
    > > Also, what
    > > if I wanted -l to do one thing, and --long_option to
    > > do something different?

    >
    >
    >
    > require 'optparse'
    >
    > opts = OptionParser.new do |opts|
    > opts.on('--long_option') do |val|
    > puts 'in first on'
    > end
    >
    > opts.on('-l') do |val|
    > puts 'in 2nd on'
    > end
    > end
    >
    > opts.parse!
    >
    >
    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >
    Bryan Richardson, Feb 25, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. David Geering

    longs, long longs, short short long ints . . . huh?!

    David Geering, Jan 8, 2007, in forum: C Programming
    Replies:
    15
    Views:
    558
    Keith Thompson
    Jan 11, 2007
  2. Replies:
    4
    Views:
    822
    Kaz Kylheku
    Oct 17, 2006
  3. Replies:
    0
    Views:
    407
  4. Adam Penny
    Replies:
    3
    Views:
    235
    Adam Penny
    Oct 18, 2008
  5. Alan Partis
    Replies:
    2
    Views:
    190
    Robert Klemme
    Dec 24, 2008
Loading...

Share This Page