[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

GetoptLong example

Steve Litt

12/15/2005 12:39:00 AM

Hi all,

Anyone have a short and easy GetoptLong example in Ruby? It's not
object oriented in Perl or C, so I'm in unfamiliar territory.

Thanks

SteveT

Steve Litt
http://www.troublesh...
slitt@troubleshooters.com


12 Answers

Steve Litt

12/15/2005 1:43:00 AM

0

On Wednesday 14 December 2005 07:38 pm, Steve Litt wrote:
> Hi all,
>
> Anyone have a short and easy GetoptLong example in Ruby? It's not
> object oriented in Perl or C, so I'm in unfamiliar territory.
>
> Thanks
>
> SteveT
>
> Steve Litt
> http://www.troublesh...
> slitt@troubleshooters.com


Hi all,

I cruised the net, found an example, and turned it into a small
program that works. So if anyone wants to use GetoptLong, here it
is:

#!/usr/bin/ruby
require "getoptlong"

getoptlong = GetoptLong.new(
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
[ '--short', '-s', GetoptLong::OPTIONAL_ARGUMENT ],
[ '--offset', '-o', GetoptLong::REQUIRED_ARGUMENT ]
)


def usage()
puts "Usage:"
puts "myprog [--help] [--short optional_arg] [--offset
required_arg]"
end

short_arg = nil # declare local var to store arg
offset_arg = nil # declare local var to store arg

begin
getoptlong.each do |opt, arg|
case opt
when "--help"
puts "dia help"
when "--short"
print "Short option. Arg is=>"
print arg
short_arg = arg
print "<\n"
when "--offset"
print "Offset option. Arg is=>"
print arg
offset_arg = arg
print "<\n"
end
end
rescue StandardError=>my_error_message
puts
puts my_error_message
usage()
puts
exit
end

unless short_arg == ""
puts
print "Short arg is=>"
print short_arg
puts "<"
end

print "Offset arg is=>"
print offset_arg
puts "<"




Steve Litt
http://www.troublesh...
slitt@troubleshooters.com


Nick Sieger

12/15/2005 4:10:00 AM

0

On 12/14/05, Steve Litt <slitt@earthlink.net> wrote:
> Hi all,
>
> Anyone have a short and easy GetoptLong example in Ruby? It's not
> object oriented in Perl or C, so I'm in unfamiliar territory.

Funny I was just in the same position yesterday. A google of "ruby
getoptlong" gave this as the second link, which is how I got on with
it:

http://www.linuxdevcenter.com/pub/a/linux/2003/09/18/ruby_csv.h...

Cheers,
/Nick


Jim Freeze

12/15/2005 12:32:00 PM

0

On 12/14/05, Nick Sieger <nicksieger@gmail.com> wrote:
> On 12/14/05, Steve Litt <slitt@earthlink.net> wrote:
> > Hi all,
> >
> > Anyone have a short and easy GetoptLong example in Ruby? It's not
> > object oriented in Perl or C, so I'm in unfamiliar territory.

Have you tried OptionParser? It is fully OO and integrated with Application

Steve Litt

12/15/2005 1:48:00 PM

0

On Thursday 15 December 2005 07:32 am, Jim Freeze wrote:
> On 12/14/05, Nick Sieger <nicksieger@gmail.com> wrote:
> > On 12/14/05, Steve Litt <slitt@earthlink.net> wrote:
> > > Hi all,
> > >
> > > Anyone have a short and easy GetoptLong example in Ruby? It's
> > > not object oriented in Perl or C, so I'm in unfamiliar
> > > territory.
>
> Have you tried OptionParser? It is fully OO and integrated with
> Application.
>
> Yes, that was the sound of my own horn. :)
>
> I know CommandLine cannot solve everyones needs, but I would be
> interested to hear about it if it doesn't meet your needs. Maybe
> there is something I can change or add to the library.
>
> My nefarious global take over plans are to see CommandLine -
> which has a Ruby flavor - be put in the stdlib and surplant the
> existing optparse and getoptlong parsers which use aging
> methodologies.

Hi Jim,

I came across OptionParser. I tried reading the documentation, but I
saw no simple proof of concept to get me started. I therefore opted
for GetoptLong. At least it's not a total stranger, I've used it in
C and Perl.

Perhaps I just came across the wrong documentation.

I'd like to have the OptionParser documentation contain a proof of
concept, and a couple more examples that follow logically, without
skipping steps.



Thanks

SteveT

Steve Litt
http://www.troublesh...
slitt@troubleshooters.com


Wybo Dekker

12/15/2005 3:00:00 PM

0

Jim Freeze

12/15/2005 3:06:00 PM

0

Hi Steve

On 12/15/05, Steve Litt <slitt@earthlink.net> wrote:
> I came across OptionParser. I tried reading the documentation, but I
> saw no simple proof of concept to get me started. I therefore opted
> for GetoptLong. At least it's not a total stranger, I've used it in
> C and Perl.
>
> Perhaps I just came across the wrong documentation.
>
> I'd like to have the OptionParser documentation contain a proof of
> concept, and a couple more examples that follow logically, without
> skipping steps.

Is this the documentation that you are referring to that needs improvement:

http://rubyforge.org/docman/view.php/632/233/posted-docs....

Please help me out and post some comments on what you like and don't
like. I am still making improvements in the docs.


--
Jim Freeze


Steve Litt

12/15/2005 6:01:00 PM

0

On Thursday 15 December 2005 10:06 am, Jim Freeze wrote:
> Hi Steve
>
> On 12/15/05, Steve Litt <slitt@earthlink.net> wrote:
> > I came across OptionParser. I tried reading the documentation,
> > but I saw no simple proof of concept to get me started. I
> > therefore opted for GetoptLong. At least it's not a total
> > stranger, I've used it in C and Perl.
> >
> > Perhaps I just came across the wrong documentation.
> >
> > I'd like to have the OptionParser documentation contain a proof
> > of concept, and a couple more examples that follow logically,
> > without skipping steps.
>
> Is this the documentation that you are referring to that needs
> improvement:
>
>
> http://rubyforge.org/docman/view.php/632/233/posted-doc...
>ml
>
> Please help me out and post some comments on what you like and
> don't like. I am still making improvements in the docs.

Hi Jim,

I'm pretty sure those are the docs I couldn't fathom. IMHO what you
need is a quickstart -- all code, no theory. Start with the
simplest possible program that the user can paste into his editor
and then give him the command line to run, and show the expected
output.

I think the idea is to get the user to say "hey, I can do this".
Once he's hooked, he has incentive to dig into the incredibly rich
array of tools you offer.

Personally, when I write documentation on Troubleshooters.Com, I
always start with a "Hello World" and then, one feature at a time,
I move from the known to the unknown (my wife's a teacher :-).

Another thing. I usually show full programs (in blue background) so
the user can paste them into his editor and run them immediately,
and then the expected results in yellow background so the user can
compare his results to the expected results. Once the user sees
both the code and the results, he can then figure out why it works
like it does, and he can also experiment with the code to learn
even more.

For an example of how I write my documentation, see this:

http://www.troublesh.../codecorn/ruby/basictu...

Please keep in mind that I'm displaying this as an example of my
documentation methods, not as an example of particularly good Ruby
documentation. I wrote most of this material with less than a
week's Ruby experience, and before I signed up with this mailing
list. In fact, a companion document called "Ruby the Right Way" was
my reason for my "They say I write Ruby like Perl" post.

If any of you have the book "Samba Unleashed", the chapters with my
name on them are another good example of my documentation methods.

In summary -- IMHO a quickstart would be the catalyst to greater
acceptance of OptionParser. Use whole but tiny programs, without
error checking and the like, to make your points. That way the user
can cut and paste right onto his box and follow your examples on
his own. Within 10 minutes the user understands the power of
OptionParser and is ready to learn more.

Thanks

SteveT

Steve Litt
http://www.troublesh...
slitt@troubleshooters.com


Jim Freeze

12/15/2005 10:51:00 PM

0

On 12/14/05, Steve Litt <slitt@earthlink.net> wrote:
>
> I cruised the net, found an example, and turned it into a small
> program that works. So if anyone wants to use GetoptLong, here it
> is:
>
> #!/usr/bin/ruby
> require "getoptlong"
>
> getoptlong = GetoptLong.new(
> [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
> [ '--short', '-s', GetoptLong::OPTIONAL_ARGUMENT ],
> [ '--offset', '-o', GetoptLong::REQUIRED_ARGUMENT ]
> )
>
>
> def usage()
> puts "Usage:"
> puts "myprog [--help] [--short optional_arg] [--offset
> required_arg]"
> end
>
> short_arg = nil # declare local var to store arg
> offset_arg = nil # declare local var to store arg
>
> begin
> getoptlong.each do |opt, arg|
> case opt
> when "--help"
> puts "dia help"
> when "--short"
> print "Short option. Arg is=>"
> print arg
> short_arg = arg
> print "<\n"
> when "--offset"
> print "Offset option. Arg is=>"
> print arg
> offset_arg = arg
> print "<\n"
> end
> end
> rescue StandardError=>my_error_message
> puts
> puts my_error_message
> usage()
> puts
> exit
> end
>
> unless short_arg == ""
> puts
> print "Short arg is=>"
> print short_arg
> puts "<"
> end
>
> print "Offset arg is=>"
> print offset_arg
> puts "<"

Here is the above code re-writen using CommandLine as
requested by Steve. It is a fully working example.

require 'rubygems'
require 'commandline'

class App < CommandLine::Application
def initialize
synopsis "[-d] [-s [opt_arg]] [-o req_arg]"
short_description "A sample program"
option :names => %w(-short -s),
:arity => [0,1],
:arg_description => "opt_arg"
:opt_found => get_arg,
:opt_not_found => nil

option :names => %w(--offset -o),
:arg_description => "req_arg",
:opt_found => get_args

option :help
end

def main
puts "Short arg is=>#{opt["--short"]}<" unless opt["--short"].nil?
puts "Offset arg is=>#{opt["--offset"]}<"
end

end#class App


--
Jim Freeze


Steve Litt

12/15/2005 11:20:00 PM

0

On Thursday 15 December 2005 05:50 pm, Jim Freeze wrote:

> Here is the above code re-writen using CommandLine as
> requested by Steve. It is a fully working example.
>
> require 'rubygems'
> require 'commandline'
>
> class App < CommandLine::Application
> def initialize
> synopsis "[-d] [-s [opt_arg]] [-o req_arg]"
> short_description "A sample program"
> option :names => %w(-short -s),
>
> :arity => [0,1],
> :arg_description => "opt_arg"
> :opt_found => get_arg,
> :opt_not_found => nil
>
> option :names => %w(--offset -o),
>
> :arg_description => "req_arg",
> :opt_found => get_args
>
> option :help
> end
>
> def main
> puts "Short arg is=>#{opt["--short"]}<" unless
> opt["--short"].nil? puts "Offset arg is=>#{opt["--offset"]}<"
> end
>
> end#class App

The preceding has a couple typos that keep it from running. The
following cures the typos, and also adds an argument called
"--myflag" that is a flag that can go on or off, but errors out if
you try to give it an argument:

#!/usr/bin/env ruby
require 'rubygems'
require 'commandline'

class App < CommandLine::Application
def initialize
synopsis "[-d] [-s [opt_arg]] [-o req_arg]"
short_description "A sample program"
option :names => %w(--short -s),
:arity => [0,1],
:arg_description => "opt_arg",
:opt_found => get_arg,
:opt_not_found => nil

option :names => %w(--offset -o),
:arg_description => "req_arg",
:opt_found => get_args

option :help
option :names => %w(--myflag -m),
:arity => [0,0],
:arg_description => "flag",
:opt_found => get_arg
end

def main
puts "Short arg is=>#{opt["--short"]}<" unless opt["--short"].nil?
puts "Offset arg is=>#{opt["--offset"]}<"
puts "Myarg arg is=>#{opt["--myflag"]}<"
end

end#class App



Steve Litt

12/15/2005 11:23:00 PM

0

On Thursday 15 December 2005 05:50 pm, Jim Freeze wrote:
> On 12/14/05, Steve Litt <slitt@earthlink.net> wrote:
> > I cruised the net, found an example, and turned it into a small
[clip]
> Here is the above code re-writen using CommandLine as
> requested by Steve. It is a fully working example.

NOW I think I understand CommandLine::Application. It's like a
GetoptLong that also gives you a usage() subroutine for free, and
if you change your arguments, usage() automatically changes in
sync. Very nice!

SteveT

Steve Litt
http://www.troublesh...
slitt@troubleshooters.com