opt-simple 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/GPLv2-LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ OptSimple is a utility for parsing command line arguments.
2
+ Copyright (C) 2011 Ethan Stryker
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+
18
+ Questions/Comments on OptSimple can be mailed to Ethan Stryker, e.stryker@gmail.com
data/README ADDED
@@ -0,0 +1,160 @@
1
+ = OptSimple provides a very simple interface to command line parsing.
2
+
3
+ == Description
4
+ Parameter specification, validity checking and argument transformations
5
+ can be put in one place, default parameters are easily set, and an automatic
6
+ usage statement is constructed.
7
+
8
+ There are three methods to define command line parameters:
9
+
10
+ flag - a command line switch with no arguments following (although you can still use flag
11
+ as a synonym for option. But default behavior is to expect no args.)
12
+
13
+ option - an optional command line parameter with one or more arguments
14
+
15
+ argument - a mandatory command line parameter with one or more arguments
16
+
17
+ Inside the blocks in flag, option, and argument a shortcut function called 'set_opt'
18
+ can be used to set an option that will be returned in the options hash.
19
+
20
+ The number of arguments are determined by the 'arity' of the block.
21
+
22
+ The order in which the parameters are defined dictate their order on the command line.
23
+
24
+ User defined help banners, summaries or the whole usage statement can be defined.
25
+
26
+ == Documentation
27
+
28
+ See OptSimple for the API specification
29
+
30
+ == Installation
31
+
32
+ It is recommended to install OptSimple using RubyGems:
33
+
34
+ $ sudo gem install opt-simple
35
+
36
+ == Examples
37
+
38
+ === A very simple example with no error checking. Use at your own risk!
39
+
40
+ require 'opt_simple'
41
+
42
+ defaults = {
43
+ 'max' => 40
44
+ }
45
+
46
+ options,arguments = OptSimple.new(defaults).parse_opts!
47
+
48
+ puts "Options"
49
+ puts options.inspect
50
+
51
+ puts "Arguments"
52
+ puts arguments.inspect
53
+
54
+ puts "ARGV"
55
+ puts ARGV
56
+
57
+
58
+ === An example that provides error checking on ARGV, using all default behavior
59
+
60
+ require 'opt_simple'
61
+
62
+ options,arguments = OptSimple.new.parse_opts! do
63
+ argument "-i","inFile"
64
+ option %w[-p --pattern --glob-pattern], "glob pattern"
65
+ flag "-v","Verbose"
66
+ flag "-whatever"
67
+ end
68
+
69
+ puts "Options"
70
+ puts options.inspect
71
+
72
+ puts "Arguments"
73
+ puts arguments.inspect
74
+
75
+ puts "ARGV"
76
+ puts ARGV
77
+
78
+
79
+ === An example that shows how to use 'set_opt', set the banner string, and add a summary.
80
+
81
+ require 'opt_simple'
82
+
83
+ defaults = {
84
+ "max" => 10
85
+ }
86
+
87
+ options,arguments = OptSimple.new(defaults).parse_opts! do
88
+ banner "USAGE: #{$0}"
89
+ summary "Show how to set a banner and summary."
90
+
91
+ argument "-i","inFile"
92
+ option %w[-m -max --maximum-value],"Maximum val" do |arg|
93
+ set_opt arg.to_i
94
+ end
95
+ end
96
+
97
+ puts "Options"
98
+ puts options.inspect
99
+
100
+ puts "Arguments"
101
+ puts arguments.inspect
102
+
103
+ puts "ARGV"
104
+ puts ARGV
105
+
106
+ === An example that shows that you can easily set your defaults in normal Ruby variables and provide your own help.
107
+
108
+ require 'opt_simple'
109
+
110
+ in_file = nil
111
+ min = 0
112
+ max = 10
113
+ pattern = "*"
114
+
115
+ usage_string = <<-UL
116
+ Usage: $0 [options]
117
+
118
+ -i, --infile FILE
119
+ [--range (min - default #{min}, max - default #{max})]
120
+ [-p, --pattern, --glob-pattern (default #{pattern})]
121
+ [-v (verbose)]
122
+ [-h, --help (help)]
123
+
124
+ UL
125
+
126
+ OptSimple.new.parse_opts! do
127
+ help usage_string
128
+
129
+ argument %w[-i --infile],"inFile" do |arg|
130
+ in_file = arg
131
+ error "inFile must exist and be readable" unless(File.readable?(in_file))
132
+ end
133
+
134
+ option ["--range"], "range: min,max (both >0) default is #{min},#{max}" do | arg1,arg2 |
135
+ min = arg1.to_i
136
+ max = arg2.to_i
137
+
138
+ error "max must be greater than min" unless max > min
139
+ error "both must be >=0" if min < 0
140
+ end
141
+
142
+ option %w[-p --pattern --glob-pattern], "glob pattern, default is #{pattern}" do |arg|
143
+ pattern = arg
144
+ end
145
+
146
+ flag "-v","Verbose"
147
+ end
148
+
149
+ puts "in_file #{in_file}"
150
+ puts "min #{min}"
151
+ puts "max #{max}"
152
+ puts "pattern #{pattern}"
153
+
154
+ puts "ARGV"
155
+ puts ARGV
156
+
157
+ == Questions and/or Comments
158
+
159
+ email {Ethan Stryker}[mailto:e.stryker@gmail.com]
160
+
@@ -0,0 +1,21 @@
1
+ module Test::Unit
2
+ # Used to fix a minor minitest/unit incompatibility in flexmock
3
+ AssertionFailedError = Class.new(StandardError)
4
+
5
+ class TestCase
6
+
7
+ def self.must(name, &block)
8
+ test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
9
+ defined = instance_method(test_name) rescue false
10
+ raise "#{test_name} is already defined in #{self}" if defined
11
+ if block_given?
12
+ define_method(test_name, &block)
13
+ else
14
+ define_method(test_name) do
15
+ flunk "No implementation provided for #{name}"
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
data/lib/opt_simple.rb ADDED
@@ -0,0 +1,369 @@
1
+ =begin rdoc
2
+
3
+ = OptSimple provides a very simple interface to command line parsing.
4
+
5
+ There are three methods to define command line parameters:
6
+
7
+ flag - a command line switch with no arguments following (although you can still use flag
8
+ as a synonym for option. But default behavior is to expect no args.)
9
+
10
+ option - an optional command line parameter with one or more arguments
11
+
12
+ argument - a mandatory command line parameter with one or more arguments
13
+
14
+ Inside the blocks in flag, option, and argument a shortcut function called 'set_opt'
15
+ can be used to set an option that will be returned in the options hash.
16
+
17
+ The number of arguments are determined by the 'arity' of the block.
18
+
19
+ The order in which the parameters are defined dictate their order on the command line.
20
+
21
+ User defined help banners, summaries or the whole usage statement can be defined.
22
+ =end
23
+ class OptSimple
24
+ attr_accessor :args
25
+ attr_reader :mandatory_opts, :optional_opts
26
+
27
+ # default keys should should be strings,
28
+ # args can be any list of strings, but defaults to ARGV
29
+ def initialize(defaults = {},args = ARGV)
30
+ @mandatory_opts = []
31
+ @optional_opts = []
32
+ @parameters = []
33
+ @param_names = {}
34
+ @longest_switch_len = 0
35
+ @options = defaults.dup # not sure if I have to dup this
36
+ @positional_arguments = []
37
+ @args = args
38
+ @banner = "Usage: #{File.basename($0)} [options]"
39
+ @summary = ""
40
+ @help = ""
41
+ end
42
+
43
+ # set the Summary string at the end of the usage statement
44
+ def summary(str)
45
+ @summary = str
46
+ end
47
+
48
+ # provide a user defined help string, and override the auto-generated one
49
+ def help(str)
50
+ @help = str
51
+ end
52
+
53
+ # set the banner to str, overriding the default: "Usage: #{File.basename($0)} [options]"
54
+ def banner(str)
55
+ @banner = str
56
+ end
57
+
58
+ # Parse the options, destructively pulling them out of the args array as it goes.
59
+ # If no block is given, then a default parser with no error checking will be run.
60
+ def parse_opts!(&block)
61
+
62
+ if block_given?
63
+ # call the block to register all the parameters and
64
+ # their corresponding code blocks
65
+ # We use instance_exec so that the API is cleaner.
66
+ begin
67
+ instance_exec(@options,@positional_arguments,&block)
68
+ ensure
69
+ # we are ensuring that the options that occur before any break statement
70
+ # actually get parsed.
71
+
72
+ # add the help option at the end
73
+ option %w[-h --help] ,"(for this help message)"
74
+
75
+ # first look for a call for help
76
+ unless (%w[-h --help] & @args).empty?
77
+ $stdout.puts self.to_s
78
+ exit(0)
79
+ end
80
+
81
+ mandatory_check = mandatory_opts.map {|m| m.switches}
82
+
83
+ if(loc = @args.index('--'))
84
+ #remove the '--', but don't include it w/ positional arguments
85
+ @positional_arguments += @args.slice!(loc..-1)[1..-1]
86
+ end
87
+
88
+ # now actually parse the args, and call all the stored up blocks from the options
89
+ @parameters.each do | parm |
90
+ intersection = @args & parm.switches
91
+ unless intersection.empty?
92
+ loc = @args.index(intersection.first)
93
+
94
+ # remove the flag, but skip it to put it into pieces
95
+ pieces = @args.slice!(loc .. loc + parm.block.arity)[1..-1]
96
+ if pieces.length < parm.block.arity or
97
+ pieces.any? {|p| p.start_with?('-')}
98
+ raise OptSimple::MissingArgument.new "Not enough args following #{intersection.first}",self
99
+ end
100
+
101
+ mandatory_check.delete(parm.switches)
102
+
103
+ begin
104
+ parm.instance_exec(*pieces,&parm.block)
105
+ rescue OptSimple::Error => e
106
+ raise OptSimple::Error.new e.message,self
107
+ end
108
+
109
+ @options.merge!(parm.param_options)
110
+ end
111
+ end
112
+
113
+ unless mandatory_check.empty?
114
+ raise MissingArgument.new "Must set the following parameters: #{mandatory_check.map {|a| a.join(' OR ')}.join(', ')}",self
115
+ end
116
+
117
+ extra_switches = @args.find_all {|a| a.start_with?('-') }
118
+ raise OptSimple::InvalidOption.new "Unknown options: #{extra_switches.join(' ')}",self unless extra_switches.empty?
119
+
120
+ @positional_arguments += @args.slice!(0..-1)
121
+ end
122
+ else
123
+ #parse the @args array by looking for switches/args by regex
124
+ default_arg_parser
125
+ end
126
+ return [@options,@positional_arguments]
127
+ end
128
+
129
+ # Parse the options in a non-destructive way to the args array passed in.
130
+ # If no block is given, then a default parser with no error checking will be run.
131
+ def parse_opts(&block)
132
+ @original_args = @args # do I really need these around?
133
+ @args = @args.dup
134
+ parse_opts! &block
135
+ end
136
+
137
+ # You do not want to call this function.
138
+ # This provides a default behavior for all switches on the command line if no
139
+ # block is given to parse_opts
140
+ def default_arg_parser
141
+ flag = nil
142
+ @args.each_with_index do |arg,loc|
143
+ if arg == '--'
144
+ # end of flag marker
145
+ @positional_args += @args[i+1 .. -1]
146
+ break
147
+ elsif arg =~ /^-+(.*)/
148
+ # assume flags are boolean
149
+ @options[$1] = true
150
+ flag = $1
151
+ elsif flag
152
+ # unless followed by an arg
153
+ @options[flag] = arg
154
+ flag = nil
155
+ else
156
+ @positional_args << arg
157
+ end
158
+ end
159
+ @args.slice!(0..-1)
160
+ end
161
+
162
+ # Registers an optional parameter, usually with nothing following it.
163
+ # although if the block has arity > 0, we'll be happy to handle
164
+ # it as such.
165
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
166
+ # 'help' provides a description of the parameter
167
+ # and an optional block can do parameter validation/transformation.
168
+ # If no block is given, then the strings specified (after the
169
+ # leading '-'s removed) will be used as keys in the options hash
170
+ # and the values set to true when seen in the args array
171
+ def flag(switches,help="",&block)
172
+ add_parameter(Flag.new(switches,help,&block))
173
+ end
174
+
175
+ # Registers an optional parameter, with one or more argument following it.
176
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
177
+ # 'help' provides a description of the parameter
178
+ # and an optional block can do parameter validation/transformation.
179
+ # If no block is given, then the strings specified (after the
180
+ # leading '-'s removed) will be used as keys in the options hash
181
+ # and the values set to the arg following the switch in the args array.
182
+ def option(switches,help="",&block)
183
+ add_parameter(Option.new(switches,help,&block))
184
+ end
185
+
186
+ # Registers a mandatory parameter, with one or more argument following it.
187
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
188
+ # 'help' provides a description of the parameter
189
+ # and an optional block can do parameter validation/transformation.
190
+ # If no block is given, then the strings specified (after the
191
+ # leading '-'s removed) will be used as keys in the options hash
192
+ # and the values set to the arg following the switch the args array.
193
+ def argument(switches,help="",&block)
194
+ add_parameter(Argument.new(switches,help,&block))
195
+ end
196
+
197
+ # A shortcut for raising an OptSimple::Error exception
198
+ def error(string=nil)
199
+ raise OptSimple::Error.new string
200
+ end
201
+
202
+ # returns the automatic usage statement
203
+ def to_s
204
+ if @help.empty?
205
+ help_str = ""
206
+
207
+ help_str << " MANDATORY ARGS:\n" unless mandatory_opts.empty?
208
+ mandatory_opts.each do | parm |
209
+ help_str << parm.help_str(@longest_switch_len) << "\n"
210
+ end
211
+ help_str << "\n" unless mandatory_opts.empty?
212
+
213
+ help_str << " OPTIONS:\n" unless optional_opts.empty?
214
+ optional_opts.each do | parm |
215
+ help_str << parm.help_str(@longest_switch_len)
216
+
217
+ # check to see if we have any defaults set to help in the help doc
218
+ intersection = @options.keys & parm.names
219
+ if intersection.empty?
220
+ help_str << "\n\n"
221
+ else
222
+ help_str << " (default is #{@options[intersection.first]})\n\n"
223
+ end
224
+ end
225
+ help_str << " SUMMARY:\n\n #{@summary}\n\n" unless @summary.empty?
226
+
227
+ @help = @banner + "\n\n" + help_str
228
+ end
229
+ @help
230
+ end
231
+
232
+ # You probably don't want to call this method.
233
+ # A lower level function that adds a Flag, Option, or Argument,
234
+ def add_parameter(parm)
235
+ total_switch_len = parm.switches.join(', ').length
236
+ @longest_switch_len = total_switch_len if total_switch_len > @longest_switch_len
237
+
238
+ parm.names.each do | n |
239
+ if @param_names.has_key?(n)
240
+ raise OptSimple::Error.new "Command line switch already in use!"
241
+ else
242
+ @param_names[n] = true
243
+ end
244
+
245
+ end
246
+ @parameters << parm
247
+ @mandatory_opts << parm if parm.mandatory?
248
+ @optional_opts << parm if not parm.mandatory?
249
+ end
250
+
251
+ # The base class for command line parameter objects from which Flag,
252
+ # Option and Argument are derived. Provides documentation methods,
253
+ # an 'error method', and the 'set_opt' utility funciton.
254
+ class Parameter
255
+ attr_reader :switches,:param_options,:block
256
+
257
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
258
+ # 'help' provides a description of the parameter
259
+ # and an optional block can do parameter validation/transformation.
260
+ def initialize(switches,help="",&block)
261
+ self.switches = switches
262
+ @help = help
263
+ @block = block
264
+ @param_options = {}
265
+ @names = nil
266
+ end
267
+
268
+ # ensures that the switches is an array. Should be an array of Strings
269
+ def switches=(switches)
270
+ @switches = [switches].flatten
271
+ end
272
+
273
+ # returns a list of the switches without the leading '-'s
274
+ def names
275
+ @names ||= switches.map {|s| s.sub(/^-+/,'')}
276
+ end
277
+
278
+ # a single line that will be put in the overall usage string
279
+ def help_str(switch_len)
280
+ short_parms = @switches.find_all {|st| st.start_with?('-') and st.length == 2 and st[1] != '-'}
281
+ long_parms = @switches.find_all {|st| st.start_with?('--') or (st.start_with?('-') and st.length > 2)}
282
+ other_parms = @switches.find_all {|st| not st.start_with?('-')}
283
+
284
+ sh_str = short_parms.empty? ? " " * 4 : short_parms.first
285
+ long_str = long_parms.join(', ') + other_parms.join(', ')
286
+ sh_str << ', ' unless sh_str =~/^\s+$/ or long_str.empty?
287
+
288
+ " %-#{switch_len}s" % (sh_str + long_str) + " \t#{@help}"
289
+ end
290
+
291
+ # A shortcut for raising an OptSimple::Error exception
292
+ def error(string)
293
+ raise OptSimple::Error.new string
294
+ end
295
+
296
+ # A utility function that sets all the names to the specified value
297
+ # in the param_options hash.
298
+ def set_opt val
299
+ names.each {|n| @param_options[n] = val}
300
+ end
301
+
302
+ # is it mandatory to see this parameter on the command line?
303
+ def mandatory?; false; end
304
+
305
+ end
306
+
307
+ # An optional parameter, usually with nothing following it.
308
+ # although if the block has arity > 0, we'll be happy to handle
309
+ # it as such.
310
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
311
+ # 'help' provides a description of the parameter
312
+ # and an optional block can do parameter validation/transformation.
313
+ # If no block is given, then the strings specified (after the
314
+ # leading '-'s removed) will be used as keys in the options hash
315
+ # and the values set to true when seen in the args array
316
+ class Flag < Parameter
317
+ def initialize(switches,help="",&block)
318
+ super(switches,help,&block)
319
+ unless block_given?
320
+ @block = Proc.new { names.each {|n| @param_options[n] = true}}
321
+ end
322
+ end
323
+ end
324
+
325
+ # An optional parameter, with one or more argument following it.
326
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
327
+ # 'help' provides a description of the parameter
328
+ # and an optional block can do parameter validation/transformation.
329
+ # If no block is given, then the strings specified (after the
330
+ # leading '-'s removed) will be used as keys in the options hash
331
+ # and the values set to the arg following the switch in the args array.
332
+ class Option < Parameter
333
+ def initialize(switches,help="",&block)
334
+ super(switches,help,&block)
335
+ unless block_given?
336
+ @block = Proc.new {|arg| names.each {|n| @param_options[n] = arg}}
337
+ end
338
+ end
339
+ end
340
+
341
+ # A mandatory parameter, with one or more argument following it.
342
+ # 'switches' can be a String or an Array of Strings, and specifies the switches expected on the CL.
343
+ # 'help' provides a description of the parameter
344
+ # and an optional block can do parameter validation/transformation.
345
+ # If no block is given, then the strings specified (after the
346
+ # leading '-'s removed) will be used as keys in the options hash
347
+ # and the values set to the arg following the switch the args array.
348
+ class Argument < Option
349
+ def mandatory?; true; end
350
+ end
351
+
352
+ # A general error in the options
353
+ class Error < Exception
354
+ def initialize(string,option_obj=nil)
355
+ super("#{string}\n#{option_obj.to_s}")
356
+ set_backtrace []
357
+ end
358
+ end
359
+
360
+ # An exception that is thrown if an unspecified parameter
361
+ # is used on the command line
362
+ class InvalidOption < Error;end
363
+
364
+ # An exception thrown if a mandatory parameter is not
365
+ # used on the command line
366
+ class MissingArgument < Error;end
367
+
368
+ end
369
+
@@ -0,0 +1,21 @@
1
+ module Test::Unit
2
+ # Used to fix a minor minitest/unit incompatibility in flexmock
3
+ AssertionFailedError = Class.new(StandardError)
4
+
5
+ class TestCase
6
+
7
+ def self.must(name, &block)
8
+ test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
9
+ defined = instance_method(test_name) rescue false
10
+ raise "#{test_name} is already defined in #{self}" if defined
11
+ if block_given?
12
+ define_method(test_name, &block)
13
+ else
14
+ define_method(test_name) do
15
+ flunk "No implementation provided for #{name}"
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ require 'opt_simple'
2
+ require 'test/unit'
3
+ require 'test_unit_extensions'
4
+
5
+ class ArglistTest < Test::Unit::TestCase
6
+ def setup
7
+ @args = %w[infile1 -v infile2 -o out.txt infile3 -- -infile4 infile5]
8
+ @os = OptSimple.new({},@args)
9
+ @block = Proc.new {
10
+ flag '-v'
11
+ argument '-o'
12
+ }
13
+ end
14
+
15
+ must "put all args after the dash dash in the pos argument list" do
16
+ options,arguments = @os.parse_opts &@block
17
+ assert arguments.include? '-infile4' and arguments.include? 'infile5'
18
+ end
19
+
20
+ must "return all positional args in the arguments list" do
21
+ options,arguments = @os.parse_opts &@block
22
+ assert_equal arguments.sort,%w[infile1 infile2 infile3 -infile4 infile5].sort
23
+ end
24
+
25
+ must "empty out ARGV when using parse_opts!" do
26
+ arg_copy = @args.dup
27
+ @os.parse_opts! &@block
28
+ assert @args.empty?
29
+ end
30
+
31
+ must "preserve ARGV when using parse_opts" do
32
+ arg_copy = @args.dup
33
+ @os.parse_opts &@block
34
+
35
+ assert_equal @args.sort,arg_copy.sort
36
+ end
37
+
38
+ end
data/test/test_help.rb ADDED
@@ -0,0 +1,45 @@
1
+ require 'opt_simple'
2
+ require 'test/unit'
3
+ require 'test_unit_extensions'
4
+
5
+ class TestHelpStatement < Test::Unit::TestCase
6
+
7
+ must "add default info to help string" do
8
+ defaults = {
9
+ 'a' => 1000
10
+ }
11
+ os = OptSimple.new(defaults)
12
+ os.add_parameter(OptSimple::Option.new '-a' )
13
+
14
+ assert os.to_s =~/default.*#{defaults['a']}/
15
+ end
16
+
17
+ must "order help according to specification order" do
18
+ os = OptSimple.new({},['-h'])
19
+ os.add_parameter(OptSimple::Option.new '-a')
20
+ os.add_parameter(OptSimple::Flag.new '-b')
21
+ os.add_parameter(OptSimple::Option.new '-c')
22
+ os.add_parameter(OptSimple::Argument.new '-x')
23
+ os.add_parameter(OptSimple::Argument.new '-y')
24
+ os.add_parameter(OptSimple::Argument.new '-z')
25
+
26
+ assert os.to_s.match(Regexp.new("\-x.*\-y.*\-z.*\-a.*\-b.*\-c.*",Regexp::MULTILINE))
27
+ end
28
+
29
+ must "allow user defined help statements" do
30
+ my_help = "Totally irrelevant"
31
+ os = OptSimple.new({},['-h'])
32
+ os.add_parameter(OptSimple::Option.new '-a')
33
+ os.add_parameter(OptSimple::Flag.new '-b')
34
+ os.help my_help
35
+
36
+ assert os.to_s == my_help
37
+ end
38
+
39
+ must "provide user specified summary statement in help" do
40
+ os = OptSimple.new({},['-h'])
41
+ os.add_parameter(OptSimple::Option.new '-a')
42
+ os.summary "My summary"
43
+ assert os.to_s.match(Regexp.new("My summary",Regexp::MULTILINE))
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ require 'opt_simple'
2
+ require 'test/unit'
3
+ require 'test_unit_extensions'
4
+
5
+ class TestHelpStatement < Test::Unit::TestCase
6
+
7
+ must "disallow name collisions in argument spec" do
8
+ assert_raise(OptSimple::Error) { OptSimple.new.parse_opts! {option %w[-a --awesome]; flag '-awesome' } }
9
+ end
10
+
11
+ must "raise error when unknown option is given" do
12
+ os = OptSimple.new({},['-not-specified'])
13
+ assert_raise(OptSimple::InvalidOption) { os.parse_opts! { option %w[-a --awesome] } }
14
+ end
15
+
16
+ must "raise error when not enough arguments are given" do
17
+ os = OptSimple.new({},['-a'])
18
+ assert_raise(OptSimple::MissingArgument) do
19
+ os.parse_opts! do
20
+ option '-a' do |arg|
21
+ nil
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ end
28
+
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opt-simple
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.1
5
+ platform: ruby
6
+ authors:
7
+ - Ethan Stryker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2011-03-04 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: " Parameter specification, validity checking and argument transformations \n can be put in one place, default parameters are easily set, and an \n automatic usage statement is constructed.\n"
17
+ email: e.stryker@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/test_unit_extensions.rb
26
+ - lib/opt_simple.rb
27
+ - test/test_help.rb
28
+ - test/test_usage.rb
29
+ - test/test_arglist.rb
30
+ - extensions/test_unit_extensions.rb
31
+ - README
32
+ - GPLv2-LICENSE
33
+ has_rdoc: true
34
+ homepage: http://opt-simple.rubyforge.org/
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project: opt-simple
57
+ rubygems_version: 1.3.5
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: A simple and elegant command line option parser.
61
+ test_files: []
62
+