getopt 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ == 4-Nov-2005 - 1.3.0
2
+ * Added the Getopt::Long class (long.rb). This is a complete revamp of the
3
+ old getoptlong package, with ideas tossed in from Perl's Getopt::Long
4
+ package. See the README and example script for more detail.
5
+ * Added an example, and renamed the "test_std.rb" example to "example_std.rb".
6
+ * Added lots of documentation to the README file.
7
+ * Updated the MANIFEST, test suite, etc.
8
+
1
9
  == 24-Oct-2005 - 1.2.0
2
10
  * Altered the way multiple occurrences of the same switch are handled, for
3
11
  those switches that accept arguments.
data/MANIFEST CHANGED
@@ -1,10 +1,15 @@
1
1
  CHANGES
2
2
  MANIFEST
3
+ README
3
4
  install.rb
4
5
  getopt.gemspec
5
6
 
6
- examples/test_std.rb
7
+ examples/example_std.rb
8
+ examples/example_long.rb
7
9
 
8
10
  lib/getopt/std.rb
11
+ lib/getopt/long.rb
9
12
 
10
- test/tc_getopt_std.rb
13
+ test/tc_getopt_std.rb
14
+ test/tc_getopt_long.rb
15
+ test/ts_all.rb
data/README CHANGED
@@ -1,36 +1,51 @@
1
1
  == Description
2
- Implements a simple Getopt::Std class for command line parsing. It will
3
- eventually add a drop-in replacement for getopt-long as well.
2
+ Implements a simple Getopt::Std class for command line parsing, as well
3
+ as a Getopt::Long class for more advanced command line parsing.
4
4
 
5
5
  == Prerequisites
6
6
  Ruby 1.8.0 or later.
7
7
 
8
8
  == Installation
9
9
  === Standard Installation
10
- ruby test/tc_getopt_std.rb
10
+ ruby test/ts_all.rb
11
11
  ruby install.rb
12
+
12
13
  === Gem Installation
13
- ruby test/tc_getopt_std.rb
14
+ ruby test/ts_all.rb
14
15
  ruby getopt.gemspec
15
16
  gem install getopt-x-y-z.gem # Where x-y-z is a version
16
17
 
17
18
  == Synopsis
18
- require "getopt/std"
19
-
20
- # Look for -o with argument, and -I and -D boolean arguments
21
- opt = Getopt::Std.getopts("o:ID")
19
+ === Getopt::Std
20
+ require "getopt/std"
22
21
 
23
- if opt["I"]
24
- # Do something if -I passed
22
+ # Look for -o with argument, and -I and -D boolean arguments
23
+ opt = Getopt::Std.getopts("o:ID")
24
+
25
+ if opt["I"]
26
+ # Do something if -I passed
25
27
 
26
- if opt["D"]
27
- # Do something if -D passed
28
+ if opt["D"]
29
+ # Do something if -D passed
28
30
 
29
- if opt["o"]
30
- case opt["o"]
31
- # blah, blah, blah
32
- end
33
- end
31
+ if opt["o"]
32
+ case opt["o"]
33
+ # blah, blah, blah
34
+ end
35
+ end
36
+
37
+ === Getopt::Long
38
+ require "getopt/long"
39
+ opt = Getopt::Long.getopts(
40
+ ["--foo", "-f", BOOLEAN],
41
+ ["--bar", "-b", REQUIRED]
42
+ )
43
+
44
+ if opt["foo"]
45
+ # Do something if --foo or -f passed
46
+
47
+ if opt["b"]
48
+ # Do something if --bar or -b passed
34
49
 
35
50
  == Class Methods
36
51
  Std.getopts(switches)
@@ -44,10 +59,60 @@ Std.getopts(switches)
44
59
  In the event that a switch that accepts an argument appears multiple times
45
60
  the value for that key becomes an array of values.
46
61
 
62
+ Long.getopts(switches)
63
+ Takes an array of switches beginning with "--" followed by one or more
64
+ characters, or "-w" followed by a single character. The type of argument,
65
+ if any, can be specified as BOOLEAN, OPTIONAL, REQUIRED or INCREMENT.
66
+
67
+ The array should be in the form:
68
+
69
+ ["--long", "-l", OPTION]
70
+
71
+ Note that only the long form is required. If the short switch is not
72
+ specified, it will automatically be set to the first letter of the long
73
+ switch.
74
+
75
+ If the argument type is not specified, the default is BOOLEAN.
76
+
77
+ For the truly lazy, you can also pass a string of long switches (with
78
+ no short switches or argument types).
79
+
80
+ See the 'examples' directory for more examples.
81
+
82
+ == Getopt::Long argument types
83
+ REQUIRED
84
+ If the option is specified on the command line, it must be followed by
85
+ a non-blank argument. This argument cannot be another switch. If this
86
+ switch appears multiple times, the values are collected into an array.
87
+
88
+ BOOLEAN
89
+ If the option is specified on the command line, it's value is set to true.
90
+ It must not be followed by a non-blank argument, excluding other switches.
91
+ Attempting to pass a boolean switch more than once will raise an error.
92
+
93
+ OPTIONAL
94
+ If the option is specified on the command line, it may or may not accept
95
+ an argument, excluding other valid switches. If an argument is present,
96
+ it's value is set to that argument. If an argument is not present, it's
97
+ value is set to nil.
98
+
99
+ INCREMENT
100
+ If the option is specified on the command line, its value is incremented
101
+ by one for each appearance on the command line, or set to 1 if it appears
102
+ only once.
103
+
47
104
  == Future Plans
48
- * Add a replacement for Getopt::Long.
49
-
105
+ Add support for negatable options so that you can do "--no-foo", for
106
+ example.
107
+
108
+ Add support for numeric types, so that you don't have to manually convert
109
+ strings to numbers.
110
+
111
+ Allow shortcut characters for the option types, e.g. "?" for BOOLEAN, "+"
112
+ for INCREMENT, etc.
113
+
50
114
  == Known Bugs
115
+ === Getopt::Std
51
116
  You cannot squish switches that require arguments with the argument itself.
52
117
  For example, if you do Getopt::Std.getopts("o:ID"), it will not parse
53
118
  "-IDohello" properly. Instead, you must do "-IDo hello". Or, you can just
@@ -56,6 +121,33 @@ Std.getopts(switches)
56
121
  If you find any other bugs, please log them on the project
57
122
  page at http://www.rubyforge.org/projects/shards.
58
123
 
124
+ == Other Issues
125
+ Neither of the classes attempts to be POSIX compliant in any way, shape
126
+ or form. And I don't care!
127
+
128
+ == Notes From the Author
129
+ My main gripe with the getoptlong library currently in the standard library
130
+ is that it doesn't return a hash, yet gives you partial hash behavior. This
131
+ was both confusing and annoying, since the first thing I (and everyone else)
132
+ does is collect the results into a hash for later processing.
133
+
134
+ My main gripe with the optparse library (also in the standard library) is
135
+ that it treats command line processing like event processing. It's too
136
+ complex, when 90% of the time all you want to do is slurp the command line
137
+ options into a hash.
138
+
139
+ So, I did something utterly novel with this library. I collected the command
140
+ line options ... (wait for it) ... into a hash! Then I give that hash to
141
+ you, aliases and all. I did get some ideas from Perl's Getopt::Long library,
142
+ but this is in no way a port of that module (which supports POSIX parsing, GNU
143
+ parsing, more option types, etc). My goal was to provide the functionality
144
+ that I felt would cover the vast majority of common cases, yet still provide
145
+ a little extra spice with switch types (REQUIRED, OPTIONAL, etc).
146
+
147
+ There are a few extra things I plan to add (see the 'Future Plans' above) but
148
+ I do not plan on this library ever becoming as feature rich as, say, Perl's
149
+ Getopt::Long module.
150
+
59
151
  == Warranty
60
152
  This package is provided "as is" and without any express or
61
153
  implied warranties, including, without limitation, the implied
@@ -0,0 +1,119 @@
1
+ #######################################################
2
+ # tc_getopt_long.rb
3
+ #
4
+ # Test suite for the getopt-long package.
5
+ #######################################################
6
+ base = File.basename(Dir.pwd)
7
+
8
+ if base == "test" || base =~ /getopt/
9
+ Dir.chdir("..") if base == "test"
10
+ $LOAD_PATH.unshift(Dir.pwd + "/lib")
11
+ Dir.chdir("test") rescue nil
12
+ end
13
+
14
+ require "test/unit"
15
+ require "getopt/long"
16
+ include Getopt
17
+
18
+ class TC_Getopt_Long < Test::Unit::TestCase
19
+ def setup
20
+ @opts = nil
21
+ end
22
+
23
+ def test_version
24
+ assert_equal("1.3.0", Long::VERSION)
25
+ end
26
+
27
+ def test_constants
28
+ assert_not_nil(BOOLEAN)
29
+ assert_not_nil(OPTIONAL)
30
+ assert_not_nil(REQUIRED)
31
+ assert_not_nil(INCREMENT)
32
+ end
33
+
34
+ def test_getopts_basic
35
+ assert_respond_to(Long, :getopts)
36
+ assert_nothing_raised{
37
+ Long.getopts(["--test"],["--help"],["--foo"])
38
+ }
39
+ assert_nothing_raised{
40
+ Long.getopts(["--test", "-x"],["--help", "-y"],["--foo", "-z"])
41
+ }
42
+ assert_nothing_raised{
43
+ Long.getopts(
44
+ ["--test", "-x", BOOLEAN],
45
+ ["--help", "-y", REQUIRED],
46
+ ["--foo", "-z", OPTIONAL],
47
+ ["--more", "-m", INCREMENT]
48
+ )
49
+ }
50
+ assert_kind_of(Hash, Long.getopts("--test"))
51
+ end
52
+
53
+ def test_getopts_using_equals
54
+ ARGV.push("--foo=hello","-b","world")
55
+ assert_nothing_raised{
56
+ @opts = Long.getopts(
57
+ ["--foo", "-f", REQUIRED],
58
+ ["--bar", "-b", OPTIONAL]
59
+ )
60
+ }
61
+ assert_equal("hello", @opts["foo"])
62
+ assert_equal("hello", @opts["f"])
63
+ assert_equal("world", @opts["bar"])
64
+ assert_equal("world", @opts["b"])
65
+ end
66
+
67
+ def test_getopts_short_switch_squished
68
+ ARGV.push("-f", "hello", "-bworld")
69
+ assert_nothing_raised{
70
+ @opts = Long.getopts(
71
+ ["--foo", "-f", REQUIRED],
72
+ ["--bar", "-b", OPTIONAL]
73
+ )
74
+ }
75
+ assert_equal("hello", @opts["f"])
76
+ assert_equal("world", @opts["b"])
77
+ end
78
+
79
+ def test_getopts_increment_type
80
+ ARGV.push("-m","-m")
81
+ assert_nothing_raised{
82
+ @opts = Long.getopts(["--more", "-m", INCREMENT])
83
+ }
84
+ assert_equal(2, @opts["more"])
85
+ assert_equal(2, @opts["m"])
86
+ end
87
+
88
+ def test_switches_exist
89
+ ARGV.push("--verbose","--test","--foo")
90
+ assert_nothing_raised{ @opts = Long.getopts("--verbose --test --foo") }
91
+ assert_equal(true, @opts.has_key?("verbose"))
92
+ assert_equal(true, @opts.has_key?("test"))
93
+ assert_equal(true, @opts.has_key?("foo"))
94
+ end
95
+
96
+ def test_short_switch_synonyms
97
+ ARGV.push("--verbose","--test","--foo")
98
+ assert_nothing_raised{ @opts = Long.getopts("--verbose --test --foo") }
99
+ assert_equal(true, @opts.has_key?("v"))
100
+ assert_equal(true, @opts.has_key?("t"))
101
+ assert_equal(true, @opts.has_key?("f"))
102
+ end
103
+
104
+ def test_switches_with_required_arguments
105
+ ARGV.push("--foo","1","--bar","hello")
106
+ assert_nothing_raised{
107
+ @opts = Long.getopts(
108
+ ["--foo", "-f", REQUIRED],
109
+ ["--bar", "-b", REQUIRED]
110
+ )
111
+ }
112
+ assert_equal({"foo"=>"1", "bar"=>"hello", "f"=>"1", "b"=>"hello"}, @opts)
113
+ end
114
+
115
+ def teardown
116
+ @opts = nil
117
+ ARGV.clear
118
+ end
119
+ end
@@ -18,7 +18,7 @@ include Getopt
18
18
  class TC_Getopt_Std < Test::Unit::TestCase
19
19
 
20
20
  def test_version
21
- assert_equal("1.2.0", Std::VERSION)
21
+ assert_equal("1.3.0", Std::VERSION)
22
22
  end
23
23
 
24
24
  def test_getopts_basic
data/test/ts_all.rb ADDED
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift(Dir.pwd)
2
+ $LOAD_PATH.unshift(Dir.pwd + "/test")
3
+
4
+ require "tc_getopt_std"
5
+ require "tc_getopt_long"
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: getopt
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.2.0
7
- date: 2005-10-24 00:00:00 -06:00
6
+ version: 1.3.0
7
+ date: 2005-11-04 00:00:00 -07:00
8
8
  summary: Getopt::Std for Ruby
9
9
  require_paths:
10
10
  - lib
@@ -32,9 +32,11 @@ files:
32
32
  - CHANGES
33
33
  - MANIFEST
34
34
  - README
35
+ - test/tc_getopt_long.rb
35
36
  - test/tc_getopt_std.rb
37
+ - test/ts_all.rb
36
38
  test_files:
37
- - test/tc_getopt_std.rb
39
+ - test/ts_all.rb
38
40
  rdoc_options: []
39
41
  extra_rdoc_files:
40
42
  - README