# Lost with OptionParser

**URL:** <https://www.ruby-forum.com/t/lost-with-optionparser/142061>\
**Category:** Ruby\
**Created:** [July 3, 2008, 2:57am UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061 "2008-07-03T02:57:37Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 2:57am UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/1 "2008-07-03T02:57:37Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 5:07am UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/2 "2008-07-03T05:07:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 5:51am UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/3 "2008-07-03T05:51:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 7:27pm UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/4 "2008-07-03T19:27:21Z")

</div>

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:in`call’  
/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:in`run’  
/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:in`run’  
/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:in`Main’

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 7:33pm UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/5 "2008-07-03T19:33:48Z")

</div>

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!

😉

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 9:03pm UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/6 "2008-07-03T21:03:02Z")

</div>

On Jul 3, 12:29 pm, “ara.t.howard” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

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

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.

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 6:05am UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/7 "2008-07-03T06:05:40Z")

</div>

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/](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/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![S-gw](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ed655f/32.png) [@S-gw](https://www.ruby-forum.com/u/S-gw)\
**Post date:** [July 3, 2008, 10:05pm UTC](https://www.ruby-forum.com/t/lost-with-optionparser/142061/8 "2008-07-03T22:05:13Z")

</div>

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…

😉

a @ [http://codeforpeople.com/](http://codeforpeople.com/)
