Lost with OptionParser

I’m having a real problem understanding OptionParser – the docs in
pickaxe are rather cryptic, Ruby Way doesn’t even talk about it, and all
the Q&A I can find on the web doesn’t clear it up for me.

I’ve gotten this far:

test.rb ---------

require ‘optparse’

commands = OptionParser.new
commands.on("-h", “–help”) # more or less, I get the .on stuff
commands.on("-e=RUN_ENV")

commands.parse(ARGV)

puts commands

---------

That will dump a display of the commands, but for the life of me, I
can’t figure out how to determine which options were actually submitted.
And if the -e param was supplied, what’s its value is.

I have seen:

commands.parse(ARGV)
commands.parse!(ARGV)
options = commands.parse(ARGV)

So, confused by that to start with, then really confused by where the
parsed commands are, and what format they’re in.

– gw

Here is a quick example program. Hope this gets you started.

#!/usr/bin/env ruby
require ‘optparse’

options = {}
opts = OptionParser.new
opts.on("-W", “–weekday”, “Print out the weekday”) do |v|
options[:weekday] = true
end
opts.on("-H", “–hour TYPE”, “Print out the hour in 24 or 12 hour
clock”) do |v|
options[:hour] = v
end

opts.parse!

unless options[:weekday] || options[:hour]
puts opts
exit
end

if options[:weekday]
puts Time.now.strftime("%A")
exit
end

case options[:hour]
when “12”
puts Time.now.strftime("%I")
when “24”
puts Time.now.strftime("%H")
else
puts “You must send 12 or 24 as an argument to --hour”
end

dusty wrote:

Here is a quick example program. Hope this gets you started.

Yes! That turned out to be the Rosetta Stone to help me interpret and
fill the gaps in the other examples I’ve found.

Many thanks.

– gw

I love Main, but it does not seem to work under JRuby, any ideas?

This is the error I always get…

F, [2008-07-03T10:24:48.827600 #9761] FATAL – : could not reopen: null
(IOError)
/opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:318:in
setup_io_restoration' /opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:318:incall’
/opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:318:in
finalize' /opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:29:inrun’
/opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:12:in
catch' /opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:12:inrun’
/opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/factories.rb:11:in
run' /opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/factories.rb:16:inMain’

On Jul 3, 2008, at 11:22 AM, Jim M. wrote:

/opt/jruby-1.1.2/lib/ruby/gems/1.8/gems/main-2.8.0/lib/main/base.rb:
factories.rb:16:in `Main’
it should be able to do - might take some hacking to deal with
different handling of stdout/stderr/stdin. patches welcome!

:wink:

a @ http://codeforpeople.com/

On Jul 3, 12:29 pm, “ara.t.howard” [email protected] wrote:

it should be able to do - might take some hacking to deal with
different handling of stdout/stderr/stdin. patches welcome!

:wink:

I’ll consider writing the patches after you write the specs.

And by “specs” I mean actual specs, not a load of numbered tests. I
was disappointed there was no test_420, btw.

On Jul 2, 2008, at 6:54 PM, Greg W. wrote:

commands = OptionParser.new
can’t figure out how to determine which options were actually
parsed commands are, and what format they’re in.

– gw

Posted via http://www.ruby-forum.com/.

cfp:~ > cat a.rb
require ‘yaml’
require ‘rubygems’ ### gem install rubygems
require ‘main’

Main {
option(‘environment’, ‘e’){
synopsis ‘specify run time environment’
default ‘development’
argument :required
validate{|arg| %w[ production development test ].include? arg}
}

def run
environment = params[‘environment’]

 y :given => environment.given?,
   :value => environment.value

end
}

cfp:~ > ruby a.rb

:value: development
:given:

cfp:~ > ruby a.rb --environment=foobar
invalid: option(–environment)=“foobar”

cfp:~ > ruby a.rb --environment=test

:value: test
:given: true

cfp:~ > ruby a.rb --help
NAME
a.rb

SYNOPSIS
a.rb [options]+

DESCRIPTION
main.rb takes the pain of argument parsing away

PARAMETERS
specify run time environment
–help, -h

the packages ships with a tons of examples.

a @ http://codeforpeople.com/

On Jul 3, 2008, at 12:59 PM, Yossef M. wrote:

I’ll consider writing the patches after you write the specs.

And by “specs” I mean actual specs, not a load of numbered tests. I
was disappointed there was no test_420, btw.

heh - well i’ve got about 51 projects on rubyforge attm, nearly all of
them pre-dating bacon and co. if anyone wants to help migrate the
tests… i’ve got some old perl code that needs ported to ruby too.
and a stack of svn projects which need moved to github…

:wink:

a @ http://codeforpeople.com/